diff --git a/.gitignore b/.gitignore index f67727febb..f65245c021 100644 --- a/.gitignore +++ b/.gitignore @@ -195,6 +195,7 @@ Temporary Items #Visual studio stuff *.vscode/* +!/.vscode/extensions.json tools/MapAtmosFixer/MapAtmosFixer/obj/* tools/MapAtmosFixer/MapAtmosFixer/bin/* diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..ca0e6ad997 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "gbasood.byond-dm-language-support", + "platymuus.dm-langclient", + "EditorConfig.EditorConfig" + ] +} diff --git a/Dockerfile b/Dockerfile index ad347079cd..5f755e3dc1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM tgstation/byond:513.1490 as base +FROM tgstation/byond:513.1503 as base FROM base as build_base diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/budget.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/budget.dmm new file mode 100644 index 0000000000..e241b776e1 --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/budget.dmm @@ -0,0 +1,1554 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"aW" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"er" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fq" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gF" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 50 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ha" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"il" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"iB" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"jP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ku" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mP" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"mW" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"nZ" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pL" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qc" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qH" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rU" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sU" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tb" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tf" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"zw" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/mineral/plasma{ + amount = 50 + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zS" = ( +/turf/open/space/basic, +/area/space) +"AC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bq" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Bz" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Cb" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Cx" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"EW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"HN" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jb" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jq" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kf" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kl" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"KL" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Le" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"LS" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Nz" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ou" = ( +/obj/machinery/power/smes{ + capacity = 9e+006; + charge = 10000 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"OX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Rs" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"TC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"TS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Us" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UD" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"VN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"WB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ys" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZT" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +tw +yf +yf +tw +yf +yf +tw +yf +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +YZ +YZ +tw +zS +zS +zS +zS +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +MP +MP +MP +iD +iD +iD +MP +tw +yf +tw +yf +yf +Rh +yf +yf +zS +zS +zS +zS +"} +(11,1,1) = {" +oC +GB +tf +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +tw +tw +tw +tw +aW +YZ +aW +yf +zS +zS +zS +zS +"} +(12,1,1) = {" +cS +dw +lG +Ok +ha +Ok +Ok +Hn +Ok +Ok +OX +Ok +Ok +MP +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(13,1,1) = {" +ME +dw +lG +LS +nZ +LS +KL +mP +KL +LS +nZ +LS +KL +iD +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(14,1,1) = {" +Ne +Rs +lG +Nz +jP +Nz +sU +Bz +sU +Nz +jP +Nz +sU +iD +tw +tw +tw +tw +YZ +Oj +YZ +Rh +zS +zS +zS +zS +"} +(15,1,1) = {" +MP +dw +lG +Nz +jP +Nz +sU +Bz +sU +Nz +jP +Nz +sU +iD +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(16,1,1) = {" +MP +dw +lG +WB +Jq +WB +UD +Cx +UD +WB +Jq +WB +UD +MP +tw +tw +tw +tw +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(17,1,1) = {" +oS +EW +sj +er +tb +er +Ys +xh +Ys +er +tb +er +il +iD +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(18,1,1) = {" +iD +fq +oa +qH +iB +qH +qc +Bq +qc +qH +iB +Us +Ok +iD +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(19,1,1) = {" +oS +Cb +Kf +rU +kz +rU +TS +pL +TS +rU +kz +rU +QQ +iD +tw +tw +tw +tw +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(20,1,1) = {" +MP +Cb +AC +WB +mW +WB +Kl +Cx +Kl +WB +mW +WB +Kl +MP +tw +tw +tw +tw +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(21,1,1) = {" +MP +Cb +AC +Nz +VN +Nz +Pi +Bz +Pi +Nz +VN +Nz +Pi +iD +tw +yf +tw +yf +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(22,1,1) = {" +iD +Cb +AC +Nz +VN +Nz +Pi +Bz +Pi +Nz +VN +Nz +Pi +iD +tw +tw +tw +tw +YZ +Oj +YZ +Rh +zS +zS +zS +zS +"} +(23,1,1) = {" +iD +Cb +AC +Ou +HN +Ou +ku +Jb +ku +Ou +HN +Ou +ku +iD +tw +tw +tw +tw +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(24,1,1) = {" +mH +Cb +AC +Ok +TC +Ok +Ok +hS +Ok +Ok +TC +Ok +Ok +MP +tw +tw +tw +tw +YZ +Oj +YZ +yf +zS +zS +zS +zS +"} +(25,1,1) = {" +iD +mU +AC +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +iD +tw +yf +tw +yf +YZ +YZ +YZ +yf +zS +zS +zS +zS +"} +(26,1,1) = {" +wt +av +kA +qo +MP +MP +MP +Ok +Ok +Ok +Ok +Ok +Ok +iD +tw +yf +tw +yf +yf +Rh +yf +yf +zS +zS +zS +zS +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +Ok +Ok +Ok +Ok +Ok +Ok +Ok +iD +tw +yf +tw +tw +Rh +Rh +Rh +Rh +zS +zS +zS +zS +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +Ok +zw +zw +zw +zw +zw +MP +tw +yf +Rh +yf +Rh +Oj +YZ +yf +zS +zS +zS +zS +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +MP +MP +MP +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +zS +zS +zS +zS +"} diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/empty.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/empty.dmm new file mode 100644 index 0000000000..6116e6a3b6 --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/empty.dmm @@ -0,0 +1,1119 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"fq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"hK" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"uC" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wS" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"yA" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"zS" = ( +/turf/open/space/basic, +/area/space) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Le" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"LS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"WB" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZT" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +tw +yf +yf +tw +yf +yf +tw +yf +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +Oj +YZ +yf +yf +yf +yf +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +Le +tw +Le +Le +tw +Le +Le +tw +Le +Le +Le +YZ +Oj +YZ +yf +yf +Rh +yf +yf +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +tw +tw +tw +tw +tw +tw +tw +tw +tw +Rh +Rh +YZ +YZ +YZ +tw +Rh +Rh +Rh +yf +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +MP +MP +MP +MP +MP +MP +MP +tw +yf +yf +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(11,1,1) = {" +oC +GB +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +MP +MP +MP +MP +MP +MP +MP +yf +WB +YZ +WB +yf +"} +(12,1,1) = {" +cS +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(13,1,1) = {" +ME +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(14,1,1) = {" +Ne +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +Rh +"} +(15,1,1) = {" +MP +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(16,1,1) = {" +MP +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +yf +"} +(17,1,1) = {" +oS +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(18,1,1) = {" +iD +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(19,1,1) = {" +oS +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +yf +"} +(20,1,1) = {" +MP +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +yf +"} +(21,1,1) = {" +MP +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +YZ +Oj +YZ +yf +"} +(22,1,1) = {" +iD +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +Rh +"} +(23,1,1) = {" +iD +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +yf +"} +(24,1,1) = {" +mH +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +Rh +YZ +Oj +YZ +yf +"} +(25,1,1) = {" +iD +mU +Ok +ou +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +MP +MP +MP +MP +MP +MP +MP +yf +YZ +YZ +YZ +yf +"} +(26,1,1) = {" +wt +av +kA +qo +EL +MP +MP +Ok +Ok +Ok +Ok +Ok +qc +fq +LS +Hn +dw +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +Ok +Ok +Ok +Ok +Ok +Ok +Ok +MP +dw +dw +dw +Rh +Rh +Rh +Rh +tw +Rh +Rh +Rh +Rh +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +Ok +Ok +Ok +Ok +Ok +Ok +MP +yf +yf +Rh +yf +Rh +Oj +YZ +yf +yf +Rh +yf +yf +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +MP +MP +MP +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +yf +Rh +yf +zS +"} diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm new file mode 100644 index 0000000000..96e28fbc6f --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm @@ -0,0 +1,1423 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/button/door{ + dir = 4; + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_x = 24; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cB" = ( +/obj/machinery/button/door{ + dir = 1; + id = "engsm"; + name = "Radiation Shutters Control"; + req_access_txt = "10" + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dz" = ( +/turf/open/space/basic, +/area/space/nearstation) +"dN" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eA" = ( +/obj/structure/table, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fh" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"fH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"gf" = ( +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/item/pipe_dispenser, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jH" = ( +/obj/structure/sign/warning/radiation/rad_area, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"kh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kK" = ( +/turf/closed/wall, +/area/engine/engineering) +"la" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lY" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/engine/engineering) +"me" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"nW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"qH" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/obj/structure/cable/yellow, +/turf/open/floor/engine, +/area/engine/engineering) +"rj" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"rT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"tT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/button/door{ + dir = 4; + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_x = 24; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"uG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wt" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"xg" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xJ" = ( +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/glasses/meson/engine, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yU" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/engine/engineering) +"zW" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/button/door{ + dir = 8; + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_x = -24; + req_access_txt = "10" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Aw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Bb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" + }, +/obj/machinery/camera/emp_proof{ + c_tag = "Particle Accelerator"; + network = list("ss13","engine") + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Bh" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"BG" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Ch" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Eu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ER" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ES" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/wrench, +/turf/open/floor/plating, +/area/engine/engineering) +"FK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"FY" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/obj/item/geiger_counter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"HQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/button/door{ + dir = 8; + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_x = -24; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"HW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"In" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Js" = ( +/obj/structure/closet/crate/engineering{ + name = "Antimatter Engine Crate" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_shielding_container, +/obj/item/am_containment, +/obj/item/am_containment, +/obj/item/am_containment, +/obj/item/am_containment, +/obj/machinery/power/am_control_unit, +/turf/open/floor/plating, +/area/engine/engineering) +"JC" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"JZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) +"Lr" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"LO" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"LV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Mi" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Mn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"MD" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"MJ" = ( +/turf/open/space/basic, +/area/space) +"No" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Nz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"NS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Og" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Ox" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"Pg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Qk" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Ra" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"Rp" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Si" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SD" = ( +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"Tr" = ( +/obj/structure/sign/warning/radiation/rad_area, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Um" = ( +/turf/template_noop, +/area/template_noop) +"Wf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"Ww" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"WI" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"WQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"WX" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Yd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"YY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Zb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"Zx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"Zz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZF" = ( +/obj/effect/turf_decal/box/red, +/turf/open/floor/engine, +/area/engine/engineering) +"ZK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) + +(1,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(2,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(3,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(4,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(5,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(6,1,1) = {" +Um +Um +Um +Um +Um +Um +Um +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +Um +Um +Um +Um +Um +"} +(7,1,1) = {" +Um +Um +Um +Um +kK +kK +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(8,1,1) = {" +Um +Um +Lr +la +kK +Ra +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(9,1,1) = {" +Um +Um +fh +fh +In +ER +yU +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(10,1,1) = {" +Um +Si +fh +ZY +jH +Ch +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(11,1,1) = {" +xJ +gf +fh +dN +YY +MD +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(12,1,1) = {" +LO +Eu +Pg +cP +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(13,1,1) = {" +NS +xx +fh +zW +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(14,1,1) = {" +yo +me +aT +Aw +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(15,1,1) = {" +jH +FK +Ch +wt +Ch +rj +rj +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(16,1,1) = {" +Ch +ES +ZK +ZK +zZ +ZK +fH +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(17,1,1) = {" +wt +Zz +Wf +Ox +Ox +Zb +lY +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(18,1,1) = {" +cB +Bb +qP +ZF +ZF +Yd +lY +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(19,1,1) = {" +wt +eJ +Zx +Mn +Mn +WQ +lY +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(20,1,1) = {" +Ch +Js +No +No +tT +No +LV +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(21,1,1) = {" +jH +Nz +Ch +wt +Ch +rj +rj +Og +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(22,1,1) = {" +fh +WX +HQ +Aw +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(23,1,1) = {" +fh +kh +fh +fh +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(24,1,1) = {" +fh +kh +uG +cP +JC +WI +rj +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(25,1,1) = {" +eA +FY +mB +Rp +HW +Mi +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(26,1,1) = {" +fh +kh +mB +ZY +Tr +rT +rT +Qk +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(27,1,1) = {" +Um +Um +Um +fh +Ww +qH +yU +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(28,1,1) = {" +Um +Um +Um +fh +JZ +BG +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} +(29,1,1) = {" +Um +Um +Um +fh +JZ +kK +Ch +dz +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +MJ +"} diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm new file mode 100644 index 0000000000..42ed0035ce --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm @@ -0,0 +1,2743 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"aG" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bw" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"bO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cK" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"di" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/engine/engineering) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"do" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ds" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"dZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eh" = ( +/obj/structure/chair/office/dark, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ek" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/door/poddoor{ + id = "TEG_Vent" + }, +/turf/open/space, +/area/engine/engineering) +"en" = ( +/obj/machinery/button/ignition/incinerator{ + id = "TEG_igniter"; + pixel_x = -5; + pixel_y = 10 + }, +/obj/machinery/button/door{ + id = "TEG_Vent"; + pixel_x = 6; + pixel_y = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"ev" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"eD" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = 26 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating, +/area/engine/engineering) +"fF" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"fO" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"go" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gq" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"gA" = ( +/obj/machinery/igniter{ + id = "TEG_igniter" + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"hz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"hT" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ij" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_y = -32 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"iP" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"iZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jc" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"jg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"jm" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space, +/area/space/nearstation) +"jN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ki" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"kB" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kF" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kH" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space, +/area/space/nearstation) +"kK" = ( +/obj/machinery/vending/cola/random, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26; + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"kS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"le" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lw" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lD" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/machinery/camera{ + c_tag = "TEG - South East"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"lI" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mj" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mT" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"mU" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"nc" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"nk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"nD" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"nL" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"of" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oD" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oP" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oQ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pY" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qc" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qn" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qt" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"qv" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"qx" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"qJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/engine/engineering) +"qN" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil/white{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rh" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"rr" = ( +/obj/item/bot_assembly/firebot, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"sD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"sN" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tl" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 8 + }, +/turf/open/floor/circuit/green, +/area/engine/engineering) +"tv" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tN" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"tQ" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uw" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uy" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uB" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"uM" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"vf" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vq" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/mixed{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera{ + c_tag = "TEG - South West"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"vU" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) +"wk" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wv" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wz" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wR" = ( +/obj/machinery/atmospherics/pipe/manifold4w/dark/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"xD" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Engine" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Loop" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"yn" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"yN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"yX" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"zx" = ( +/obj/structure/table/wood, +/obj/item/electronics/apc, +/obj/item/electronics/apc{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zG" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"zS" = ( +/turf/open/space/basic, +/area/space) +"Am" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"An" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold{ + dir = 4 + }, +/turf/open/floor/circuit/green, +/area/engine/engineering) +"As" = ( +/obj/structure/sign/warning/fire, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"At" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"AT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "TEG - North Center"; + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"AX" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Br" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Bs" = ( +/obj/structure/table/reinforced, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil/white{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/multitool, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera{ + c_tag = "TEG - North West"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Bz" = ( +/obj/machinery/atmospherics/components/unary/portables_connector, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"BI" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"BN" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"BT" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/engine/engineering) +"BY" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/sign/warning/securearea{ + pixel_x = 32 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"CS" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Dv" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DI" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"DS" = ( +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ef" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Eo" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"EH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"EI" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"EN" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"EW" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Fi" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "TEG - East"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Fk" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FW" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FY" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/gloves/color/black, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Gb" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Go" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GR" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"GX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/engine/engineering) +"He" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Hp" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plasteel, +/area/engine/engineering) +"HF" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Im" = ( +/obj/machinery/power/generator, +/obj/structure/cable/yellow, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/circuit/green, +/area/engine/engineering) +"In" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/engine/engineering) +"IA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"IP" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/engine/engineering) +"IW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jd" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/orange/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Jj" = ( +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Js" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"JR" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/structure/extinguisher_cabinet{ + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kl" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/meter, +/obj/machinery/camera{ + c_tag = "TEG - South Center"; + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kx" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/floor/plasteel, +/area/engine/engineering) +"KA" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ld" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Le" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"Lq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) +"Lw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"LD" = ( +/obj/machinery/atmospherics/components/trinary/mixer, +/turf/open/floor/plasteel, +/area/engine/engineering) +"LS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Mf" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"MQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Ng" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Nh" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Nz" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NP" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"OK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"OP" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel, +/area/engine/engineering) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pz" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"PK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Qr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_x = -26 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Qu" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"Qy" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QH" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"QS" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Rl" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Rz" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"RD" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"RK" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"RQ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Sw" = ( +/obj/machinery/atmospherics/components/unary/portables_connector, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SB" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 26; + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SE" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ST" = ( +/obj/structure/chair/office/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"SX" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/window/westright{ + dir = 2; + name = "Engineering Desk"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"TE" = ( +/obj/structure/closet/crate/internals, +/turf/open/floor/plasteel, +/area/engine/engineering) +"TH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"TN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"TS" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ue" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Um" = ( +/obj/machinery/atmospherics/components/binary/valve/digital, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Uq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UQ" = ( +/obj/machinery/portable_atmospherics/canister/toxins, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/window/westright{ + dir = 2; + name = "Engineering Desk"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UT" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"UY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Vi" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"Vs" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Output Release" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"VV" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "TEG - North" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Wc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Wm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"WB" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"Xe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Xg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Xs" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/book/manual/wiki/engineering_guide, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"XD" = ( +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Output Release" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera{ + c_tag = "TEG - West"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"XK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"XM" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"XP" = ( +/obj/machinery/atmospherics/pipe/manifold4w/cyan/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"XW" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Yh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Yu" = ( +/obj/structure/rack, +/obj/item/crowbar/large, +/obj/item/flashlight, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/extinguisher_cabinet{ + dir = 4; + pixel_y = -27 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/engineering) +"YO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YP" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YQ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YR" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plasteel, +/area/engine/engineering) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Zs" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Zu" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Zv" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/sign/warning/securearea{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ZC" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/vacuum, +/area/engine/engineering) +"ZT" = ( +/turf/template_noop, +/area/template_noop) +"ZY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +sw +jm +sw +Xg +uM +Xg +Xg +uM +jg +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +qx +Qu +qx +kH +Vi +uM +uM +Vi +vU +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +Nz +Qu +Nz +EW +Vi +Xg +Xg +Vi +jg +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +tw +qx +Qu +qx +kH +Vi +uM +uM +Vi +vU +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +Le +aG +Qu +Nz +EW +Vi +Xg +Xg +Vi +jg +Le +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +tw +qx +Qu +qx +kH +Vi +uM +uM +Vi +vU +Rh +YZ +Oj +YZ +yf +yf +yf +yf +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +Le +aG +Qu +Nz +EW +Vi +Xg +Xg +Vi +jg +Le +YZ +Oj +YZ +yf +yf +Rh +yf +yf +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +tw +qx +of +vU +kH +Vi +uM +uM +Vi +Lq +Rh +YZ +YZ +YZ +Rh +Rh +Rh +Rh +yf +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +ij +yX +qn +qn +yX +MP +MP +tw +yf +yf +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(11,1,1) = {" +oC +GB +kB +bz +Bs +FY +yn +Qr +Vs +CS +Xe +XD +Yu +ij +MP +MP +MP +MP +MP +MP +MP +Rh +WB +YZ +WB +yf +"} +(12,1,1) = {" +cS +RK +uy +PK +iZ +tf +tf +Bz +XP +mT +Hp +lI +do +MQ +DS +qN +vq +Eo +Mf +BT +MP +yf +YZ +Oj +YZ +yf +"} +(13,1,1) = {" +ME +QS +uB +Ok +Ok +Ok +Ok +Bz +Zu +Wc +Ok +zG +lw +lw +lw +vf +vf +lw +NP +Ef +MP +yf +YZ +Oj +YZ +yf +"} +(14,1,1) = {" +Ne +nL +UQ +Ok +DI +DI +He +Ok +oP +YR +YO +Ok +He +Ok +Ok +PK +Ok +PK +Wc +tv +MP +Rh +YZ +Oj +YZ +Rh +"} +(15,1,1) = {" +iP +wk +go +fF +EI +EI +sn +qc +Nh +ki +An +Rl +Gb +BN +tM +At +At +lw +lw +XK +MP +yf +YZ +Oj +YZ +yf +"} +(16,1,1) = {" +MP +Pz +ds +HF +Ld +Ld +hT +RD +Ng +Ue +Im +YC +hz +EL +EL +pY +BI +Ok +Ok +TE +MP +Rh +YZ +Oj +YZ +yf +"} +(17,1,1) = {" +oS +TN +Wm +ou +KA +KA +Ok +dZ +bO +ev +tl +qb +sH +Kr +JR +sH +sH +sH +sH +Uq +MP +yf +YZ +Oj +YZ +yf +"} +(18,1,1) = {" +iD +YQ +QN +ou +Br +Br +YR +Sw +Js +rf +uD +IW +IW +IW +GX +uw +uw +IW +wC +Pp +MP +yf +YZ +Oj +YZ +yf +"} +(19,1,1) = {" +oS +kd +tP +ou +bI +Ok +Ok +Sw +Js +Bz +sN +Zm +bO +sH +RQ +gq +gq +sH +sH +EH +MP +Rh +YZ +Oj +YZ +yf +"} +(20,1,1) = {" +MP +VV +wz +mn +Rz +fF +AT +Um +Js +Bz +wR +Zm +OK +Ok +OP +rr +kK +Jj +eD +lD +MP +Rh +YZ +Oj +YZ +yf +"} +(21,1,1) = {" +MP +GR +IP +Zs +sD +Jd +EL +YG +AX +PK +cK +Ok +OK +PK +en +MP +MP +MP +MP +MP +fO +Rh +Rh +Oj +YZ +yf +"} +(22,1,1) = {" +iD +TS +SX +ou +vG +Zv +di +qJ +Lw +Xe +aR +ZY +QH +Hp +Kx +kS +oQ +kS +kS +qv +ek +Le +Rh +Oj +YZ +Rh +"} +(23,1,1) = {" +iD +bw +Fk +ou +Ok +FG +UT +kF +jN +wv +LD +wv +mj +SE +le +ZC +nc +gA +Am +XM +ek +Le +Rh +Oj +YZ +yf +"} +(24,1,1) = {" +mH +oD +rh +ou +Ok +tN +Kl +dZ +TH +sH +sH +sH +gq +FW +Kx +kS +BY +kS +IA +nD +ek +Le +Rh +Oj +YZ +yf +"} +(25,1,1) = {" +iD +mU +Wm +xD +qt +In +jc +Yh +PK +Dv +Dv +bO +YP +As +yN +yN +yN +yN +nk +MP +fO +Rh +Rh +YZ +YZ +yf +"} +(26,1,1) = {" +wt +av +kA +qo +MP +MP +MP +UY +eh +Go +Xs +Qy +EN +fq +LS +Hn +dw +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +OP +Ok +eh +zx +XW +ST +Ok +MP +dw +dw +dw +Rh +Rh +Rh +Rh +tw +Rh +Rh +Rh +Rh +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +Ok +SB +Fi +tQ +Ok +BT +MP +yf +yf +Rh +yf +Rh +Oj +YZ +yf +yf +Rh +yf +yf +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +iP +MP +ij +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +yf +Rh +yf +zS +"} diff --git a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm index 75c0434771..fec45c7310 100644 --- a/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm +++ b/_maps/RandomRuins/StationRuins/Lavaland/Mining_Station/Mining_Station_Public_01.dmm @@ -327,6 +327,7 @@ /obj/effect/turf_decal/tile/brown{ dir = 4 }, +/obj/structure/closet/secure_closet/miner, /turf/open/floor/plasteel, /area/mine/production) "fU" = ( @@ -674,6 +675,7 @@ /area/mine/production) "mp" = ( /obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 2; height = 5; @@ -716,13 +718,13 @@ /turf/open/floor/plasteel, /area/mine/laborcamp/security) "mN" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "0-4" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) "nm" = ( @@ -812,6 +814,16 @@ }, /turf/open/floor/plating, /area/mine/production) +"ou" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/plasteel, +/area/mine/production) "ow" = ( /obj/machinery/door/airlock/medical/glass{ name = "Infirmary" @@ -1160,13 +1172,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) -"tJ" = ( -/obj/item/beacon, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/mine/production) "tK" = ( /obj/structure/closet/crate, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, @@ -1569,10 +1574,10 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Bc" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "0-8" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) "Be" = ( @@ -1897,6 +1902,7 @@ /area/mine/laborcamp) "Hk" = ( /obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 3; height = 7; @@ -2226,6 +2232,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/item/beacon, /turf/open/floor/plasteel, /area/mine/production) "KO" = ( @@ -2286,6 +2293,7 @@ /area/mine/living_quarters) "Lb" = ( /obj/docking_port/stationary{ + area_type = /area/lavaland/surface/outdoors; dir = 8; dwidth = 3; height = 10; @@ -2296,10 +2304,10 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Lc" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "0-4" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) "Le" = ( @@ -2370,7 +2378,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/door/airlock/mining/glass{ name = "Processing Area"; - req_access_txt = "48" + req_access_txt = "48"; + security_level = 6 }, /obj/structure/cable{ icon_state = "1-2" @@ -2520,6 +2529,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/closet/secure_closet/miner, /turf/open/floor/plasteel, /area/mine/production) "Nk" = ( @@ -3008,13 +3018,13 @@ /turf/open/floor/plasteel, /area/mine/production) "Vo" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "0-8" }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/production) "Vs" = ( @@ -5458,7 +5468,7 @@ JY JY jJ jJ -JY +VT VT VT wz @@ -5514,8 +5524,8 @@ JY JY JY JY -JY -JY +VT +VT VT VT wz @@ -5569,9 +5579,9 @@ JY JY JY JY -JY -JY -JY +VT +VT +VT VT VT VT @@ -5625,8 +5635,8 @@ JY JY JY JY -JY -JY +VT +VT VT VT VT @@ -5681,8 +5691,8 @@ JY JY JY JY -JY -Lm +VT +VT VT VT VT @@ -5737,8 +5747,8 @@ JY JY JY JY -JY -Lm +VT +VT VT VT VT @@ -5793,8 +5803,8 @@ JY JY JY JY -JY -JY +VT +VT VT VT VT @@ -5848,9 +5858,9 @@ JY Lm VT VT -JY -JY -JY +VT +VT +VT VT VT VT @@ -5906,8 +5916,8 @@ VT VT VT VT -Lm -Lm +VT +VT VT VT Lm @@ -6598,7 +6608,7 @@ VT VT Cd Ed -tJ +Wf II Jo Ed @@ -6661,7 +6671,7 @@ wX Wf YM GN -II +ou Nf mN Aj diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index f29c6afa46..fd0f0a1742 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -620,7 +620,7 @@ /turf/open/space, /area/solar/starboard/fore) "acV" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -635,7 +635,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "acW" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -655,7 +655,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "acX" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -667,7 +667,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "acY" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -684,7 +684,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "adb" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -701,7 +701,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "adc" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -998,7 +998,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aeB" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/construction/mining/aux_base) "aeC" = ( @@ -1722,7 +1722,7 @@ /turf/open/floor/plasteel, /area/construction/mining/aux_base) "ahO" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -1735,7 +1735,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahP" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -1753,7 +1753,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahR" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -1766,7 +1766,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahS" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -1784,7 +1784,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahW" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/light{ @@ -1802,7 +1802,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ahX" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -3055,7 +3055,7 @@ /turf/open/floor/plasteel, /area/security/vacantoffice) "akC" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/security/vacantoffice) "akD" = ( @@ -3485,7 +3485,7 @@ /turf/closed/wall, /area/hallway/secondary/entry) "aly" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/secondary/entry) "alz" = ( @@ -4184,7 +4184,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/electronic_marketing_den) "amP" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -4217,7 +4217,7 @@ /turf/open/floor/wood, /area/crew_quarters/electronic_marketing_den) "amU" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -4307,7 +4307,7 @@ /turf/open/floor/carpet, /area/security/vacantoffice) "ang" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/structure/frame/computer, @@ -4470,7 +4470,7 @@ /obj/machinery/computer/prisoner/management{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/camera{ @@ -5433,7 +5433,7 @@ /obj/machinery/computer/med_data{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/blue{ @@ -5915,7 +5915,7 @@ /area/crew_quarters/electronic_marketing_den) "apY" = ( /obj/structure/frame/computer, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -9221,7 +9221,7 @@ /turf/open/floor/plasteel, /area/janitor) "avA" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/bot, @@ -9290,7 +9290,7 @@ /area/janitor) "avD" = ( /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/clipboard, @@ -9566,7 +9566,7 @@ /turf/open/floor/plating, /area/engine/supermatter) "awi" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/supermatter) "awj" = ( @@ -10599,7 +10599,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "ayd" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral, @@ -12334,7 +12334,7 @@ }) "aBm" = ( /obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/delivery, @@ -13659,7 +13659,7 @@ /area/hallway/secondary/service) "aDF" = ( /obj/structure/bed, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/bedsheet/clown, @@ -14298,7 +14298,7 @@ /area/crew_quarters/bar) "aER" = ( /obj/structure/closet/secure_closet/bar, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -14358,7 +14358,7 @@ /area/crew_quarters/bar) "aEW" = ( /obj/machinery/vending/boozeomat, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/dark, @@ -14391,7 +14391,7 @@ /area/crew_quarters/bar) "aEY" = ( /obj/structure/table/wood, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/clipboard, @@ -14830,7 +14830,7 @@ name = "Maintenance Garden" }) "aFM" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/delivery, @@ -15204,7 +15204,7 @@ /turf/open/floor/plating, /area/quartermaster/sorting) "aGu" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/reagent_dispensers/peppertank{ @@ -15746,7 +15746,7 @@ /turf/open/floor/plasteel, /area/engine/atmospherics_engine) "aHa" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/light, @@ -16821,7 +16821,7 @@ /area/hallway/secondary/service) "aIP" = ( /obj/structure/bed, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/bedsheet/mime, @@ -16906,7 +16906,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "aIY" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/crew_quarters/bar) "aIZ" = ( @@ -18124,7 +18124,7 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -18156,7 +18156,7 @@ /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) "aLd" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/atmospherics/components/unary/portables_connector/visible, @@ -18353,7 +18353,7 @@ name = "Engineering Power Monitoring Console" }, /obj/structure/cable/white, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -19179,7 +19179,7 @@ /area/hallway/secondary/service) "aNa" = ( /obj/structure/table/wood, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/item/camera_film{ @@ -19243,7 +19243,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/easel, @@ -19356,7 +19356,7 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "aNo" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/quartermaster/sorting) "aNp" = ( @@ -19913,7 +19913,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "aOh" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -20080,7 +20080,7 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/red{ @@ -22793,7 +22793,7 @@ dir = 4; pixel_x = -23 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/reagent_containers/glass/bottle/morphine{ @@ -24043,7 +24043,7 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "aUs" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/camera{ @@ -25784,7 +25784,7 @@ /turf/closed/wall, /area/engine/atmos) "aWK" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/engine/atmos) "aWL" = ( @@ -26522,7 +26522,7 @@ /area/security/prison) "aXM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/security/prison) "aXN" = ( @@ -27066,7 +27066,7 @@ /turf/closed/wall, /area/crew_quarters/kitchen) "aYD" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/crew_quarters/kitchen) "aYE" = ( @@ -28509,7 +28509,7 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "baX" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/quartermaster/qm) "baY" = ( @@ -29246,7 +29246,7 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "bcr" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/quartermaster/office) "bcs" = ( @@ -29578,7 +29578,7 @@ /obj/structure/closet/secure_closet/brig{ name = "Prisoner Locker" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -33053,7 +33053,7 @@ /obj/machinery/computer/security{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -34463,7 +34463,7 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "bkY" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light/small{ @@ -34513,7 +34513,7 @@ /area/maintenance/port/fore) "bld" = ( /obj/machinery/hydroponics/constructable, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/delivery, @@ -34680,7 +34680,7 @@ /area/crew_quarters/kitchen) "bls" = ( /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/vending/dinnerware, @@ -35039,9 +35039,9 @@ /area/quartermaster/miningoffice) "blX" = ( /obj/machinery/disposal/bin, -/obj/effect/decal/cleanable/dirt, /obj/machinery/light, /obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "blY" = ( @@ -35363,7 +35363,7 @@ "bmB" = ( /obj/structure/bed, /obj/item/bedsheet/hos, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/camera{ @@ -35888,7 +35888,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/fore) "bnx" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/fore) "bny" = ( @@ -35915,7 +35915,6 @@ /area/quartermaster/miningoffice) "bnA" = ( /obj/structure/plasticflaps/opaque, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, /obj/machinery/door/window/northright{ req_access_txt = "48" @@ -35923,7 +35922,6 @@ /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "bnB" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -36362,7 +36360,7 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /turf/open/floor/plating, @@ -36542,7 +36540,7 @@ /turf/open/floor/plasteel, /area/hydroponics) "boD" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hydroponics) "boE" = ( @@ -36748,6 +36746,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "boW" = ( @@ -36760,6 +36761,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "boX" = ( @@ -36767,7 +36771,6 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -36780,10 +36783,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "boY" = ( -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -36796,11 +36801,13 @@ /obj/effect/turf_decal/tile/brown{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "boZ" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ icon_state = "1-8" }, @@ -36808,18 +36815,17 @@ dir = 9 }, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/maintenance/starboard/fore) -"bpa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ +/obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) +"bpa" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "bpb" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/decal/cleanable/dirt, @@ -36856,7 +36862,7 @@ /area/security/execution/transfer) "bpf" = ( /obj/machinery/computer/shuttle/labor, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/red{ @@ -38203,6 +38209,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) "brb" = ( @@ -39341,12 +39348,12 @@ /area/hallway/primary/central) "bsV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bsW" = ( @@ -39782,7 +39789,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "btA" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32; pixel_y = -32 }, @@ -40141,7 +40148,7 @@ /turf/open/floor/plasteel, /area/engine/atmos) "buf" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/engine/atmos) @@ -40254,7 +40261,7 @@ /turf/open/floor/plating, /area/hallway/primary/central) "bur" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/central) "bus" = ( @@ -41463,7 +41470,7 @@ /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) "bwy" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/atmos) "bwz" = ( @@ -42212,7 +42219,7 @@ /turf/closed/wall/r_wall, /area/engine/break_room) "bxH" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, @@ -42574,7 +42581,7 @@ /area/bridge) "byn" = ( /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/storage/toolbox/mechanical, @@ -43177,7 +43184,7 @@ /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical, /obj/item/wrench/power, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/bot, @@ -43309,7 +43316,7 @@ /turf/closed/wall/r_wall, /area/engine/break_room) "bzt" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/structure/cable/white{ @@ -44096,7 +44103,7 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bAx" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai) "bAy" = ( @@ -44284,7 +44291,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45837,7 +45844,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/paper_bin, /obj/item/pen, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/requests_console{ @@ -46136,7 +46143,7 @@ /turf/open/floor/plasteel, /area/storage/primary) "bDu" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/storage/primary) "bDv" = ( @@ -47422,7 +47429,7 @@ /area/hallway/primary/port) "bES" = ( /obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -48334,7 +48341,7 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "bGe" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32; pixel_y = -32 }, @@ -48507,7 +48514,7 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bGr" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32; pixel_y = 32 }, @@ -48707,7 +48714,7 @@ /obj/structure/rack, /obj/item/airlock_painter, /obj/item/toner, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/bot, @@ -49450,7 +49457,7 @@ /area/engine/gravity_generator) "bHP" = ( /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -49544,7 +49551,7 @@ /turf/closed/wall, /area/engine/break_room) "bHX" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/engine/break_room) "bHY" = ( @@ -50064,7 +50071,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bIN" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/bridge) "bIO" = ( @@ -51288,7 +51295,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bKy" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/newscaster{ @@ -51457,7 +51464,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/captain) "bKS" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -51998,7 +52005,7 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLH" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/engine/transit_tube) "bLI" = ( @@ -52432,7 +52439,7 @@ /area/storage/tech) "bMj" = ( /obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -52458,7 +52465,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/bot, @@ -53524,7 +53531,7 @@ /obj/machinery/computer/card/minor/ce{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -53711,7 +53718,7 @@ /turf/open/floor/plasteel, /area/engine/break_room) "bOd" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/yellow, @@ -54108,7 +54115,7 @@ /obj/machinery/computer/telecomms/monitor{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -54372,7 +54379,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /turf/open/floor/carpet, @@ -54654,7 +54661,7 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bPI" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/aisat_interior) "bPJ" = ( @@ -56117,7 +56124,7 @@ /area/crew_quarters/heads/chief) "bSg" = ( /obj/structure/dresser, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/grimy, @@ -57235,7 +57242,7 @@ /obj/machinery/computer/station_alert{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -57942,7 +57949,7 @@ /area/crew_quarters/heads/captain) "bUP" = ( /obj/structure/table/wood, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/item/coin/adamantine{ @@ -60905,7 +60912,7 @@ pixel_x = 26; pixel_y = -32 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/recharger, @@ -61752,7 +61759,7 @@ /area/ai_monitored/turret_protected/aisat_interior) "cac" = ( /obj/machinery/recharge_station, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line{ @@ -61895,7 +61902,7 @@ "cal" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/pen, @@ -62226,7 +62233,7 @@ /area/crew_quarters/heads/hop) "caS" = ( /obj/machinery/pdapainter, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -63159,7 +63166,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "ccz" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/crew_quarters/heads/hop) "ccA" = ( @@ -64330,7 +64337,7 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -64591,7 +64598,7 @@ /obj/structure/table/wood, /obj/item/folder/blue, /obj/item/pen/fourcolor, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -65289,7 +65296,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/stripes/line{ @@ -66588,7 +66595,7 @@ pixel_x = -24; pixel_y = -32 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/structure/cable/white{ @@ -67083,7 +67090,7 @@ /area/lawoffice) "ciy" = ( /obj/machinery/photocopier, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/camera{ @@ -67301,7 +67308,7 @@ /area/security/brig) "ciL" = ( /obj/structure/closet/secure_closet/security/sec, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/structure/cable/white{ @@ -68044,7 +68051,7 @@ /turf/open/floor/plasteel, /area/security/courtroom) "ckd" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/camera{ @@ -68181,7 +68188,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "cko" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32; pixel_y = -32 }, @@ -68218,7 +68225,7 @@ /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai_upload) "cks" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32; pixel_y = -32 }, @@ -70115,7 +70122,7 @@ /turf/closed/wall/r_wall, /area/engine/engineering) "cnD" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/engineering) "cnE" = ( @@ -70156,7 +70163,7 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cnH" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/engine/engineering) "cnI" = ( @@ -70506,7 +70513,7 @@ /area/teleporter) "cor" = ( /obj/machinery/teleport/station, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -71327,7 +71334,7 @@ /area/teleporter) "cpV" = ( /obj/structure/table, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/item/paper_bin, @@ -71766,7 +71773,7 @@ /area/library) "cqU" = ( /obj/machinery/libraryscanner, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /turf/open/floor/plasteel/grimy, @@ -72058,7 +72065,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "crs" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/crew_quarters/locker) "crt" = ( @@ -72935,7 +72942,7 @@ dir = 1; name = "Jury" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -74329,7 +74336,7 @@ /turf/open/floor/plasteel/grimy, /area/library) "cvk" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/library) "cvl" = ( @@ -74972,7 +74979,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -75859,7 +75866,7 @@ /area/engine/storage) "cxL" = ( /obj/machinery/suit_storage_unit/engine, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/stripes/line{ @@ -76343,7 +76350,7 @@ /obj/machinery/gateway{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/decal/cleanable/dirt, @@ -76578,7 +76585,7 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "cyW" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -77058,7 +77065,7 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -78070,7 +78077,7 @@ /turf/open/floor/plasteel/dark, /area/bridge/showroom/corporate) "cBu" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -78615,7 +78622,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/wood, @@ -78645,7 +78652,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/spawner/lootdrop/bedsheet, @@ -78951,7 +78958,7 @@ pixel_y = 3 }, /obj/item/newspaper, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -79679,7 +79686,7 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cDR" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -79717,7 +79724,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/stripes/line{ @@ -80011,7 +80018,7 @@ "cEs" = ( /obj/machinery/light, /obj/structure/dresser, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -80514,7 +80521,7 @@ }, /area/crew_quarters/toilet/restrooms) "cFj" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/structure/cable/white{ @@ -80540,7 +80547,7 @@ /area/crew_quarters/toilet/restrooms) "cFl" = ( /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/structure/cable/white{ @@ -81105,7 +81112,7 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cGm" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line{ @@ -81688,7 +81695,7 @@ /area/engine/storage) "cHr" = ( /obj/structure/reagent_dispensers/watertank, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/bot, @@ -82182,7 +82189,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "cIo" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/crew_quarters/fitness/recreation) "cIp" = ( @@ -85300,7 +85307,7 @@ /turf/open/floor/plasteel, /area/science/research) "cNs" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/science/research) "cNt" = ( @@ -85386,10 +85393,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"cNB" = ( -/obj/machinery/status_display, -/turf/closed/wall, -/area/medical/medbay/central) "cNC" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -86958,7 +86961,7 @@ dir = 4; pixel_x = -24 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/extinguisher_cabinet{ @@ -87536,7 +87539,7 @@ /turf/open/floor/plasteel, /area/maintenance/department/electrical) "cRE" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/maintenance/department/electrical) "cRF" = ( @@ -87699,7 +87702,7 @@ /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/cable/white{ @@ -88254,7 +88257,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cSM" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/reagent_dispensers/peppertank{ @@ -88626,7 +88629,7 @@ /turf/open/floor/plasteel, /area/maintenance/port) "cTm" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/item/twohanded/required/kirbyplants/random, @@ -89691,7 +89694,7 @@ /obj/item/folder, /obj/item/pen, /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/paicard, @@ -89712,7 +89715,7 @@ "cUX" = ( /obj/structure/bed, /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/spawner/lootdrop/bedsheet, @@ -89749,7 +89752,7 @@ name = "trenchcoat" }, /obj/item/clothing/suit/toggle/lawyer/black, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/clothing/head/fedora, @@ -89856,7 +89859,7 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "cVj" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -90566,7 +90569,7 @@ }, /obj/item/storage/box/syringes, /obj/item/gun/syringe, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/structure/window/reinforced, @@ -90619,7 +90622,7 @@ pixel_x = -3; pixel_y = 2 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/firealarm{ @@ -91099,7 +91102,7 @@ /obj/machinery/computer/camera_advanced/xenobio{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /turf/open/floor/circuit/green, @@ -91250,7 +91253,7 @@ /obj/structure/table, /obj/item/gps, /obj/item/assembly/flash/handheld, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/purple, @@ -91870,7 +91873,7 @@ "cYE" = ( /obj/machinery/power/smes, /obj/machinery/light/small, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/stripes/line{ @@ -91893,7 +91896,7 @@ "cYH" = ( /obj/machinery/power/smes, /obj/machinery/light/small, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, @@ -93248,7 +93251,7 @@ dir = 1 }, /obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/purple{ @@ -93616,7 +93619,7 @@ /area/medical/medbay/central) "dbz" = ( /obj/machinery/vending/cola/random, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/light{ @@ -94444,7 +94447,7 @@ pixel_x = 3; pixel_y = 3 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/yellow{ @@ -95332,7 +95335,7 @@ /turf/open/floor/plasteel/white, /area/medical/chemistry) "der" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/medical/chemistry) "des" = ( @@ -98493,7 +98496,7 @@ /area/science/explab) "djG" = ( /obj/structure/filingcabinet/chestdrawer, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/bot, @@ -98705,7 +98708,7 @@ /obj/item/storage/toolbox/mechanical, /obj/item/stack/cable_coil/white, /obj/item/stack/cable_coil/white, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -99134,7 +99137,7 @@ /area/medical/abandoned) "dkK" = ( /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/storage/firstaid/regular, @@ -99165,7 +99168,7 @@ /area/medical/abandoned) "dkM" = ( /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/reagent_containers/blood/random, @@ -99737,7 +99740,7 @@ /turf/closed/wall, /area/medical/surgery) "dmb" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/medical/surgery) "dmc" = ( @@ -100285,7 +100288,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -102730,7 +102733,7 @@ /turf/closed/wall/r_wall, /area/science/explab) "drL" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/science/explab) "drM" = ( @@ -103377,7 +103380,7 @@ /area/crew_quarters/abandoned_gambling_den) "dta" = ( /obj/structure/table/wood, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/item/book/manual/wiki/engineering_hacking, @@ -103584,7 +103587,7 @@ /area/science/research) "dtw" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/bot, @@ -104467,7 +104470,7 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "dvi" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/medical/genetics) "dvj" = ( @@ -105182,7 +105185,7 @@ dir = 8 }, /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/keycard_auth{ @@ -106597,7 +106600,7 @@ /obj/machinery/computer/crew{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/blue, @@ -106665,7 +106668,7 @@ /turf/open/floor/plasteel/dark, /area/medical/surgery) "dyJ" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -106854,7 +106857,7 @@ /area/crew_quarters/abandoned_gambling_den) "dze" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/delivery, @@ -107749,7 +107752,7 @@ }, /obj/structure/bed, /obj/item/bedsheet/rd, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/purple, @@ -109302,7 +109305,7 @@ pixel_y = 2 }, /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/stripes/corner{ @@ -109900,7 +109903,7 @@ /area/medical/medbay/central) "dEg" = ( /obj/structure/filingcabinet/chestdrawer, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/blue{ @@ -110678,7 +110681,7 @@ "dFB" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/crowbar, @@ -110763,7 +110766,7 @@ pixel_y = -2 }, /obj/structure/table/reinforced, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/stripes/corner, @@ -112799,7 +112802,7 @@ "dIR" = ( /obj/structure/table/optable, /obj/effect/decal/cleanable/blood/old, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/purple, @@ -114289,7 +114292,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /turf/open/floor/wood{ @@ -114340,7 +114343,7 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /turf/open/floor/plasteel/grimy, @@ -116346,7 +116349,7 @@ /obj/machinery/computer/med_data{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/blue{ @@ -116735,7 +116738,7 @@ "dPQ" = ( /obj/machinery/vending/cola/random, /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -118303,7 +118306,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/green{ @@ -118977,7 +118980,7 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/machinery/portable_atmospherics/canister/air, @@ -119222,7 +119225,7 @@ pixel_y = 3 }, /obj/item/reagent_containers/food/snacks/grown/poppy, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/dark, @@ -119278,7 +119281,7 @@ pixel_y = 3 }, /obj/item/reagent_containers/food/snacks/grown/harebell, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/dark, @@ -119705,7 +119708,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/twohanded/required/kirbyplants/random, @@ -121334,7 +121337,7 @@ /turf/open/floor/grass, /area/hallway/secondary/exit/departure_lounge) "dYF" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/secondary/exit/departure_lounge) "dYG" = ( @@ -121425,7 +121428,7 @@ /area/medical/virology) "dYT" = ( /obj/machinery/light, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/item/twohanded/required/kirbyplants/random, @@ -122739,7 +122742,7 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "ebx" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/medical/virology) "eby" = ( @@ -123476,7 +123479,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/main) "ecT" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/chapel/main) @@ -124214,7 +124217,7 @@ /turf/open/floor/plating, /area/security/checkpoint/escape) "eee" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/security/checkpoint/escape) "eef" = ( @@ -124430,7 +124433,7 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -125279,7 +125282,7 @@ name = "Chapel RC"; pixel_y = -32 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/camera{ @@ -125358,7 +125361,7 @@ /obj/machinery/computer/security{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/red{ @@ -125766,17 +125769,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"eYg" = ( -/obj/machinery/door/airlock/external{ - name = "External Docking Port" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "faI" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -125813,6 +125805,27 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) +"fiK" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + name = "Mining Junction"; + sortType = 22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "fno" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -125935,15 +125948,6 @@ }, /turf/open/floor/engine, /area/science/mixing) -"gdb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "giN" = ( /obj/structure/window/reinforced{ dir = 8 @@ -125955,19 +125959,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) -"gmn" = ( -/obj/machinery/door/airlock/external{ - name = "External Docking Port" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "gut" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -126102,11 +126093,6 @@ /obj/structure/sign/warning/vacuum, /turf/closed/wall/r_wall, /area/chapel/office) -"hlu" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/shuttle/mining/common, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -126227,7 +126213,7 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "iwL" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/effect/turf_decal/tile/blue{ @@ -126387,6 +126373,10 @@ }, /turf/open/floor/plasteel, /area/medical/morgue) +"jOB" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/maintenance/starboard/fore) "jOE" = ( /obj/machinery/newscaster{ pixel_x = 32 @@ -126585,6 +126575,17 @@ }, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) +"lDl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -126700,23 +126701,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"mgh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -126767,6 +126751,15 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"mvx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mxm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, @@ -126776,6 +126769,17 @@ /obj/item/assembly/signaler, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"mLI" = ( +/obj/machinery/door/airlock/external{ + name = "External Docking Port" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "mPj" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -126838,10 +126842,28 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/maintenance/port/fore) +"nQR" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/shuttle/mining/common, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "nSh" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"nSS" = ( +/obj/machinery/door/airlock/external{ + name = "External Docking Port" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "oHk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -127063,6 +127085,21 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) +"qeN" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "qhc" = ( /obj/structure/table/reinforced, /obj/item/integrated_electronics/analyzer, @@ -127458,6 +127495,17 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"xdp" = ( +/obj/docking_port/stationary{ + dwidth = 3; + height = 5; + id = "commonmining_home"; + name = "SS13: Common Mining Dock"; + roundstart_template = /datum/map_template/shuttle/mining_common/meta; + width = 7 + }, +/turf/open/space/basic, +/area/space) "xdZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -127510,17 +127558,23 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"xDY" = ( -/obj/docking_port/stationary{ - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 +"xCB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/turf/open/space/basic, -/area/space) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/landmark/start/cyborg, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "xDZ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -127608,21 +127662,6 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) -"ylW" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/cyborg, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) (1,1,1) = {" aaa @@ -137517,7 +137556,7 @@ bPC bRK bTC bVK -ylW +qeN cal bPC aaa @@ -137774,7 +137813,7 @@ bPC bRL bTC bVx -mgh +xCB cam bPC bRO @@ -138031,7 +138070,7 @@ bPC bRM bTD bVL -mgh +xCB can bPC bkE @@ -160040,10 +160079,10 @@ aaa aaa aaa aaa -xDY -eYg -gdb -gmn +xdp +mLI +mvx +nSS abe abp abC @@ -160301,7 +160340,7 @@ aaa aaO aaO aaO -hlu +nQR abq abD abD @@ -168897,7 +168936,7 @@ cHP cIS bqX cMa -cNB +iQI cPr cQW cSF @@ -171166,7 +171205,7 @@ blS baQ boV bra -bsU +fiK bus bvM bwZ @@ -172449,7 +172488,7 @@ bio bjZ blW aig -aiC +lDl aig aad but @@ -172706,7 +172745,7 @@ bip bka baQ aig -apw +auv aig aaa but @@ -172962,7 +173001,7 @@ bgP biq bjZ blX -aig +jOB bpa aig aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index cd50d90edb..3353d1b15b 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -421,7 +421,7 @@ }, /area/security/prison) "abr" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/blue{ @@ -2472,7 +2472,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "afj" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32; pixel_y = 32 }, @@ -2501,7 +2501,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "afn" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32; pixel_y = 32 }, @@ -15058,7 +15058,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/red{ @@ -17819,7 +17819,7 @@ /obj/structure/chair{ name = "Judge" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light{ @@ -19088,7 +19088,7 @@ "aLO" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 30 }, /obj/effect/turf_decal/delivery, @@ -21087,7 +21087,7 @@ /obj/structure/cable/yellow{ icon_state = "0-4" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/camera{ @@ -21381,7 +21381,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = 32 }, /obj/machinery/flasher{ @@ -23713,7 +23713,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "aVm" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -23740,7 +23740,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "aVq" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -23803,7 +23803,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/stripes/line{ @@ -24135,7 +24135,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -24359,7 +24359,7 @@ pixel_x = -25; pixel_y = 25 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/extinguisher_cabinet{ @@ -27493,7 +27493,7 @@ name = "Station Intercom (General)"; pixel_x = -29 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -28332,7 +28332,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/captain/private) "bdI" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -29753,16 +29753,16 @@ /obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, /obj/item/clothing/under/rank/security/navyblue, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, +/obj/item/clothing/suit/armor/navyblue, /obj/item/clothing/under/rank/warden/navyblue, -/obj/item/clothing/suit/security/warden, +/obj/item/clothing/suit/armor/vest/warden/navyblue, /obj/item/clothing/under/rank/head_of_security/navyblue, -/obj/item/clothing/suit/security/hos, +/obj/item/clothing/suit/armor/hos/navyblue, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, /obj/item/clothing/head/beret/sec/navyofficer, @@ -30143,7 +30143,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bhk" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/folder/yellow{ @@ -30795,7 +30795,7 @@ /obj/structure/chair/office/dark{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /turf/open/floor/plasteel/dark, @@ -32463,7 +32463,7 @@ /area/ai_monitored/turret_protected/aisat/foyer) "blC" = ( /obj/machinery/teleport/station, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -32572,7 +32572,7 @@ /area/ai_monitored/storage/satellite) "blK" = ( /obj/machinery/recharge_station, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/cable/yellow{ @@ -33091,7 +33091,7 @@ /area/crew_quarters/heads/captain/private) "bmJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/structure/disposalpipe/segment, @@ -34052,7 +34052,7 @@ /obj/structure/displaycase/captain{ pixel_y = 5 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/wood, @@ -35067,7 +35067,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bqF" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/blue{ @@ -35947,7 +35947,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "bse" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/porta_turret/ai, @@ -36179,7 +36179,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = -32 }, /obj/effect/turf_decal/tile/neutral{ @@ -36283,7 +36283,7 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/hop) "bsP" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/bed/dogbed/ian, @@ -37933,7 +37933,7 @@ /area/bridge) "bwu" = ( /obj/machinery/holopad, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light{ @@ -39063,7 +39063,7 @@ }, /area/engine/atmos) "byS" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light{ @@ -39533,7 +39533,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/command) "bzN" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/bot, @@ -40057,7 +40057,7 @@ "bAW" = ( /obj/structure/table/wood, /obj/item/folder/blue, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 31 }, /obj/item/folder/blue, @@ -41121,7 +41121,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -41265,7 +41265,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, @@ -44514,7 +44514,7 @@ /obj/machinery/gateway{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/bot_white, @@ -45284,7 +45284,7 @@ /area/maintenance/central) "bLH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/machinery/camera{ @@ -49142,7 +49142,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -49213,7 +49213,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -52537,7 +52537,7 @@ pixel_y = 4 }, /obj/item/pen, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light/small{ @@ -59310,7 +59310,7 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cnC" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/table/glass, @@ -62450,7 +62450,7 @@ }, /area/crew_quarters/heads/hor) "ctc" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/landmark/xmastree/rdrod, @@ -65398,7 +65398,7 @@ "cyO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/white/side, @@ -73012,7 +73012,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cMU" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ layer = 4 }, /turf/closed/wall, @@ -76209,7 +76209,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 30 }, /obj/machinery/photocopier{ @@ -78350,7 +78350,7 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "deD" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall/r_wall, /area/engine/supermatter) "deI" = ( @@ -79825,7 +79825,7 @@ /area/maintenance/aft) "diD" = ( /obj/machinery/vending/cigarette, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/sign/poster/official/random{ diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 2947395ccb..22734b0979 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2564,7 +2564,7 @@ "aij" = ( /obj/structure/closet/secure_closet/contraband/armory, /obj/item/poster/random_contraband, -/obj/item/clothing/suit/security/officer/russian, +/obj/item/clothing/suit/armor/navyblue/russian, /obj/item/grenade/plastic/c4, /turf/open/floor/plasteel/dark, /area/security/armory) @@ -3086,7 +3086,7 @@ /area/security/main) "ajo" = ( /obj/machinery/vending/coffee, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/red{ @@ -3427,7 +3427,7 @@ "akc" = ( /obj/structure/table/wood, /obj/machinery/recharger, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/machinery/light{ @@ -6882,7 +6882,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "arK" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/item/folder/yellow{ @@ -9248,7 +9248,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/blue{ @@ -11380,7 +11380,7 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "aBF" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/structure/bed/dogbed/ian, @@ -14151,7 +14151,7 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /obj/effect/turf_decal/tile/neutral{ @@ -17493,7 +17493,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "aQt" = ( -/obj/machinery/status_display, +/obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/secondary/exit/departure_lounge) "aQu" = ( @@ -24292,7 +24292,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 30 }, /turf/open/floor/plasteel/dark, @@ -36929,7 +36929,7 @@ /area/medical/surgery) "bHc" = ( /obj/machinery/computer/med_data, -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_y = 32 }, /turf/open/floor/plasteel/freezer, @@ -48691,7 +48691,7 @@ /turf/open/space, /area/space/nearstation) "cmu" = ( -/obj/machinery/status_display{ +/obj/machinery/status_display/evac{ pixel_x = -32 }, /obj/structure/table, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index a0467cde6c..905b2cdb1b 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -506,6 +506,7 @@ "bx" = ( /obj/structure/table, /obj/machinery/readybutton, +/obj/item/storage/lockbox/dueling/hugbox/stamina, /turf/open/floor/holofloor/basalt, /area/holodeck/rec_center/thunderdome) "by" = ( @@ -522,6 +523,7 @@ /area/holodeck/rec_center/thunderdome) "bA" = ( /obj/machinery/readybutton, +/obj/item/storage/lockbox/dueling/hugbox/stamina, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index f7ec35c667..1dffe12884 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -924,25 +924,16 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/medical) "ce" = ( -/obj/item/sbeacondrop/bomb{ - pixel_y = 5 - }, -/obj/item/sbeacondrop/bomb, /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/start/nuclear_equipment, +/obj/effect/landmark/start/nuclear_equipment, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/armory) "cf" = ( -/obj/item/grenade/syndieminibomb{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/grenade/syndieminibomb{ - pixel_x = -1 - }, /obj/structure/table/reinforced, /obj/structure/window/reinforced{ dir = 4 @@ -956,6 +947,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/landmark/start/nuclear_equipment/minibomb, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/armory) "cg" = ( diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 3acd1443af..0b46f21a97 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -73,6 +73,7 @@ #define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod" #define ADMIN_PUNISHMENT_MAZING "Puzzle" #define ADMIN_PUNISHMENT_PIE "Cream Pie" +#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie" #define AHELP_ACTIVE 1 #define AHELP_CLOSED 2 @@ -87,5 +88,5 @@ #define MAX_KEYPRESS_COMMANDLENGTH 16 ///Max amount of keypress messages per second over two seconds before client is autokicked #define MAX_KEYPRESS_AUTOKICK 100 -///Length of held key rolling buffer -#define HELD_KEY_BUFFER_LENGTH 15 +///Length of max held keys +#define MAX_HELD_KEYS 15 diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 28554dbd99..e728d49956 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -149,9 +149,9 @@ //OPEN TURF ATMOS #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn -#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15C telecommunications. also used for xenobiology slime killrooms +#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15degC telecommunications. also used for xenobiology slime killrooms #define AIRLESS_ATMOS "TEMP=2.7" //space -#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15C snow and ice turfs +#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15degC snow and ice turfs #define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program //ATMOSPHERICS DEPARTMENT GAS TANK TURFS diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index faf71a45fb..22e74f58be 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -106,6 +106,9 @@ #define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) #define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) + #define COMPONENT_ALLOW_EXAMINATE 1 + #define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one + #define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) #define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) #define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) @@ -159,7 +162,6 @@ // /mob signals #define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) - #define COMPONENT_ALLOW_EXAMINE 1 #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) #define COMPONENT_BLOCK_DEATH_BROADCAST 1 //stops the death from being broadcasted in deadchat. #define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse, special, penalize) @@ -198,6 +200,7 @@ #define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override) // /mob/living/carbon signals @@ -275,8 +278,6 @@ #define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. #define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) -//Blood color -#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff //Food #define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index 45c1ba9cb2..0d57961f48 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -5,6 +5,7 @@ #define NO_ASSASSIN (1<<0) #define WAROPS_ALWAYS_ALLOWED (1<<1) +#define USE_PREF_WEIGHTS (1<<2) #define ONLY_RULESET (1<<0) #define HIGHLANDER_RULESET (1<<1) diff --git a/code/__DEFINES/interaction_flags.dm b/code/__DEFINES/interaction_flags.dm index dc3242c910..6df5bf77fb 100644 --- a/code/__DEFINES/interaction_flags.dm +++ b/code/__DEFINES/interaction_flags.dm @@ -20,3 +20,5 @@ #define INTERACT_MACHINE_SET_MACHINE (1<<6) //MACHINES HAVE THIS BY DEFAULT, SOMEONE SHOULD RUN THROUGH MACHINES AND REMOVE IT FROM THINGS LIKE LIGHT SWITCHES WHEN POSSIBLE!!-------------------------- //This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it. //THIS FLAG IS ON ALL MACHINES BY DEFAULT, NEEDS TO BE RE-EVALUATED LATER!! + +#define INTERACT_GHOST_READ (1<<0) \ No newline at end of file diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index fe50319295..7e385638c5 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -24,18 +24,19 @@ #define LOG_SAY (1 << 1) #define LOG_WHISPER (1 << 2) #define LOG_EMOTE (1 << 3) -#define LOG_DSAY (1 << 4) -#define LOG_PDA (1 << 5) -#define LOG_CHAT (1 << 6) -#define LOG_COMMENT (1 << 7) -#define LOG_TELECOMMS (1 << 8) -#define LOG_OOC (1 << 9) -#define LOG_ADMIN (1 << 10) -#define LOG_OWNERSHIP (1 << 11) -#define LOG_GAME (1 << 12) -#define LOG_ADMIN_PRIVATE (1 << 13) -#define LOG_ASAY (1 << 14) -#define LOG_VIRUS (1 << 15) +#define LOG_SUBTLER (1 << 4) +#define LOG_DSAY (1 << 5) +#define LOG_PDA (1 << 6) +#define LOG_CHAT (1 << 7) +#define LOG_COMMENT (1 << 8) +#define LOG_TELECOMMS (1 << 9) +#define LOG_OOC (1 << 10) +#define LOG_ADMIN (1 << 11) +#define LOG_OWNERSHIP (1 << 12) +#define LOG_GAME (1 << 13) +#define LOG_ADMIN_PRIVATE (1 << 14) +#define LOG_ASAY (1 << 15) +#define LOG_VIRUS (1 << 16) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 8ae4e5c167..eee0676dec 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -96,12 +96,22 @@ #define NUKESTATE_CORE_EXPOSED 1 #define NUKESTATE_CORE_REMOVED 0 +#define NUKEUI_AWAIT_DISK 0 +#define NUKEUI_AWAIT_CODE 1 +#define NUKEUI_AWAIT_TIMER 2 +#define NUKEUI_AWAIT_ARM 3 +#define NUKEUI_TIMING 4 +#define NUKEUI_EXPLODED 5 + #define NUKE_OFF_LOCKED 0 #define NUKE_OFF_UNLOCKED 1 #define NUKE_ON_TIMING 2 #define NUKE_ON_EXPLODING 3 +#define MACHINE_NOT_ELECTRIFIED 0 +#define MACHINE_ELECTRIFIED_PERMANENT -1 +#define MACHINE_DEFAULT_ELECTRIFY_TIME 30 //these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. #define PLANT_GENE_REMOVABLE (1<<0) -#define PLANT_GENE_EXTRACTABLE (1<<1) \ No newline at end of file +#define PLANT_GENE_EXTRACTABLE (1<<1) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 8d2913629a..a7d6056ab9 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -200,9 +200,11 @@ #define NO_SLIP_WHEN_WALKING (1<<0) #define SLIDE (1<<1) #define GALOSHES_DONT_HELP (1<<2) -#define SLIDE_ICE (1<<3) -#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin -#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on. +#define FLYING_DOESNT_HELP (1<<3) +#define SLIDE_ICE (1<<4) +#define SLIP_WHEN_CRAWLING (1<<5) //clown planet ruin amongst others +#define SLIP_WHEN_JOGGING (1<<6) //slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on. + #define MAX_CHICKENS 50 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 54f4648006..d08344cc96 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -40,6 +40,8 @@ #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) +#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone + //reagent bitflags, used for altering how they works #define REAGENT_DEAD_PROCESS (1<<0) //calls on_mob_dead() if present in a dead body #define REAGENT_DONOTSPLIT (1<<1) //Do not split the chem at all during processing diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 28a04c2a51..7fabb74157 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -38,6 +38,7 @@ #define ROLE_BLOODSUCKER "bloodsucker" //#define ROLE_MONSTERHUNTER "monster hunter" Disabled for now #define ROLE_GHOSTCAFE "ghostcafe" +#define ROLE_MINOR_ANTAG "minorantag" //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //The gamemode specific ones are just so the gamemodes can query whether a player is old enough //(in game days played) to play that role diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index e590a30ff9..b9c0544bc1 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -11,3 +11,8 @@ #define SHOULD_CALL_PARENT(X) #define UNLINT(X) X #endif + +/world/proc/enable_debugger() + var/dll = world.GetConfig("env", "EXTOOLS_DLL") + if (dll) + call(dll, "debug_initialize")() diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index e1fff1879e..af618cf828 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -54,5 +54,5 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time) #define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday) #define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format) -#define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) -#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format) +#define STATION_TIME(display_only, wtime) ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0) +#define STATION_TIME_TIMESTAMP(format, wtime) time2text(STATION_TIME(TRUE, wtime), format) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 608144da26..218fe1ac86 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -174,6 +174,7 @@ #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't +#define TRAIT_NO_INTERNALS "no-internals" #define TRAIT_NO_ALCOHOL "alcohol_intolerance" // common trait sources @@ -232,9 +233,9 @@ #define SLEEPING_CARP_TRAIT "sleeping_carp" #define RISING_BASS_TRAIT "rising_bass" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" -#define NUKEOP_ANTAGONIST "nukeop-antagonist" #define MADE_UNCLONEABLE "made-uncloneable" #define TIMESTOP_TRAIT "timestop" #define NUKEOP_TRAIT "nuke-op" +#define CLOWNOP_TRAIT "clown-op" #define MEGAFAUNA_TRAIT "megafauna" #define DEATHSQUAD_TRAIT "deathsquad" diff --git a/code/__DEFINES/typeids.dm b/code/__DEFINES/typeids.dm index 8bfe6216e2..275f7719f0 100644 --- a/code/__DEFINES/typeids.dm +++ b/code/__DEFINES/typeids.dm @@ -2,7 +2,7 @@ #define TYPEID_NULL "0" #define TYPEID_NORMAL_LIST "f" //helper macros -#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) +#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) ) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm index 8fb2e6deab..b83ea7b8f6 100644 --- a/code/__DEFINES/vote.dm +++ b/code/__DEFINES/vote.dm @@ -1,6 +1,8 @@ #define PLURALITY_VOTING 0 #define APPROVAL_VOTING 1 -#define RANKED_CHOICE_VOTING 2 +#define SCHULZE_VOTING 2 #define SCORE_VOTING 3 +#define MAJORITY_JUDGEMENT_VOTING 4 +#define INSTANT_RUNOFF_VOTING 5 GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 6ea1de0e2c..8ef924eea4 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -52,6 +52,8 @@ if (CONFIG_GET(flag/log_adminchat)) WRITE_LOG(GLOB.world_game_log, "ADMIN: DSAY: [text]") +/proc/log_consent(text) + WRITE_LOG(GLOB.world_game_log,"CONSENT: [text]") /* All other items are public. */ /proc/log_game(text) @@ -94,6 +96,10 @@ if (CONFIG_GET(flag/log_emote)) WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]") +/proc/log_subtler(text) + if (CONFIG_GET(flag/log_emote)) + WRITE_LOG(GLOB.world_game_log, "EMOTE (SUBTLER): [text]") + /proc/log_prayer(text) if (CONFIG_GET(flag/log_prayer)) WRITE_LOG(GLOB.world_game_log, "PRAY: [text]") @@ -175,6 +181,11 @@ /proc/start_log(log) WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------") +/* ui logging */ + +/proc/log_tgui(text) + WRITE_LOG(GLOB.tgui_log, text) + /* Close open log handles. This should be called as late as possible, and no logging should hapen after. */ /proc/shutdown_logging() rustg_log_close_all() diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm index 4160c1976a..7c6c186bca 100644 --- a/code/__HELPERS/files.dm +++ b/code/__HELPERS/files.dm @@ -20,7 +20,7 @@ continue path += choice - if(copytext(path,-1,0) != "/") //didn't choose a directory, no need to iterate again + if(copytext_char(path, -1) != "/") //didn't choose a directory, no need to iterate again break var/extensions for(var/i in valid_extensions) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 8e88f869a9..aee0f3d7f7 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -985,7 +985,7 @@ world var/icon/atom_icon = new(A.icon, A.icon_state) if(!letter) - letter = copytext(A.name, 1, 2) + letter = A.name[1] if(uppercase == 1) letter = uppertext(letter) else if(uppercase == -1) @@ -1113,7 +1113,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 WRITE_FILE(GLOB.iconCache[iconKey], icon) var/iconData = GLOB.iconCache.ExportText(iconKey) var/list/partial = splittext(iconData, "{") - return replacetext(copytext(partial[2], 3, -5), "\n", "") + return replacetext(copytext_char(partial[2], 3, -5), "\n", "") /proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE) if (!thing) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 339069a364..1669c941c2 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -179,7 +179,6 @@ "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, - "balls_fluid" = "semen", "has_ovi" = FALSE, "ovi_shape" = "knotted", "ovi_length" = 6, @@ -194,7 +193,6 @@ "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_size" = pick(GLOB.breasts_size_list), "breasts_shape" = "Pair", - "breasts_fluid" = "milk", "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = pick(GLOB.vagina_shapes_list), @@ -206,7 +204,6 @@ "womb_cum_rate" = CUM_RATE, "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum", "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index d1add9cb4c..bab286bafe 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -28,10 +28,10 @@ . = "does" /datum/proc/p_theyve(capitalized, temp_gender) - . = p_they(capitalized, temp_gender) + "'" + copytext(p_have(temp_gender), 3) + . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3) /datum/proc/p_theyre(capitalized, temp_gender) - . = p_they(capitalized, temp_gender) + "'" + copytext(p_are(temp_gender), 2) + . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) /datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what? . = "s" diff --git a/code/__HELPERS/radio.dm b/code/__HELPERS/radio.dm index 7ab21d0402..5fe87bdf5b 100644 --- a/code/__HELPERS/radio.dm +++ b/code/__HELPERS/radio.dm @@ -1,6 +1,6 @@ // Ensure the frequency is within bounds of what it should be sending/receiving at /proc/sanitize_frequency(frequency, free = FALSE) - . = round(frequency) + frequency = round(frequency) if(free) . = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ) else diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index f1208abdd3..50c866b30b 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -72,3 +72,26 @@ if(!GLOB.chemical_reactions_list[primary_reagent]) GLOB.chemical_reactions_list[primary_reagent] = list() GLOB.chemical_reactions_list[primary_reagent] += R + +/proc/choose_reagent_id(mob/user) + var/chosen_id + switch(alert(user, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky")) + if("Search") + var/valid_id + while(!valid_id) + chosen_id = input(user, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text + if(isnull(chosen_id)) //Get me out of here! + break + if(!ispath(text2path(chosen_id))) + chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) + if(ispath(chosen_id)) + valid_id = TRUE + else + valid_id = TRUE + if(!valid_id) + to_chat(user, "A reagent with that ID doesn't exist!") + if("Choose from a list") + chosen_id = input(user, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) + if("I'm feeling lucky") + chosen_id = pick(subtypesof(/datum/reagent)) + return chosen_id \ No newline at end of file diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 19ee2b2a5a..04e7ffd721 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -3,6 +3,9 @@ #define POPCOUNT_SHUTTLE_ESCAPEES "shuttle_escapees" //Emergency shuttle only. /datum/controller/subsystem/ticker/proc/gather_roundend_feedback() + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) gather_antag_data() record_nuke_disk_location() var/json_file = file("[GLOB.log_directory]/round_end_data.json") @@ -71,9 +74,6 @@ mob_data += list("name" = m.name, "typepath" = m.type) var/pos = length(file_data["[escaped]"]["[category]"]) + 1 file_data["[escaped]"]["[category]"]["[pos]"] = mob_data - var/datum/station_state/end_state = new /datum/station_state() - end_state.count() - var/station_integrity = min(PERCENT(GLOB.start_state.score(end_state)), 100) file_data["additional data"]["station integrity"] = station_integrity WRITE_FILE(json_file, json_encode(file_data)) SSblackbox.record_feedback("nested tally", "round_end_stats", num_survivors, list("survivors", "total")) @@ -111,7 +111,14 @@ if(A.objectives.len) for(var/datum/objective/O in A.objectives) - var/result = O.check_completion() ? "SUCCESS" : "FAIL" + var/result = "UNKNOWN" + var/actual_result = O.check_completion() + if(actual_result >= 1) + result = "SUCCESS" + else if(actual_result <= 0) + result = "FAIL" + else + result = "[actual_result*100]%" antag_info["objectives"] += list(list("objective_type"=O.type,"text"=O.explanation_text,"result"=result)) SSblackbox.record_feedback("associative", "antagonists", 1, antag_info) @@ -550,10 +557,16 @@ var/list/objective_parts = list() var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + if(objective.completable) + var/completion = objective.check_completion() + if(completion >= 1) + objective_parts += "Objective #[count]: [objective.explanation_text] Success!" + else if(completion <= 0) + objective_parts += "Objective #[count]: [objective.explanation_text] Fail." + else + objective_parts += "Objective #[count]: [objective.explanation_text] [completion*100]%" else - objective_parts += "Objective #[count]: [objective.explanation_text] Fail." + objective_parts += "Objective #[count]: [objective.explanation_text]" count++ return objective_parts.Join("
") diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index b511c61971..faa8c22f38 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -43,24 +43,30 @@ if(!istext(color)) color = "" - var/start = 1 + (text2ascii(color,1)==35) + var/start = 1 + (text2ascii(color, 1) == 35) var/len = length(color) - var/step_size = 1 + ((len+1)-start != desired_format) + var/char = "" + // RRGGBB -> RGB but awful + var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3 . = "" - for(var/i=start, i<=len, i+=step_size) - var/ascii = text2ascii(color,i) - switch(ascii) - if(48 to 57) - . += ascii2text(ascii) //numbers 0 to 9 - if(97 to 102) - . += ascii2text(ascii) //letters a to f - if(65 to 70) - . += ascii2text(ascii+32) //letters A to F - translates to lowercase + var/i = start + while(i <= len) + char = color[i] + switch(text2ascii(char)) + if(48 to 57) //numbers 0 to 9 + . += char + if(97 to 102) //letters a to f + . += char + if(65 to 70) //letters A to F + . += lowertext(char) else break + i += length(char) + if(convert_to_shorthand && i <= len) //skip next one + i += length(color[i]) - if(length(.) != desired_format) + if(length_char(.) != desired_format) if(default) return default return crunch + repeat_string(desired_format, "0") @@ -68,7 +74,9 @@ return crunch + . /proc/sanitize_ooccolor(color) - var/list/HSL = rgb2hsl(hex2num(copytext(color,2,4)),hex2num(copytext(color,4,6)),hex2num(copytext(color,6,8))) + if(length(color) != length_char(color)) + CRASH("Invalid characters in color '[color]'") + var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8))) HSL[3] = min(HSL[3],0.4) var/list/RGB = hsl2rgb(arglist(HSL)) - return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" \ No newline at end of file + return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]" diff --git a/code/__HELPERS/shell.dm b/code/__HELPERS/shell.dm index 8b615eac0a..3438f38b85 100644 --- a/code/__HELPERS/shell.dm +++ b/code/__HELPERS/shell.dm @@ -52,6 +52,6 @@ if(bad_chars) bad_match = url_encode(bad_chars_regex.match) scrubbed_url += bad_match - last_good = bad_chars + length(bad_match) + last_good = bad_chars + length(bad_chars_regex.match) while(bad_chars) . = scrubbed_url diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 60c43b0869..3985659b71 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -40,8 +40,8 @@ for(var/char in repl_chars) var/index = findtext(t, char) while(index) - t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+1) - index = findtext(t, char, index+1) + t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index + length(char)) + index = findtext(t, char, index + length(char)) return t /proc/sanitize_filename(t) @@ -63,22 +63,28 @@ //Returns null if there is any bad text in the string -/proc/reject_bad_text(text, max_length=512) - if(length(text) > max_length) - return //message too long - var/non_whitespace = 0 - for(var/i=1, i<=length(text), i++) - switch(text2ascii(text,i)) - if(62,60,92,47) - return //rejects the text if it contains these bad characters: <, >, \ or / - if(127 to 255) - return //rejects weird letters like � +/proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE) + var/char_count = 0 + var/non_whitespace = FALSE + var/lenbytes = length(text) + var/char = "" + for(var/i = 1, i <= lenbytes, i += length(char)) + char = text[i] + char_count++ + if(char_count > max_length) + return + switch(text2ascii(char)) + if(62,60,92,47) // <, >, \, / + return if(0 to 31) - return //more weird stuff + return if(32) continue //whitespace + if(127 to INFINITY) + if(ascii_only) + return else - non_whitespace = 1 + non_whitespace = TRUE if(non_whitespace) return text //only accepts the text if it has some non-spaces @@ -101,73 +107,84 @@ else return trim(html_encode(name), max_length) +#define NO_CHARS_DETECTED 0 +#define SPACES_DETECTED 1 +#define SYMBOLS_DETECTED 2 +#define NUMBERS_DETECTED 3 +#define LETTERS_DETECTED 4 + //Filters out undesirable characters from names -/proc/reject_bad_name(t_in, allow_numbers=0, max_length=MAX_NAME_LEN) - if(!t_in || length(t_in) > max_length) - return //Rejects the input if it is null or if it is longer then the max length allowed +/proc/reject_bad_name(t_in, allow_numbers = FALSE, max_length = MAX_NAME_LEN, ascii_only = TRUE) + if(!t_in) + return //Rejects the input if it is null - var/number_of_alphanumeric = 0 - var/last_char_group = 0 + var/number_of_alphanumeric = 0 + var/last_char_group = NO_CHARS_DETECTED var/t_out = "" + var/t_len = length(t_in) + var/charcount = 0 + var/char = "" - for(var/i=1, i<=length(t_in), i++) - var/ascii_char = text2ascii(t_in,i) - switch(ascii_char) + + for(var/i = 1, i <= t_len, i += length(char)) + char = t_in[i] + + switch(text2ascii(char)) // A .. Z if(65 to 90) //Uppercase Letters - t_out += ascii2text(ascii_char) number_of_alphanumeric++ - last_char_group = 4 + last_char_group = LETTERS_DETECTED // a .. z if(97 to 122) //Lowercase Letters - if(last_char_group<2) - t_out += ascii2text(ascii_char-32) //Force uppercase first character - else - t_out += ascii2text(ascii_char) + if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED || last_char_group == SYMBOLS_DETECTED) //start of a word + char = uppertext(char) number_of_alphanumeric++ - last_char_group = 4 + last_char_group = LETTERS_DETECTED // 0 .. 9 if(48 to 57) //Numbers - if(!last_char_group) - continue //suppress at start of string - if(!allow_numbers) + if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string continue - t_out += ascii2text(ascii_char) number_of_alphanumeric++ - last_char_group = 3 + last_char_group = NUMBERS_DETECTED // ' - . if(39,45,46) //Common name punctuation - if(!last_char_group) + if(last_char_group == NO_CHARS_DETECTED) continue - t_out += ascii2text(ascii_char) - last_char_group = 2 + last_char_group = SYMBOLS_DETECTED // ~ | @ : # $ % & * + if(126,124,64,58,35,36,37,38,42,43) //Other symbols that we'll allow (mainly for AI) - if(!last_char_group) - continue //suppress at start of string - if(!allow_numbers) + if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string continue - t_out += ascii2text(ascii_char) - last_char_group = 2 + last_char_group = SYMBOLS_DETECTED //Space if(32) - if(last_char_group <= 1) - continue //suppress double-spaces and spaces at start of string - t_out += ascii2text(ascii_char) - last_char_group = 1 + if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED) //suppress double-spaces and spaces at start of string + continue + last_char_group = SPACES_DETECTED + + if(127 to INFINITY) + if(ascii_only) + continue + last_char_group = SYMBOLS_DETECTED //for now, we'll treat all non-ascii characters like symbols even though most are letters + else - return + continue + + t_out += char + charcount++ + if(charcount >= max_length) + break if(number_of_alphanumeric < 2) return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '" - if(last_char_group == 1) - t_out = copytext(t_out,1,length(t_out)) //removes the last character (in this case a space) + if(last_char_group == SPACES_DETECTED) + t_out = copytext_char(t_out, 1, -1) //removes the last character (in this case a space) for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names if(cmptext(t_out,bad_name)) @@ -175,6 +192,11 @@ return t_out +#undef NO_CHARS_DETECTED +#undef SPACES_DETECTED +#undef NUMBERS_DETECTED +#undef LETTERS_DETECTED + //html_encode helper proc that returns the smallest non null of two numbers //or 0 if they're both null (needed because of findtext returning 0 when a value is not present) /proc/non_zero_min(a, b) @@ -184,39 +206,6 @@ return a return (a < b ? a : b) -/* - * Text searches - */ - -//Checks the beginning of a string for a specified sub-string -//Returns the position of the substring or 0 if it was not found -/proc/dd_hasprefix(text, prefix) - var/start = 1 - var/end = length(prefix) + 1 - return findtext(text, prefix, start, end) - -//Checks the beginning of a string for a specified sub-string. This proc is case sensitive -//Returns the position of the substring or 0 if it was not found -/proc/dd_hasprefix_case(text, prefix) - var/start = 1 - var/end = length(prefix) + 1 - return findtextEx(text, prefix, start, end) - -//Checks the end of a string for a specified substring. -//Returns the position of the substring or 0 if it was not found -/proc/dd_hassuffix(text, suffix) - var/start = length(text) - length(suffix) - if(start) - return findtext(text, suffix, start, null) - return - -//Checks the end of a string for a specified substring. This proc is case sensitive -//Returns the position of the substring or 0 if it was not found -/proc/dd_hassuffix_case(text, suffix) - var/start = length(text) - length(suffix) - if(start) - return findtextEx(text, suffix, start, null) - //Checks if any of a given list of needles is in the haystack /proc/text_in_list(haystack, list/needle_list, start=1, end=0) for(var/needle in needle_list) @@ -231,23 +220,19 @@ return 1 return 0 -//Adds 'u' number of zeros ahead of the text 't' -/proc/add_zero(t, u) - while (length(t) < u) - t = "0[t]" - return t +//Adds 'char' ahead of 'text' until there are 'count' characters total +/proc/add_leading(text, count, char = " ") + text = "[text]" + var/charcount = count - length_char(text) + var/list/chars_to_add[max(charcount + 1, 0)] + return jointext(chars_to_add, char) + text -//Adds 'u' number of spaces ahead of the text 't' -/proc/add_lspace(t, u) - while(length(t) < u) - t = " [t]" - return t - -//Adds 'u' number of spaces behind the text 't' -/proc/add_tspace(t, u) - while(length(t) < u) - t = "[t] " - return t +//Adds 'char' behind 'text' until there are 'count' characters total +/proc/add_trailing(text, count, char = " ") + text = "[text]" + var/charcount = count - length_char(text) + var/list/chars_to_add[max(charcount + 1, 0)] + return text + jointext(chars_to_add, char) //Returns a string with reserved characters and spaces before the first letter removed /proc/trim_left(text) @@ -267,57 +252,41 @@ //Returns a string with reserved characters and spaces before the first word and after the last word removed. /proc/trim(text, max_length) if(max_length) - text = copytext(text, 1, max_length) + text = copytext_char(text, 1, max_length) return trim_left(trim_right(text)) //Returns a string with the first element of the string capitalized. /proc/capitalize(t as text) - return uppertext(copytext(t, 1, 2)) + copytext(t, 2) - -//Centers text by adding spaces to either side of the string. -/proc/dd_centertext(message, length) - var/new_message = message - var/size = length(message) - var/delta = length - size - if(size == length) - return new_message - if(size > length) - return copytext(new_message, 1, length + 1) - if(delta == 1) - return new_message + " " - if(delta % 2) - new_message = " " + new_message - delta-- - var/spaces = add_lspace("",delta/2-1) - return spaces + new_message + spaces - -//Limits the length of the text. Note: MAX_MESSAGE_LEN and MAX_NAME_LEN are widely used for this purpose -/proc/dd_limittext(message, length) - var/size = length(message) - if(size <= length) - return message - return copytext(message, 1, length + 1) - + . = t + if(t) + . = t[1] + return uppertext(.) + copytext(t, 1 + length(.)) /proc/stringmerge(text,compare,replace = "*") //This proc fills in all spaces with the "replace" var (* by default) with whatever //is in the other string at the same spot (assuming it is not a replace char). //This is used for fingerprints var/newtext = text - if(length(text) != length(compare)) - return 0 - for(var/i = 1, i < length(text), i++) - var/a = copytext(text,i,i+1) - var/b = copytext(compare,i,i+1) + var/text_it = 1 //iterators + var/comp_it = 1 + var/newtext_it = 1 + var/text_length = length(text) + var/comp_length = length(compare) + while(comp_it <= comp_length && text_it <= text_length) + var/a = text[text_it] + var/b = compare[comp_it] //if it isn't both the same letter, or if they are both the replacement character //(no way to know what it was supposed to be) if(a != b) if(a == replace) //if A is the replacement char - newtext = copytext(newtext,1,i) + b + copytext(newtext, i+1) + newtext = copytext(newtext, 1, newtext_it) + b + copytext(newtext, newtext_it + length(newtext[newtext_it])) else if(b == replace) //if B is the replacement char - newtext = copytext(newtext,1,i) + a + copytext(newtext, i+1) + newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it])) else //The lists disagree, Uh-oh! return 0 + text_it += length(a) + comp_it += length(b) + newtext_it += length(newtext[newtext_it]) return newtext /proc/stringpercent(text,character = "*") @@ -326,16 +295,21 @@ if(!text || !character) return 0 var/count = 0 - for(var/i = 1, i <= length(text), i++) - var/a = copytext(text,i,i+1) + var/lentext = length(text) + var/a = "" + for(var/i = 1, i <= lentext, i += length(a)) + a = text[i] if(a == character) count++ return count /proc/reverse_text(text = "") var/new_text = "" - for(var/i = length(text); i > 0; i--) - new_text += copytext(text, i, i+1) + var/lentext = length(text) + var/letter = "" + for(var/i = 1, i <= lentext, i += length(letter)) + letter = text[i] + new_text = letter + new_text return new_text GLOBAL_LIST_INIT(zero_character_only, list("0")) @@ -358,15 +332,6 @@ GLOBAL_LIST_INIT(binary, list("0","1")) /proc/random_color() return random_string(6, GLOB.hex_characters) -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 - //merges non-null characters (3rd argument) from "from" into "into". Returns result //e.g. into = "Hello World" // from = "Seeya______" @@ -379,41 +344,48 @@ GLOBAL_LIST_INIT(binary, list("0","1")) into = "" if(!istext(from)) from = "" - var/null_ascii = istext(null_char) ? text2ascii(null_char,1) : null_char - - var/previous = 0 + var/null_ascii = istext(null_char) ? text2ascii(null_char, 1) : null_char + var/copying_into = FALSE + var/char = "" var/start = 1 - var/end = length(into) + 1 - - for(var/i=1, i= text2ascii("a") && ca <= text2ascii("m")) - ca += 13 - else if(ca >= text2ascii("n") && ca <= text2ascii("z")) - ca -= 13 - else if(ca >= text2ascii("A") && ca <= text2ascii("M")) - ca += 13 - else if(ca >= text2ascii("N") && ca <= text2ascii("Z")) - ca -= 13 - result += ascii2text(ca) - return jointext(result, "") + var/lentext = length(text) + var/char = "" + var/ascii = 0 + . = "" + for(var/i = 1, i <= lentext, i += length(char)) + char = text[i] + ascii = text2ascii(char) + switch(ascii) + if(65 to 77, 97 to 109) //A to M, a to m + ascii += 13 + if(78 to 90, 110 to 122) //N to Z, n to z + ascii -= 13 + . += ascii2text(ascii) //Takes a list of values, sanitizes it down for readability and character count, //then exports it as a json file at data/npc_saves/[filename].json. @@ -599,7 +576,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return //Regular expressions are, as usual, absolute magic - var/regex/all_invalid_symbols = new("\[^ -~]+") + //Any characters outside of 32 (space) to 126 (~) because treating things you don't understand as "magic" is really stupid + var/regex/all_invalid_symbols = new(@"[^ -~]{1}") var/list/accepted = list() for(var/string in proposed) @@ -607,34 +585,44 @@ GLOBAL_LIST_INIT(binary, list("0","1")) continue var/buffer = "" var/early_culling = TRUE - for(var/pos = 1, pos <= length(string), pos++) - var/let = copytext(string, pos, (pos + 1) % length(string)) - if(early_culling && !findtext(let,GLOB.is_alphanumeric)) + var/lentext = length(string) + var/let = "" + + for(var/pos = 1, pos <= lentext, pos += length(let)) + let = string[pos] + if(!findtext(let, GLOB.is_alphanumeric)) continue early_culling = FALSE - buffer += let - if(!findtext(buffer,GLOB.is_alphanumeric)) + buffer = copytext(string, pos) + break + if(early_culling) //Never found any letters! Bail! continue + var/punctbuffer = "" - var/cutoff = length(buffer) - for(var/pos = length(buffer), pos >= 0, pos--) - var/let = copytext(buffer, pos, (pos + 1) % length(buffer)) - if(findtext(let,GLOB.is_alphanumeric)) + var/cutoff = 0 + lentext = length_char(buffer) + for(var/pos = 1, pos <= lentext, pos++) + let = copytext_char(buffer, -pos, -pos + 1) + if(!findtext(let, GLOB.is_punctuation)) //This won't handle things like Nyaaaa!~ but that's fine break - if(findtext(let,GLOB.is_punctuation)) - punctbuffer = let + punctbuffer //Note this isn't the same thing as using += - cutoff = pos + punctbuffer += let + cutoff += length(let) if(punctbuffer) //We clip down excessive punctuation to get the letter count lower and reduce repeats. It's not perfect but it helps. var/exclaim = FALSE var/question = FALSE var/periods = 0 - for(var/pos = length(punctbuffer), pos >= 0, pos--) - var/punct = copytext(punctbuffer, pos, (pos + 1) % length(punctbuffer)) - if(!exclaim && findtext(punct,"!")) + lentext = length(punctbuffer) + for(var/pos = 1, pos <= lentext, pos += length(let)) + let = punctbuffer[pos] + if(!exclaim && findtext(let, "!")) exclaim = TRUE - if(!question && findtext(punct,"?")) + if(question) + break + if(!question && findtext(let, "?")) question = TRUE - if(!exclaim && !question && findtext(punct,".")) + if(exclaim) + break + if(!exclaim && !question && findtext(let, ".")) //? and ! take priority over periods periods += 1 if(exclaim) if(question) @@ -643,15 +631,13 @@ GLOBAL_LIST_INIT(binary, list("0","1")) punctbuffer = "!" else if(question) punctbuffer = "?" - else if(periods) - if(periods > 1) - punctbuffer = "..." - else - punctbuffer = "" //Grammer nazis be damned - buffer = copytext(buffer, 1, cutoff) + punctbuffer - if(!findtext(buffer,GLOB.is_alphanumeric)) - continue - if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted) + else if(periods > 1) + punctbuffer = "..." + else + punctbuffer = "" //Grammer nazis be damned + buffer = copytext(buffer, 1, -cutoff) + punctbuffer + lentext = length_char(buffer) + if(!buffer || lentext > 280 || lentext <= cullshort || (buffer in accepted)) continue accepted += buffer @@ -688,7 +674,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/leng = length(string) - var/next_space = findtext(string, " ", next_backslash + 1) + var/next_space = findtext(string, " ", next_backslash + length(string[next_backslash])) if(!next_space) next_space = leng - next_backslash @@ -696,8 +682,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return string var/base = next_backslash == 1 ? "" : copytext(string, 1, next_backslash) - var/macro = lowertext(copytext(string, next_backslash + 1, next_space)) - var/rest = next_backslash > leng ? "" : copytext(string, next_space + 1) + var/macro = lowertext(copytext(string, next_backslash + length(string[next_space]), next_space)) + var/rest = next_backslash > leng ? "" : copytext(string, next_space + length(string[next_space])) //See https://secure.byond.com/docs/ref/info.html#/DM/text/macros switch(macro) @@ -769,28 +755,24 @@ GLOBAL_LIST_INIT(binary, list("0","1")) return "[number]\th" /proc/unintelligize(message) - var/prefix=copytext(message,1,2) + var/regex/word_boundaries = regex(@"\b[\S]+\b", "g") + var/prefix = message[1] if(prefix == ";") - message = copytext(message,2) - else if(prefix in list(":","#")) - prefix += copytext(message,2,3) - message = copytext(message,3) + message = copytext(message, 1 + length(prefix)) + else if(prefix in list(":", "#")) + prefix += message[1 + length(prefix)] + message = copytext(message, length(prefix)) else - prefix="" + prefix = "" - var/list/words = splittext(message," ") var/list/rearranged = list() - for(var/i=1;i<=words.len;i++) - var/cword = pick(words) - words.Remove(cword) - var/suffix = copytext(cword,length(cword)-1,length(cword)) - while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) - cword = copytext(cword,1 ,length(cword)-1) - suffix = copytext(cword,length(cword)-1,length(cword) ) + while(word_boundaries.Find(message)) + var/cword = word_boundaries.match if(length(cword)) rearranged += cword - message = "[prefix][jointext(rearranged," ")]" - . = message + shuffle_inplace(rearranged) + return "[prefix][jointext(rearranged, " ")]" + #define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97)) #define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1)) \ No newline at end of file diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index 9be806fc54..3c1e1eff12 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -8,14 +8,15 @@ index = findtext(t, char) return t -proc/TextPreview(var/string,var/len=40) - if(length(string) <= len) - if(!length(string)) +/proc/TextPreview(string, len = 40) + var/char_len = length_char(string) + if(char_len <= len) + if(char_len) return "\[...\]" else return string else - return "[copytext(string, 1, 37)]..." + return "[copytext_char(string, 1, 37)]..." GLOBAL_LIST_EMPTY(mentorlog) GLOBAL_PROTECT(mentorlog) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 823e893670..09047d32bf 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -542,17 +542,17 @@ //assumes format #RRGGBB #rrggbb /proc/color_hex2num(A) - if(!A) + if(!A || length(A) != length_char(A)) return 0 - var/R = hex2num(copytext(A,2,4)) - var/G = hex2num(copytext(A,4,6)) - var/B = hex2num(copytext(A,6,0)) + var/R = hex2num(copytext(A, 2, 4)) + var/G = hex2num(copytext(A, 4, 6)) + var/B = hex2num(copytext(A, 6, 0)) return R+G+B //word of warning: using a matrix like this as a color value will simplify it back to a string after being set /proc/color_hex2color_matrix(string) var/length = length(string) - if(length != 7 && length != 9) + if((length != 7 && length != 9) || length != length_char(string)) return color_matrix_identity() var/r = hex2num(copytext(string, 2, 4))/255 var/g = hex2num(copytext(string, 4, 6))/255 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2f960e350b..86dde3d6a6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -6,25 +6,18 @@ //Inverts the colour of an HTML string /proc/invertHTML(HTMLstring) - - if (!( istext(HTMLstring) )) + if(!istext(HTMLstring)) CRASH("Given non-text argument!") return - else - if (length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - return + else if(length(HTMLstring) != 7) + CRASH("Given non-HTML argument!") + return + else if(length_char(HTMLstring) != 7) + CRASH("Given non-hex symbols in argument!") var/textr = copytext(HTMLstring, 2, 4) var/textg = copytext(HTMLstring, 4, 6) var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r, 2) - textg = num2hex(255 - g, 2) - textb = num2hex(255 - b, 2) - return text("#[][][]", textr, textg, textb) - return + return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb)) /proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams. if(!start || !end) @@ -184,15 +177,15 @@ Turf and target are separate in case you want to teleport some distance from a t //Returns whether or not a player is a guest using their ckey as an input /proc/IsGuestKey(key) if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx - return 0 + return FALSE var/i, ch, len = length(key) - for (i = 7, i <= len, ++i) + for (i = 7, i <= len, ++i) //we know the first 6 chars are Guest- ch = text2ascii(key, i) - if (ch < 48 || ch > 57) - return 0 - return 1 + if (ch < 48 || ch > 57) //0-9 + return FALSE + return TRUE //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() /mob/proc/apply_pref_name(role, client/C) @@ -1314,7 +1307,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /proc/GUID() var/const/GUID_VERSION = "b" var/const/GUID_VARIANT = "d" - var/node_id = copytext(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) + var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]" @@ -1501,3 +1494,47 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return -1 else return 0 + +// Converts browser keycodes to BYOND keycodes. +/proc/browser_keycode_to_byond(keycode) + keycode = text2num(keycode) + switch(keycode) + // letters and numbers + if(65 to 90, 48 to 57) + return ascii2text(keycode) + if(17) + return "Ctrl" + if(18) + return "Alt" + if(16) + return "Shift" + if(37) + return "West" + if(38) + return "North" + if(39) + return "East" + if(40) + return "South" + if(45) + return "Insert" + if(46) + return "Delete" + if(36) + return "Northwest" + if(35) + return "Southwest" + if(33) + return "Northeast" + if(34) + return "Southeast" + if(112 to 123) + return "F[keycode-111]" + if(96 to 105) + return "Numpad[keycode-96]" + if(188) + return "," + if(190) + return "." + if(189) + return "-" \ No newline at end of file diff --git a/code/_compile_options.dm b/code/_compile_options.dm index af948086df..fe4761ddcd 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -39,6 +39,26 @@ #error You need version 512 or higher #endif +//Compatability -- These procs were added in 513.1493, not 513.1490 +//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb +#if DM_BUILD < 1493 +#define length_char(args...) length(args) +#define text2ascii_char(args...) text2ascii(args) +#define copytext_char(args...) copytext(args) +#define splittext_char(args...) splittext(args) +#define spantext_char(args...) spantext(args) +#define nonspantext_char(args...) nonspantext(args) +#define findtext_char(args...) findtext(args) +#define findtextEx_char(args...) findtextEx(args) +#define findlasttext_char(args...) findlasttext(args) +#define findlasttextEx_char(args...) findlasttextEx(args) +#define replacetext_char(args...) replacetext(args) +#define replacetextEx_char(args...) replacetextEx(args) +// /regex procs +#define Find_char(args...) Find(args) +#define Replace_char(args...) Replace(args) +#endif + //Additional code for the above flags. #ifdef TESTING #warn compiling in TESTING mode. testing() debug messages will be visible. diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index ae385339be..ffad931cd8 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -91,13 +91,7 @@ GLOBAL_LIST_INIT(all_types_bloods,list( "BUG" )) -GLOBAL_LIST_INIT(blood_types, list( - "blood", - "jellyblood" +GLOBAL_LIST_INIT(blood_reagent_types, list( + /datum/reagent/blood, + /datum/reagent/blood/jellyblood )) - -GLOBAL_LIST_INIT(blood_id_types, list( - "blood" = /datum/reagent/blood, - "jellyblood" = /datum/reagent/blood/jellyblood - )) - diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 2d5d2388ec..ba75fbfc9c 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -46,6 +46,9 @@ GLOBAL_PROTECT(lastsignalers) GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was GLOBAL_PROTECT(lawchanges) +GLOBAL_VAR(tgui_log) +GLOBAL_PROTECT(tgui_log) + GLOBAL_LIST_EMPTY(combatlog) GLOBAL_PROTECT(combatlog) GLOBAL_LIST_EMPTY(IClog) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 2a8289697b..ec4784bd1f 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -140,10 +140,7 @@ if(obj_flags & EMAGGED) return - if(locked) - bolt_raise(usr) - else - bolt_drop(usr) + toggle_bolt(usr) /obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. if(obj_flags & EMAGGED) @@ -165,10 +162,7 @@ if(obj_flags & EMAGGED) return - if(!emergency) - emergency_on(usr) - else - emergency_off(usr) + toggle_emergency(usr) /* APC */ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 9bf59d5e76..e8a57bb257 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -319,9 +319,11 @@ /mob/proc/ShiftClickOn(atom/A) A.ShiftClick(src) return + /atom/proc/ShiftClick(mob/user) - SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) - user.examinate(src) + var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) + if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) + user.examinate(src) return /* diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index dba9a59748..e9f325fb10 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -50,11 +50,6 @@ zone_select.update_icon() static_inventory += zone_select - using = new /obj/screen/craft - using.icon = ui_style - using.hud = src - static_inventory += using - using = new /obj/screen/area_creator using.icon = ui_style using.hud = src diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 23e820457c..a6d7286e80 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -91,13 +91,6 @@ var/obj/screen/using var/obj/screen/inventory/inv_box - using = new /obj/screen/craft - using.icon = ui_style - if(!widescreenlayout) // CIT CHANGE - using.screen_loc = ui_boxcraft // CIT CHANGE - using.hud = src - static_inventory += using - using = new/obj/screen/language_menu using.icon = ui_style if(!widescreenlayout) // CIT CHANGE diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index c8926507bc..15d1d3b717 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -66,12 +66,6 @@ icon_state = "craft" screen_loc = ui_crafting -/obj/screen/craft/Click() - var/mob/living/M = usr - if(isobserver(usr)) - return - M.OpenCraftingMenu() - /obj/screen/area_creator name = "create new area" icon = 'icons/mob/screen_midnight.dmi' @@ -297,6 +291,9 @@ icon_state = "internal0" else if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + if(HAS_TRAIT(C, TRAIT_NO_INTERNALS)) + to_chat(C, "Due to cumbersome equipment or anatomy, you are currently unable to use internals!") + return var/obj/item/clothing/check var/internals = FALSE diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index d97e7c379a..d7323700e4 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -171,7 +171,8 @@ key_name = copytext(str_val, 1, key_pos) if(lowercase) key_name = lowertext(key_name) - key_value = copytext(str_val, key_pos + 1) + if(key_pos) + key_value = copytext(str_val, key_pos + length(str_val[key_pos])) var/new_key var/new_value var/continue_check_value diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index ad1f869057..974a0c0e88 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -109,13 +109,13 @@ if(!L) continue - var/firstchar = copytext(L, 1, 2) + var/firstchar = L[1] if(firstchar == "#") continue var/lockthis = firstchar == "@" if(lockthis) - L = copytext(L, 2) + L = copytext(L, length(firstchar) + 1) var/pos = findtext(L, " ") var/entry = null @@ -123,7 +123,7 @@ if(pos) entry = lowertext(copytext(L, 1, pos)) - value = copytext(L, pos + 1) + value = copytext(L, pos + length(L[pos])) else entry = lowertext(L) @@ -269,7 +269,7 @@ t = trim(t) if(length(t) == 0) continue - else if(copytext(t, 1, 2) == "#") + else if(t[1] == "#") continue var/pos = findtext(t, " ") @@ -278,7 +278,7 @@ if(pos) command = lowertext(copytext(t, 1, pos)) - data = copytext(t, pos + 1) + data = copytext(t, pos + length(t[pos])) else command = lowertext(t) @@ -364,6 +364,29 @@ runnable_modes[M] = final_weight return runnable_modes +/datum/controller/configuration/proc/get_runnable_storytellers() + var/list/datum/dynamic_storyteller/runnable_storytellers = new + var/list/probabilities = Get(/datum/config_entry/keyed_list/storyteller_weight) + var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust) + for(var/T in storyteller_cache) + var/datum/dynamic_storyteller/S = T + var/config_tag = initial(S.config_tag) + var/final_weight = initial(S.weight) + if(probabilities[config_tag]<=0) + continue + final_weight = probabilities[config_tag] + if(SSpersistence.saved_storytellers.len == 3 && repeated_mode_adjust.len == 3) + var/name = initial(S.name) + var/recent_round = min(SSpersistence.saved_storytellers.Find(name),3) + var/adjustment = 0 + while(recent_round) + adjustment += repeated_mode_adjust[recent_round] + recent_round = SSpersistence.saved_modes.Find(name,recent_round+1,0) + final_weight *= ((100-adjustment)/100) + runnable_storytellers[S] = final_weight + return runnable_storytellers + + /datum/controller/configuration/proc/get_runnable_midround_modes(crew) var/list/datum/game_mode/runnable_modes = new var/list/probabilities = Get(/datum/config_entry/keyed_list/probability) diff --git a/code/controllers/configuration/entries/dynamic.dm b/code/controllers/configuration/entries/dynamic.dm index 7f3e16d57e..4c03de4678 100644 --- a/code/controllers/configuration/entries/dynamic.dm +++ b/code/controllers/configuration/entries/dynamic.dm @@ -88,3 +88,7 @@ /datum/config_entry/number/dynamic_warops_cost config_entry_value = 10 min_val = 0 + +/datum/config_entry/keyed_list/storyteller_weight + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 2b3d9d2f72..c3ae90cc1b 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -431,3 +431,7 @@ /datum/config_entry/flag/log_pictures /datum/config_entry/flag/picture_logging_camera + +/datum/config_entry/number/max_bunker_days + config_entry_value = 7 + min_val = 1 diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 2a59558bcd..52d2fe45cd 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -239,7 +239,6 @@ SUBSYSTEM_DEF(air) if (MC_TICK_CHECK) return - /datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) active_turfs -= T SSair_turfs.currentrun -= T @@ -257,7 +256,7 @@ SUBSYSTEM_DEF(air) #ifdef VISUALIZE_ACTIVE_TURFS T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY) #endif - T.excited = 1 + T.excited = TRUE active_turfs |= T SSair_turfs.currentrun |= T if(blockchanges && T.excited_group) diff --git a/code/controllers/subsystem/air_turfs.dm b/code/controllers/subsystem/air_turfs.dm index 2902940bf9..9dd41aede5 100644 --- a/code/controllers/subsystem/air_turfs.dm +++ b/code/controllers/subsystem/air_turfs.dm @@ -11,7 +11,6 @@ SUBSYSTEM_DEF(air_turfs) /datum/controller/subsystem/air_turfs/fire(resumed = 0) var/fire_count = times_fired - //cache for sanic speed if (!resumed) src.currentrun = SSair.active_turfs.Copy() //cache for sanic speed (lists are references anyways) diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm index d17cce70f9..02e7bc7aab 100644 --- a/code/controllers/subsystem/fail2topic.dm +++ b/code/controllers/subsystem/fail2topic.dm @@ -31,16 +31,18 @@ SUBSYSTEM_DEF(fail2topic) return ..() /datum/controller/subsystem/fail2topic/fire() - for(var/i in 1 to length(rate_limiting)) - var/ip = rate_limiting[i] - var/last_attempt = rate_limiting[ip] - - if (world.time - last_attempt > rate_limit) - rate_limiting -= ip - fail_counts -= ip - - if (MC_TICK_CHECK) - return + if(length(rate_limiting)) + var/i = 1 + while(i <= length(rate_limiting)) + var/ip = rate_limiting[i] + var/last_attempt = rate_limiting[ip] + if(world.time - last_attempt > rate_limit) + rate_limiting -= ip + fail_counts -= ip + else //if we remove that, and the next element is in its place. check that instead of incrementing. + ++i + if(MC_TICK_CHECK) + return /datum/controller/subsystem/fail2topic/Shutdown() DropFirewallRule() diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index cc09ca816e..0970b23a16 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -114,6 +114,6 @@ SUBSYSTEM_DEF(input) /datum/controller/subsystem/input/fire() var/list/clients = GLOB.clients // Let's sing the list cache song - for(var/i in 1 to clients.len) + for(var/i in 1 to length(clients)) var/client/C = clients[i] C.keyLoop() diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 8c8ad2d337..4850a67646 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -37,6 +37,8 @@ SUBSYSTEM_DEF(mapping) var/datum/space_level/empty_space var/num_of_res_levels = 1 + var/stat_map_name = "Loading..." + //dlete dis once #39770 is resolved /datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() if(!config) @@ -45,6 +47,7 @@ SUBSYSTEM_DEF(mapping) #else config = load_map_config(error_if_missing = FALSE) #endif + stat_map_name = config.map_name /datum/controller/subsystem/mapping/Initialize(timeofday) HACK_LoadMapConfig() @@ -330,7 +333,10 @@ GLOBAL_LIST_EMPTY(the_station_areas) return next_map_config = VM - return TRUE + + . = TRUE + + stat_map_name = "[config.map_name] (Next: [next_map_config.map_name])" /datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup var/list/filelist = flist(path) diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 1ecbbede1f..78b2e63cf2 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(nightshift) /datum/controller/subsystem/nightshift/proc/check_nightshift() var/emergency = GLOB.security_level >= SEC_LEVEL_RED var/announcing = TRUE - var/time = STATION_TIME(FALSE) + var/time = STATION_TIME(FALSE, world.time) var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time) if(high_security_mode != emergency) high_security_mode = emergency diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 5aa109b63a..dd9848e465 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -39,34 +39,34 @@ SUBSYSTEM_DEF(pai) switch(option) if("name") - t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text + t = reject_bad_name(stripped_input(usr, "Enter a name for your pAI", "pAI Name", candidate.name, MAX_NAME_LEN), TRUE) if(t) - candidate.name = copytext(sanitize(t),1,MAX_NAME_LEN) + candidate.name = t if("desc") - t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message + t = stripped_multiline_input(usr, "Enter a description for your pAI", "pAI Description", candidate.description, MAX_MESSAGE_LEN) if(t) - candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.description = t if("role") - t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text + t = stripped_input(usr, "Enter a role for your pAI", "pAI Role", candidate.role, MAX_MESSAGE_LEN) if(t) - candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.role = t if("ooc") - t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message + t = stripped_multiline_input(usr, "Enter any OOC comments", "pAI OOC Comments", candidate.comments, MAX_MESSAGE_LEN) if(t) - candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + candidate.comments = t if("save") candidate.savefile_save(usr) if("load") candidate.savefile_load(usr) //In case people have saved unsanitized stuff. if(candidate.name) - candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN) + candidate.name = copytext_char(sanitize(candidate.name),1,MAX_NAME_LEN) if(candidate.description) - candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN) + candidate.description = copytext_char(sanitize(candidate.description),1,MAX_MESSAGE_LEN) if(candidate.role) - candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN) + candidate.role = copytext_char(sanitize(candidate.role),1,MAX_MESSAGE_LEN) if(candidate.comments) - candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) + candidate.comments = copytext_char(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) if("submit") if(isobserver(usr)) diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index e43c8f21a2..de2ff17a97 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) var/list/saved_dynamic_rules = list(list(),list(),list()) - var/list/saved_storytellers = list("foo","bar","baz","foo again","bar again") + var/list/saved_storytellers = list("foo","bar","baz") var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() @@ -39,6 +39,7 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() + LoadPanicBunker() return ..() /datum/controller/subsystem/persistence/proc/LoadSatchels() @@ -190,6 +191,7 @@ SUBSYSTEM_DEF(persistence) if(!json) return saved_storytellers = json["data"] + saved_storytellers.len = 3 /datum/controller/subsystem/persistence/proc/LoadRecentMaps() var/json_file = file("data/RecentMaps.json") @@ -259,6 +261,16 @@ SUBSYSTEM_DEF(persistence) if(CONFIG_GET(flag/use_antag_rep)) CollectAntagReputation() SaveRandomizedRecipes() + SavePanicBunker() + +/datum/controller/subsystem/persistence/proc/LoadPanicBunker() + var/bunker_path = file("data/bunker_passthrough.json") + if(fexists(bunker_path)) + var/list/json = json_decode(file2text(bunker_path)) + GLOB.bunker_passthrough = json["data"] + for(var/ckey in GLOB.bunker_passthrough) + if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) + GLOB.bunker_passthrough -= ckey /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") @@ -381,6 +393,13 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) +/datum/controller/subsystem/persistence/proc/SavePanicBunker() + var/json_file = file("data/bunker_passthrough.json") + var/list/file_data = list() + file_data["data"] = GLOB.bunker_passthrough + fdel(json_file) + WRITE_FILE(json_file,json_encode(file_data)) + /datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) var/list/ukeys = list() . = list() @@ -411,9 +430,7 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(json_file, json_encode(file_data)) /datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) - saved_storytellers.len = 5 - saved_storytellers[5] = saved_storytellers[4] - saved_storytellers[4] = saved_storytellers[3] + saved_storytellers.len = 3 saved_storytellers[3] = saved_storytellers[2] saved_storytellers[2] = saved_storytellers[1] saved_storytellers[1] = mode.storyteller.name diff --git a/code/controllers/subsystem/processing/networks.dm b/code/controllers/subsystem/processing/networks.dm index 03276d5b26..f7f16538a6 100644 --- a/code/controllers/subsystem/processing/networks.dm +++ b/code/controllers/subsystem/processing/networks.dm @@ -46,6 +46,6 @@ PROCESSING_SUBSYSTEM_DEF(networks) var/hex = md5(string) if(!hex) return //errored - . = "[copytext(hex, 1, 9)]" //16 ^ 8 possibilities I think. + . = "[copytext_char(hex, 1, 9)]" //16 ^ 8 possibilities I think. if(interfaces_by_id[.]) return resolve_collisions? make_address("[num2text(rand(HID_RESTRICTED_END, 999999999), 12)]"):null diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index a52bcf4607..10655981e5 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -35,7 +35,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) var/list/my_quirks = cli.prefs.all_quirks.Copy() var/list/cut if(job?.blacklisted_quirks) - cut = filter_quirks(my_quirks, job) + cut = filter_quirks(my_quirks, job.blacklisted_quirks) for(var/V in my_quirks) var/datum/quirk/Q = quirks[V] if(Q) @@ -63,11 +63,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/i in quirk_names) . += quirk_points_by_name(i) -/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, datum/job/job) +/datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, list/blacklisted_quirks) var/list/cut = list() var/list/banned_names = list() var/pointscut = 0 - for(var/i in job.blacklisted_quirks) + for(var/i in blacklisted_quirks) var/name = quirk_name_by_path(i) if(name) banned_names += name diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index b406a8ccad..4d9eefae5b 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -30,6 +30,7 @@ SUBSYSTEM_DEF(shuttle) var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving var/list/tradeBlockade = list() //Things blocking cargo from leaving. var/supplyBlocked = FALSE + var/emergency_shuttle_stat_text //supply shuttle stuff var/obj/docking_port/mobile/supply/supply @@ -118,6 +119,9 @@ SUBSYSTEM_DEF(shuttle) points += point_gain //Cargo stuff end + var/esETA = emergency?.getModeStr() + emergency_shuttle_stat_text = "[esETA? "[esETA] [emergency.getTimerStr()]" : ""]" + if(!SSmapping.clearing_reserved_turfs) while(transit_requesters.len) var/requester = popleft(transit_requesters) diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index b10d0af8c5..dacbac409d 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui) var/basehtml // The HTML base used for all UIs. /datum/controller/subsystem/tgui/PreInit() - basehtml = file2text('tgui/tgui.html') + basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html') /datum/controller/subsystem/tgui/Shutdown() close_all_uis() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c9562bcfd1..95daaf5d70 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -68,6 +68,8 @@ SUBSYSTEM_DEF(ticker) var/modevoted = FALSE //Have we sent a vote for the gamemode? + var/station_integrity = 100 // stored at roundend for use in some antag goals + /datum/controller/subsystem/ticker/Initialize(timeofday) load_mode() @@ -363,7 +365,7 @@ SUBSYSTEM_DEF(ticker) var/turf/epi = bomb.loc qdel(bomb) if(epi) - explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE) + explosion(epi, 512, 0, 0, 0, TRUE, TRUE, 0, TRUE) /datum/controller/subsystem/ticker/proc/create_characters() for(var/mob/dead/new_player/player in GLOB.player_list) diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index 3b19ae31cd..cd53c8f0ba 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(time_track) name = "Time Tracking" - wait = 600 + wait = 1 SECONDS flags = SS_NO_INIT|SS_NO_TICK_CHECK runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT @@ -16,23 +16,33 @@ SUBSYSTEM_DEF(time_track) var/last_tick_byond_time = 0 var/last_tick_tickcount = 0 + var/last_measurement = 0 + var/measurement_delay = 60 + + var/stat_time_text + var/time_dilation_text + /datum/controller/subsystem/time_track/fire() + stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [WORLDTIME2TEXT("hh:mm:ss")]\n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]\n\n[time_dilation_text]" - var/current_realtime = REALTIMEOFDAY - var/current_byondtime = world.time - var/current_tickcount = world.time/world.tick_lag + if(++last_measurement == measurement_delay) + last_measurement = 0 + var/current_realtime = REALTIMEOFDAY + var/current_byondtime = world.time + var/current_tickcount = world.time/world.tick_lag - if (!first_run) - var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag)) + if (!first_run) + var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag)) - time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100 + time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100 - time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) - time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) - time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) - else - first_run = FALSE - last_tick_realtime = current_realtime - last_tick_byond_time = current_byondtime - last_tick_tickcount = current_tickcount - SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) + time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current) + time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast) + time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg) + else + first_run = FALSE + last_tick_realtime = current_realtime + last_tick_byond_time = current_byondtime + last_tick_tickcount = current_tickcount + SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]"))) + time_dilation_text = "Time Dilation: [round(time_dilation_current,1)]% AVG:([round(time_dilation_avg_fast,1)]%, [round(time_dilation_avg,1)]%, [round(time_dilation_avg_slow,1)]%)" diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index c67a1620f1..2a7c4401f3 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -188,22 +188,44 @@ SUBSYSTEM_DEF(vote) choices[score_name]++ /datum/controller/subsystem/vote/proc/calculate_scores(var/blackbox_text) - var/list/scores_by_choice = list() for(var/choice in choices) - scores_by_choice += "[choice]" - scores_by_choice["[choice]"] = list() + scores += "[choice]" + scores["[choice]"] = 0 for(var/ckey in voted) var/list/this_vote = voted[ckey] - for(var/choice in choices) - if("[choice]" in this_vote && "[choice]" in scores_by_choice) - sorted_insert(scores_by_choice["[choice]"],this_vote["[choice]"],/proc/cmp_numeric_asc) - var/middle_score = round(GLOB.vote_score_options.len/2,1) - for(var/score_name in scores_by_choice) - var/list/score = scores_by_choice[score_name] - for(var/S in score) - scores[score_name] += S-middle_score + for(var/choice in this_vote) + scores["[choice]"] += this_vote["[choice]"] + var/min_score = 100 + var/max_score = -100 + for(var/score_name in scores) // normalize the scores from 0-1 + max_score=max(max_score,scores[score_name]) + min_score=min(min_score,scores[score_name]) + for(var/score_name in scores) + scores[score_name] = (scores[score_name]-min_score)/(max_score-min_score) SSblackbox.record_feedback("nested tally","voting",scores[score_name],list(blackbox_text,"Total scores",score_name)) +/datum/controller/subsystem/vote/proc/get_runoff_results(var/blackbox_text) + var/already_lost_runoff = list() + var/list/cur_choices = choices.Copy() + for(var/ckey in voted) + choices[choices[voted[ckey][1]]]++ // jesus christ how horrifying + for(var/_this_var_unused_ignore_it in 1 to choices.len) // if it takes more than this something REALLY wrong happened + for(var/ckey in voted) + cur_choices[cur_choices[voted[ckey][1]]]++ // jesus christ how horrifying + var/least_vote = 100000 + var/least_voted + for(var/i in 1 to cur_choices.len) + var/option = cur_choices[i] + if(cur_choices[option] > voted.len/2) + return list(option) + else if(cur_choices[option] < least_vote && !(option in already_lost_runoff)) + least_vote = cur_choices[option] + least_voted = i + already_lost_runoff += cur_choices[least_voted] + for(var/ckey in voted) + voted[ckey] -= least_voted + for(var/option in cur_choices) + cur_choices[option] = 0 /datum/controller/subsystem/vote/proc/announce_result() var/vote_title_text @@ -214,24 +236,22 @@ SUBSYSTEM_DEF(vote) else text += "[capitalize(mode)] Vote" vote_title_text = "[capitalize(mode)] Vote" - if(vote_system == RANKED_CHOICE_VOTING) + if(vote_system == SCHULZE_VOTING) calculate_condorcet_votes(vote_title_text) if(vote_system == SCORE_VOTING) - calculate_majority_judgement_vote(vote_title_text) calculate_scores(vote_title_text) - var/list/winners = get_result() + if(vote_system == MAJORITY_JUDGEMENT_VOTING) + calculate_majority_judgement_vote(vote_title_text) // nothing uses this at the moment + var/list/winners = vote_system == INSTANT_RUNOFF_VOTING ? get_runoff_results() : get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) if(was_roundtype_vote) stored_gamemode_votes = list() - if(!obfuscated && vote_system == RANKED_CHOICE_VOTING) - text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - if(mode == "mode tiers") - for(var/score_name in scores) - var/score = scores[score_name] - if(!score) - score = 0 - text = "\n[score_name]: [obfuscated ? "???" : score]" + if(!obfuscated) + if(vote_system == SCHULZE_VOTING) + text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" + if(vote_system == MAJORITY_JUDGEMENT_VOTING) + text += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" else for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] @@ -249,6 +269,15 @@ SUBSYSTEM_DEF(vote) text += "\nVote Result: [obfuscated ? "???" : .]" //CIT CHANGE - adds obfuscated votes else text += "\nDid not vote: [GLOB.clients.len-voted.len]" + else if(vote_system == SCORE_VOTING) + for(var/score_name in scores) + var/score = scores[score_name] + if(!score) + score = 0 + if(was_roundtype_vote) + stored_gamemode_votes[score_name] = score + text = "\n[score_name]: [obfuscated ? "???" : score]" + . = 1 else text += "Vote Result: Inconclusive - No Votes!" log_vote(text) @@ -258,7 +287,7 @@ SUBSYSTEM_DEF(vote) if(APPROVAL_VOTING,PLURALITY_VOTING) for(var/i=1,i<=choices.len,i++) SSblackbox.record_feedback("nested tally","voting",choices[choices[i]],list(vote_title_text,choices[i])) - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) for(var/i=1,i<=voted.len,i++) var/list/myvote = voted[voted[i]] if(islist(myvote)) @@ -266,13 +295,18 @@ SUBSYSTEM_DEF(vote) SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" - if(vote_system == RANKED_CHOICE_VOTING) - admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" - else if(vote_system == SCORE_VOTING) - admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" - for(var/i=1,i<=choices.len,i++) - var/votes = choices[choices[i]] - admintext += "\n[choices[i]]: [votes]" + if(vote_system != SCORE_VOTING) + if(vote_system == SCHULZE_VOTING) + admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" + else if(vote_system == MAJORITY_JUDGEMENT_VOTING) + admintext += "\nIt should be noted that this is not a raw tally of votes but the number of runoffs done by majority judgement!" + for(var/i=1,i<=choices.len,i++) + var/votes = choices[choices[i]] + admintext += "\n[choices[i]]: [votes]" + else + for(var/i=1,i<=scores.len,i++) + var/score = scores[scores[i]] + admintext += "\n[scores[i]]: [score]" message_admins(admintext) return . @@ -316,15 +350,13 @@ SUBSYSTEM_DEF(vote) if("dynamic") if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") - if(. == "Secret") - GLOB.master_mode = "secret" - SSticker.save_mode(.) - message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]") - log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") - else - GLOB.master_mode = "dynamic" - var/datum/dynamic_storyteller/S = config.pick_storyteller(.) - GLOB.dynamic_storyteller_type = S + GLOB.master_mode = "dynamic" + var/list/runnable_storytellers = config.get_runnable_storytellers() + for(var/T in runnable_storytellers) + var/datum/dynamic_storyteller/S = T + runnable_storytellers[S] *= scores[initial(S.name)] + var/datum/dynamic_storyteller/S = pickweightAllowZero(runnable_storytellers) + GLOB.dynamic_storyteller_type = S if("map") var/datum/map_config/VM = config.maplist[.] message_admins("The map has been voted for and will change to: [VM.map_name]") @@ -375,7 +407,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list(vote) choices[choices[vote]]++ return vote - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) if(usr.ckey in voted) if(vote in voted[usr.ckey]) voted[usr.ckey] -= vote @@ -384,7 +416,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = list() voted[usr.ckey] += vote saved -= usr.ckey - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) if(!(usr.ckey in voted)) voted += usr.ckey voted[usr.ckey] = list() @@ -444,15 +476,10 @@ SUBSYSTEM_DEF(vote) if("dynamic") for(var/T in config.storyteller_cache) var/datum/dynamic_storyteller/S = T - var/recent_rounds = 0 - for(var/i in 1 to SSpersistence.saved_storytellers.len) - if(SSpersistence.saved_storytellers[i] == initial(S.name)) - recent_rounds++ - if(recent_rounds < initial(S.weight)) + var/list/probabilities = CONFIG_GET(keyed_list/storyteller_weight) + if(probabilities[initial(S.config_tag)] > 0) choices.Add(initial(S.name)) choice_descs.Add(initial(S.desc)) - choices.Add("Secret") - choice_descs.Add("Standard secret. Switches mode if it wins.") if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) @@ -514,9 +541,9 @@ SUBSYSTEM_DEF(vote) . += "

Vote one.

" if(APPROVAL_VOTING) . += "

Vote any number of choices.

" - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) . += "

Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.

" - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) . += "

Grade the candidates by how much you like them.

" . += "

No-votes have no power--your opinion is only heard if you vote!

" . += "Time Left: [DisplayTimeText(end_time-world.time)]

" - if(RANKED_CHOICE_VOTING) + if(SCHULZE_VOTING,INSTANT_RUNOFF_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) var/vote = (islist(myvote) ? (myvote.Find(i)) : 0) @@ -553,7 +580,7 @@ SUBSYSTEM_DEF(vote) . += "(Saved!)" . += "(Load vote from save)" . += "(Reset votes)" - if(SCORE_VOTING) + if(SCORE_VOTING,MAJORITY_JUDGEMENT_VOTING) var/list/myvote = voted[C.ckey] for(var/i=1,i<=choices.len,i++) . += "
  • [choices[i]]" @@ -656,7 +683,7 @@ SUBSYSTEM_DEF(vote) voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode] if(islist(voted[usr.ckey])) var/malformed = FALSE - if(vote_system == SCORE_VOTING) + if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) for(var/thing in voted[usr.ckey]) if(!(thing in choices)) malformed = TRUE @@ -670,7 +697,7 @@ SUBSYSTEM_DEF(vote) to_chat(usr,"Your saved vote was malformed! Start over!") voted -= usr.ckey else - if(vote_system == SCORE_VOTING) + if(vote_system == SCORE_VOTING || vote_system == MAJORITY_JUDGEMENT_VOTING) submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"]))) else submit_vote(round(text2num(href_list["vote"]))) diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 1aa1341c9c..eaaab8da45 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -14,7 +14,7 @@ var/can_gain = TRUE var/random_gain = TRUE //can this be gained through random traumas? var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? - var/clonable = TRUE // will this transfer if the brain is cloned? + var/clonable = TRUE // will this transfer if the brain is cloned? - currently has no effect /datum/brain_trauma/Destroy() if(brain && brain.traumas) diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 9005a788b7..d8bfe2c35c 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -153,7 +153,7 @@ to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source)) /mob/camera/imaginary_friend/proc/friend_talk(message) - message = capitalize(trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))) + message = capitalize(trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN))) if(!message) return diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 235417d62c..d653671b5a 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -199,13 +199,16 @@ var/list/new_message = list() for(var/word in message_split) - var/suffix = copytext(word,-1) + var/suffix = "" + var/suffix_foundon = 0 + for(var/potential_suffix in list("." , "," , ";" , "!" , ":" , "?")) + suffix_foundon = findtext(word, potential_suffix, -length(potential_suffix)) + if(suffix_foundon) + suffix = potential_suffix + break - // Check if we have a suffix and break it out of the word - if(suffix in list("." , "," , ";" , "!" , ":" , "?")) - word = copytext(word,1,-1) - else - suffix = "" + if(suffix_foundon) + word = copytext(word, 1, suffix_foundon) word = html_decode(word) @@ -216,10 +219,9 @@ new_message += pick("uh","erm") break else - var/list/charlist = string2charlist(word) // Stupid shit code + var/list/charlist = text2charlist(word) shuffle_inplace(charlist) - charlist.len = round(charlist.len * 0.5,1) - new_message += html_encode(jointext(charlist,"")) + suffix + new_message += jointext(charlist, "") + suffix message = jointext(new_message, " ") diff --git a/code/datums/browser.dm b/code/datums/browser.dm index b226d85112..779391c4de 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -39,12 +39,12 @@ //title_image = ntitle_image /datum/browser/proc/add_stylesheet(name, file) - stylesheets["[ckey(name)].css"] = file - register_asset("[ckey(name)].css", file) - -/datum/browser/proc/add_script(name, file) - scripts["[ckey(name)].js"] = file - register_asset("[ckey(name)].js", file) + if(istype(name, /datum/asset/spritesheet)) + var/datum/asset/spritesheet/sheet = name + stylesheets["spritesheet_[sheet.name].css"] = "data/spritesheets/[sheet.name]" + else + stylesheets["[ckey(name)].css"] = file + register_asset("[ckey(name)].css", file) /datum/browser/proc/set_content(ncontent) content = ncontent diff --git a/code/modules/crafting/craft.dm b/code/datums/components/crafting/craft.dm similarity index 73% rename from code/modules/crafting/craft.dm rename to code/datums/components/crafting/craft.dm index 9f14b07bb5..5c21801c14 100644 --- a/code/modules/crafting/craft.dm +++ b/code/datums/components/crafting/craft.dm @@ -1,39 +1,51 @@ -/datum/personal_crafting +/datum/component/personal_crafting/Initialize() + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button) + +/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL) + var/datum/hud/H = user.hud_used + var/obj/screen/craft/C = new() + C.icon = H.ui_style + H.static_inventory += C + CL.screen += C + RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact) + +/datum/component/personal_crafting var/busy var/viewing_category = 1 //typical powergamer starting on the Weapons tab var/viewing_subcategory = 1 var/list/categories = list( - CAT_WEAPONRY, - CAT_ROBOT, - CAT_MISC, - CAT_PRIMAL, - CAT_FOOD, - CAT_CLOTHING) - var/list/subcategories = list( - list( //Weapon subcategories - CAT_WEAPON, - CAT_AMMO), - CAT_NONE, //Robot subcategories - CAT_NONE, //Misc subcategories - CAT_NONE, //Tribal subcategories - list( //Food subcategories - CAT_BREAD, - CAT_BURGER, - CAT_CAKE, - CAT_EGG, - CAT_FISH, - CAT_ICE, //Called Frozen - CAT_MEAT, - CAT_MISCFOOD, - CAT_PASTRY, - CAT_PIE, - CAT_PIZZA, - CAT_SALAD, - CAT_SANDWICH, - CAT_SOUP, - CAT_SPAGHETTI), - CAT_NONE) //Clothing subcategories + CAT_WEAPONRY = list( + CAT_WEAPON, + CAT_AMMO, + ), + CAT_ROBOT = CAT_NONE, + CAT_MISC = CAT_NONE, + CAT_PRIMAL = CAT_NONE, + CAT_FOOD = list( + CAT_BREAD, + CAT_BURGER, + CAT_CAKE, + CAT_EGG, + CAT_FISH, + CAT_ICE, + CAT_MEAT, + CAT_MISCFOOD, + CAT_PASTRY, + CAT_PIE, + CAT_PIZZA, + CAT_SALAD, + CAT_SANDWICH, + CAT_SOUP, + CAT_SPAGHETTI, + ), + CAT_DRINK = CAT_NONE, + CAT_CLOTHING = CAT_NONE, + ) + var/cur_category = CAT_NONE + var/cur_subcategory = CAT_NONE var/datum/action/innate/crafting/button var/display_craftable_only = FALSE var/display_compact = TRUE @@ -53,13 +65,15 @@ -/datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) +/datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents) contents = contents["other"] main_loop: for(var/A in R.reqs) var/needed_amount = R.reqs[A] for(var/B in contents) if(ispath(B, A)) + if (R.blacklist.Find(B)) + continue if(contents[B] >= R.reqs[A]) continue main_loop else @@ -68,13 +82,13 @@ continue main_loop else continue - return 0 + return FALSE for(var/A in R.chem_catalysts) if(contents[A] < R.chem_catalysts[A]) - return 0 - return 1 + return FALSE + return TRUE -/datum/personal_crafting/proc/get_environment(mob/user) +/datum/component/personal_crafting/proc/get_environment(mob/user) . = list() for(var/obj/item/I in user.held_items) . += I @@ -89,8 +103,10 @@ if(AM.flags_1 & HOLOGRAM_1) continue . += AM + for(var/slot in list(SLOT_R_STORE, SLOT_L_STORE)) + . += user.get_item_by_slot(slot) -/datum/personal_crafting/proc/get_surroundings(mob/user) +/datum/component/personal_crafting/proc/get_surroundings(mob/user) . = list() .["tool_behaviour"] = list() .["other"] = list() @@ -111,7 +127,7 @@ .["other"][A.type] += A.volume .["other"][I.type] += 1 -/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) +/datum/component/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) if(!R.tools.len) return TRUE var/list/possible_tools = list() @@ -142,7 +158,7 @@ return FALSE return TRUE -/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) +/datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) var/list/contents = get_surroundings(user) var/send_feedback = 1 if(check_contents(R, contents)) @@ -156,9 +172,11 @@ var/list/parts = del_reqs(R, user) var/atom/movable/I = new R.result (get_turf(user.loc)) I.CheckParts(parts, R) + if(isitem(I)) + user.put_in_hands(I) if(send_feedback) SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) - log_craft("[I] crafted by [user] at [loc_name(I.loc)]") + log_craft("[I] crafted by [user] at [loc_name(I.loc)]") return 0 return "." return ", missing tool." @@ -189,7 +207,7 @@ del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already */ -/datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user) +/datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user) var/list/surroundings var/list/Deletion = list() . = list() @@ -287,122 +305,106 @@ Deletion.Cut(Deletion.len) qdel(DL) +/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user) + if(user == parent) + ui_interact(user) -/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state) +/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) + cur_category = categories[1] + if(islist(categories[cur_category])) + var/list/subcats = categories[cur_category] + cur_subcategory = subcats[1] + else + cur_subcategory = CAT_NONE ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state) ui.open() -/datum/personal_crafting/ui_data(mob/user) +/datum/component/personal_crafting/ui_data(mob/user) var/list/data = list() - var/list/subs = list() - var/cur_subcategory = CAT_NONE - var/cur_category = categories[viewing_category] - if (islist(subcategories[viewing_category])) - subs = subcategories[viewing_category] - cur_subcategory = subs[viewing_subcategory] data["busy"] = busy - data["prev_cat"] = categories[prev_cat()] - data["prev_subcat"] = subs[prev_subcat()] data["category"] = cur_category data["subcategory"] = cur_subcategory - data["next_cat"] = categories[next_cat()] - data["next_subcat"] = subs[next_subcat()] data["display_craftable_only"] = display_craftable_only data["display_compact"] = display_compact var/list/surroundings = get_surroundings(user) - var/list/can_craft = list() - var/list/cant_craft = list() + var/list/craftability = list() for(var/rec in GLOB.crafting_recipes) var/datum/crafting_recipe/R = rec + if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. continue + if((R.category != cur_category) || (R.subcategory != cur_subcategory)) continue - if(check_contents(R, surroundings)) - can_craft += list(build_recipe_data(R)) + + craftability["[REF(R)]"] = check_contents(R, surroundings) + + data["craftability"] = craftability + return data + +/datum/component/personal_crafting/ui_static_data(mob/user) + var/list/data = list() + + var/list/crafting_recipes = list() + for(var/rec in GLOB.crafting_recipes) + var/datum/crafting_recipe/R = rec + + if(R.name == "") //This is one of the invalid parents that sneaks in + continue + + if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. + continue + + if(isnull(crafting_recipes[R.category])) + crafting_recipes[R.category] = list() + + if(R.subcategory == CAT_NONE) + crafting_recipes[R.category] += list(build_recipe_data(R)) else - cant_craft += list(build_recipe_data(R)) - data["can_craft"] = can_craft - data["cant_craft"] = cant_craft + if(isnull(crafting_recipes[R.category][R.subcategory])) + crafting_recipes[R.category][R.subcategory] = list() + crafting_recipes[R.category]["has_subcats"] = TRUE + crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R)) + + data["crafting_recipes"] = crafting_recipes return data -/datum/personal_crafting/ui_act(action, params) +/datum/component/personal_crafting/ui_act(action, params) if(..()) return switch(action) if("make") - var/datum/crafting_recipe/TR = locate(params["recipe"]) + var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes busy = TRUE - ui_interact(usr) //explicit call to show the busy display + ui_interact(usr) var/fail_msg = construct_item(usr, TR) if(!fail_msg) to_chat(usr, "[TR.name] constructed.") else to_chat(usr, "Construction failed[fail_msg]") busy = FALSE - ui_interact(usr) - if("forwardCat") //Meow - viewing_category = next_cat(FALSE) - . = TRUE - if("backwardCat") - viewing_category = prev_cat(FALSE) - . = TRUE - if("forwardSubCat") - viewing_subcategory = next_subcat() - . = TRUE - if("backwardSubCat") - viewing_subcategory = prev_subcat() - . = TRUE if("toggle_recipes") display_craftable_only = !display_craftable_only . = TRUE if("toggle_compact") display_compact = !display_compact . = TRUE + if("set_category") + if(!isnull(params["category"])) + cur_category = params["category"] + if(!isnull(params["subcategory"])) + if(params["subcategory"] == "0") + cur_subcategory = "" + else + cur_subcategory = params["subcategory"] + . = TRUE - -//Next works nicely with modular arithmetic -/datum/personal_crafting/proc/next_cat(readonly = TRUE) - if (!readonly) - viewing_subcategory = 1 - . = viewing_category % categories.len + 1 - -/datum/personal_crafting/proc/next_subcat() - if(islist(subcategories[viewing_category])) - var/list/subs = subcategories[viewing_category] - . = viewing_subcategory % subs.len + 1 - - -//Previous can go fuck itself -/datum/personal_crafting/proc/prev_cat(readonly = TRUE) - if (!readonly) - viewing_subcategory = 1 - if(viewing_category == categories.len) - . = viewing_category-1 - else - . = viewing_category % categories.len - 1 - if(. <= 0) - . = categories.len - -/datum/personal_crafting/proc/prev_subcat() - if(islist(subcategories[viewing_category])) - var/list/subs = subcategories[viewing_category] - if(viewing_subcategory == subs.len) - . = viewing_subcategory-1 - else - . = viewing_subcategory % subs.len - 1 - if(. <= 0) - . = subs.len - else - . = null - - -/datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R) +/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R) var/list/data = list() data["name"] = R.name data["ref"] = "[REF(R)]" diff --git a/code/modules/crafting/glassware.dm b/code/datums/components/crafting/glassware.dm similarity index 100% rename from code/modules/crafting/glassware.dm rename to code/datums/components/crafting/glassware.dm diff --git a/code/modules/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm similarity index 100% rename from code/modules/crafting/guncrafting.dm rename to code/datums/components/crafting/guncrafting.dm diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm new file mode 100644 index 0000000000..2b6f1a5b81 --- /dev/null +++ b/code/datums/components/crafting/recipes.dm @@ -0,0 +1,25 @@ +/datum/crafting_recipe + var/name = "" //in-game display name + var/list/reqs = list() //type paths of items consumed associated with how many are needed + var/list/blacklist = list() //type paths of items explicitly not allowed as an ingredient + var/result //type path of item resulting from this craft + var/list/tools = list() //type paths of items needed but not consumed + var/time = 30 //time in deciseconds + var/list/parts = list() //type paths of items that will be placed in the result + var/list/chem_catalysts = list() //like tools but for reagents + var/category = CAT_NONE //where it shows up in the crafting UI + var/subcategory = CAT_NONE + var/always_availible = TRUE //Set to FALSE if it needs to be learned first. + +/datum/crafting_recipe/New() + if(!(result in reqs)) + blacklist += result + +/** + * Run custom pre-craft checks for this recipe + * + * user: The /mob that initiated the crafting + * collected_requirements: A list of lists of /obj/item instances that satisfy reqs. Top level list is keyed by requirement path. + */ +/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements) + return TRUE diff --git a/code/modules/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm similarity index 100% rename from code/modules/crafting/recipes/recipes_clothing.dm rename to code/datums/components/crafting/recipes/recipes_clothing.dm diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm similarity index 100% rename from code/modules/crafting/recipes/recipes_misc.dm rename to code/datums/components/crafting/recipes/recipes_misc.dm diff --git a/code/modules/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm similarity index 100% rename from code/modules/crafting/recipes/recipes_primal.dm rename to code/datums/components/crafting/recipes/recipes_primal.dm diff --git a/code/modules/crafting/recipes/recipes_robot.dm b/code/datums/components/crafting/recipes/recipes_robot.dm similarity index 100% rename from code/modules/crafting/recipes/recipes_robot.dm rename to code/datums/components/crafting/recipes/recipes_robot.dm diff --git a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm similarity index 95% rename from code/modules/crafting/recipes/recipes_weapon_and_ammo.dm rename to code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index bc3a3dcf05..06f79396b8 100644 --- a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -18,6 +18,10 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON +/datum/crafting_recipe/strobeshield/New() + ..() + blacklist |= subtypesof(/obj/item/shield/riot/) + /datum/crafting_recipe/makeshiftshield name = "Makeshift Metal Shield" result = /obj/item/shield/makeshift @@ -109,6 +113,18 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON +/datum/crafting_recipe/switchblade_ms + name = "Switchblade" + result = /obj/item/switchblade/crafted + reqs = list(/obj/item/weaponcrafting/stock = 1, + /obj/item/weaponcrafting/receiver = 1, + /obj/item/kitchen/knife = 1, + /obj/item/stack/cable_coil = 2) + tools = list(TOOL_WELDER) + time = 45 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + ////////////////// ///BOMB CRAFTING// ////////////////// diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 6682c3901d..bf53414537 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -11,5 +11,5 @@ /datum/component/slippery/proc/Slip(datum/source, atom/movable/AM) var/mob/victim = AM - if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags) && callback) + if(istype(victim) && victim.slip(intensity, parent, lube_flags) && callback) callback.Invoke(victim) diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm index 9c8622d16e..4d3ecc8d17 100644 --- a/code/datums/components/storage/concrete/pockets.dm +++ b/code/datums/components/storage/concrete/pockets.dm @@ -56,7 +56,7 @@ /obj/item/scalpel, /obj/item/reagent_containers/syringe, /obj/item/dnainjector, /obj/item/reagent_containers/hypospray/medipen, /obj/item/reagent_containers/dropper, /obj/item/implanter, /obj/item/screwdriver, /obj/item/weldingtool/mini, - /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol + /obj/item/firing_pin, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/automatic/magrifle/pistol )) /datum/component/storage/concrete/pockets/shoes/clown/Initialize() diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 2c3b7518ba..5057253522 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -294,4 +294,4 @@ GLOBAL_LIST_EMPTY(uplinks) if(!T) return explosion(T,1,2,3) - qdel(parent) //Alternatively could brick the uplink. + qdel(parent) //Alternatively could brick the uplink. \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e387acbd0b..b7ec8f38dc 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -945,26 +945,7 @@ A.create_reagents(amount) if(A.reagents) - var/chosen_id - switch(alert(usr, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky")) - if("Search") - var/valid_id - while(!valid_id) - chosen_id = input(usr, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text - if(isnull(chosen_id)) //Get me out of here! - break - if(!ispath(text2path(chosen_id))) - chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) - if(ispath(chosen_id)) - valid_id = TRUE - else - valid_id = TRUE - if(!valid_id) - to_chat(usr, "A reagent with that ID doesn't exist!") - if("Choose from a list") - chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent) - if("I'm feeling lucky") - chosen_id = pick(subtypesof(/datum/reagent)) + var/chosen_id = choose_reagent_id(usr) if(chosen_id) var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num if(amount) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 6946a6a1d8..c34ab566cf 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -22,14 +22,16 @@ Bonus stealth = -3 resistance = -2 stage_speed = -2 - transmittable = -4 + transmittable = -2 level = 3 severity = 3 base_message_chance = 15 symptom_delay_min = 10 symptom_delay_max = 30 - threshold_desc = "Stage Speed 8: Causes choking more frequently.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Stage Speed 8" = "Causes choking more frequently.", + "Stealth 4" = "The symptom remains hidden until active." + ) /datum/symptom/choking/Start(datum/disease/advance/A) if(!..()) @@ -99,8 +101,10 @@ Bonus symptom_delay_min = 14 symptom_delay_max = 30 var/paralysis = FALSE - threshold_desc = "Stage Speed 8: Additionally synthesizes pancuronium and sodium thiopental inside the host.
    \ - Transmission 8: Doubles the damage caused by the symptom." + threshold_desc = list( + "Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.", + "Transmission 8" = "Doubles the damage caused by the symptom." + ) /datum/symptom/asphyxiation/Start(datum/disease/advance/A) diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index eb6c5342f9..b8a1064c34 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -29,9 +29,11 @@ Bonus symptom_delay_min = 10 symptom_delay_max = 30 var/brain_damage = FALSE - threshold_desc = "Resistance 6: Causes brain damage over time.
    \ - Transmission 6: Increases confusion duration.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 6" = "Causes brain damage over time.", + "Transmission 6" = "Increases confusion duration and strength.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/confusion/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm index 62c64159d1..cf15ec407a 100644 --- a/code/datums/diseases/advance/symptoms/cough.dm +++ b/code/datums/diseases/advance/symptoms/cough.dm @@ -29,12 +29,13 @@ BONUS symptom_delay_min = 2 symptom_delay_max = 15 var/infective = FALSE - threshold_desc = "Resistance 3: Host will drop small items when coughing.
    \ - Resistance 10: Occasionally causes coughing fits that stun the host.
    \ - Stage Speed 6: Increases cough frequency.
    \ - If Airborne: Coughing will infect bystanders.
    \ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Resistance 11" = "The host will drop small items when coughing.", + "Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.", + "Stage Speed 6" = "Increases cough frequency.", + "Transmission 7" = "Coughing will now infect bystanders up to 2 tiles away.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/cough/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index e0336506e3..b6dd185b36 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -28,8 +28,10 @@ Bonus base_message_chance = 100 symptom_delay_min = 25 symptom_delay_max = 80 - threshold_desc = "Resistance 9: Causes permanent deafness, instead of intermittent.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 9" = "Causes permanent deafness, instead of intermittent.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/deafness/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/dizzy.dm b/code/datums/diseases/advance/symptoms/dizzy.dm index b4b06be5ac..be444e3916 100644 --- a/code/datums/diseases/advance/symptoms/dizzy.dm +++ b/code/datums/diseases/advance/symptoms/dizzy.dm @@ -27,8 +27,10 @@ Bonus base_message_chance = 50 symptom_delay_min = 15 symptom_delay_max = 40 - threshold_desc = "Transmission 6: Also causes druggy vision.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Transmission 6" = "Also causes druggy vision.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/dizzy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/fever.dm b/code/datums/diseases/advance/symptoms/fever.dm index a178cba196..0348e39818 100644 --- a/code/datums/diseases/advance/symptoms/fever.dm +++ b/code/datums/diseases/advance/symptoms/fever.dm @@ -28,9 +28,10 @@ Bonus symptom_delay_min = 10 symptom_delay_max = 30 var/unsafe = FALSE //over the heat threshold - threshold_desc = "Resistance 5: Increases fever intensity, fever can overheat and harm the host.
    \ - Resistance 10: Further increases fever intensity." - + threshold_desc = list( + "Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.", + "Resistance 10" = "Further increases fever intensity.", + ) /datum/symptom/fever/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm index 6429db9439..ea1897b67d 100644 --- a/code/datums/diseases/advance/symptoms/fire.dm +++ b/code/datums/diseases/advance/symptoms/fire.dm @@ -19,9 +19,9 @@ Bonus name = "Spontaneous Combustion" desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously." - stealth = 1 + stealth = -1 resistance = -4 - stage_speed = -4 + stage_speed = -3 transmittable = -4 level = 6 severity = 5 @@ -29,11 +29,12 @@ Bonus symptom_delay_min = 20 symptom_delay_max = 75 var/infective = FALSE - threshold_desc = "Stage Speed 4: Increases the intensity of the flames.
    \ - Stage Speed 8: Further increases flame intensity.
    \ - Transmission 8: Host will spread the virus through skin flakes when bursting into flame.
    \ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Stage Speed 4" = "Increases the intensity of the flames.", + "Stage Speed 8" = "Further increases flame intensity.", + "Transmission 8" = "Host will spread the virus through skin flakes when bursting into flame.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/fire/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 48668afc90..774d97202e 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -22,7 +22,7 @@ Bonus stealth = -3 resistance = -4 stage_speed = 0 - transmittable = -4 + transmittable = -3 level = 6 severity = 5 base_message_chance = 50 @@ -30,8 +30,11 @@ Bonus symptom_delay_max = 60 var/bleed = FALSE var/pain = FALSE - threshold_desc = "Resistance 7: Host will bleed profusely during necrosis.
    \ - Transmission 8: Causes extreme pain to the host, weakening it." + threshold_desc = list( + "Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.", + "Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.", + "Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met." + ) /datum/symptom/flesh_eating/Start(datum/disease/advance/A) if(!..()) @@ -96,8 +99,11 @@ Bonus symptom_delay_max = 6 var/chems = FALSE var/zombie = FALSE - threshold_desc = "Stage Speed 7: Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.
    \ - Stealth 5: The symptom remains hidden until active." + threshold_desc = list( + "Stage Speed 7" = "Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.", + "Stealth 5" = "The symptom remains hidden until active.", + ) + /datum/symptom/flesh_death/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 7f21b03dff..f6780df3fa 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -30,9 +30,12 @@ Bonus symptom_delay_min = 60 symptom_delay_max = 120 var/no_reset = FALSE - threshold_desc = "Resistance 8: Causes two harmful mutations at once.
    \ - Stage Speed 10: Increases mutation frequency.
    \ - Stealth 5: The mutations persist even if the virus is cured." + threshold_desc = list( + "Resistance 8" = "The negative and mildly negative mutations caused by the virus are mutadone-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).", + "Resistance 14" = "The host's genetic alterations are not undone when the virus is cured.", + "Stage Speed 10" = "The virus activates dormant mutations at a much faster rate.", + "Stealth 5" = "Only activates negative mutations in hosts." + ) /datum/symptom/genetic_mutation/Activate(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index 873d960524..4778e7d863 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -18,7 +18,7 @@ Bonus /datum/symptom/hallucigen name = "Hallucigen" desc = "The virus stimulates the brain, causing occasional hallucinations." - stealth = -2 + stealth = -1 resistance = -3 stage_speed = -3 transmittable = -1 @@ -28,8 +28,10 @@ Bonus symptom_delay_min = 25 symptom_delay_max = 90 var/fake_healthy = FALSE - threshold_desc = "Stage Speed 7: Increases the amount of hallucinations.
    \ - Stealth 4: The virus mimics positive symptoms.." + threshold_desc = list( + "Stage Speed 7" = "Increases the amount of hallucinations.", + "Stealth 4" = "The virus mimics positive symptoms.", + ) /datum/symptom/hallucigen/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 72b03000ed..944333d9cf 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -29,9 +29,11 @@ BONUS base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 30 - threshold_desc = "Stage Speed 6: Headaches will cause severe pain, that weakens the host.
    \ - Stage Speed 9: Headaches become less frequent but far more intense, preventing any action from the host.
    \ - Stealth 4: Reduces headache frequency until later stages." + threshold_desc = list( + "Stage Speed 6" = "Headaches will cause severe pain, that weakens the host.", + "Stage Speed 9" = "Headaches become less frequent but far more intense, preventing any action from the host.", + "Stealth 4" = "Reduces headache frequency until later stages.", + ) /datum/symptom/headache/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index c1b3526f41..cf14da36a0 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -10,9 +10,10 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/passive_message = "" //random message to infected but not actively healing people - threshold_desc = "Stage Speed 6: Doubles healing speed.
    \ - Stealth 4: Healing will no longer be visible to onlookers." - + threshold_desc = list( + "Stage Speed 6" = "Doubles healing speed.", + "Stealth 4" = "Healing will no longer be visible to onlookers.", + ) /datum/symptom/heal/Start(datum/disease/advance/A) if(!..()) return @@ -54,8 +55,10 @@ level = 6 passive_message = "You miss the feeling of starlight on your skin." var/nearspace_penalty = 0.3 - threshold_desc = "Stage Speed 6: Increases healing speed.
    \ - Transmission 6: Removes penalty for only being close to space." + threshold_desc = list( + "Stage Speed 6" = "Increases healing speed.", + "Transmission 6" = "Removes penalty for only being close to space.", + ) /datum/symptom/heal/starlight/Start(datum/disease/advance/A) if(!..()) @@ -105,8 +108,10 @@ level = 7 var/food_conversion = FALSE desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream." - threshold_desc = "Resistance 7: Increases chem removal speed.
    \ - Stage Speed 6: Consumed chemicals nourish the host." + threshold_desc = list( + "Resistance 7" = "Increases chem removal speed.", + "Stage Speed 6" = "Consumed chemicals nourish the host.", + ) /datum/symptom/heal/chem/Start(datum/disease/advance/A) if(!..()) @@ -139,9 +144,10 @@ var/reduced_hunger = FALSE desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\ but also causing increased hunger." - threshold_desc = "Stealth 3: Reduces hunger rate.
    \ - Stage Speed 10: Chemical metabolization is tripled instead of doubled." - + threshold_desc = list( + "Stealth 3" = "Reduces hunger rate.", + "Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.", + ) /datum/symptom/heal/metabolism/Start(datum/disease/advance/A) if(!..()) return @@ -172,8 +178,9 @@ transmittable = -1 level = 6 passive_message = "You feel tingling on your skin as light passes over it." - threshold_desc = "Stage Speed 8: Doubles healing speed." - + threshold_desc = list( + "Stage Speed 8" = "Doubles healing speed.", + ) /datum/symptom/heal/darkness/Start(datum/disease/advance/A) if(!..()) return @@ -222,9 +229,11 @@ var/deathgasp = FALSE var/stabilize = FALSE var/active_coma = FALSE //to prevent multiple coma procs - threshold_desc = "Stealth 2: Host appears to die when falling into a coma.
    \ - Resistance 4: The virus also stabilizes the host while they are in critical condition.
    \ - Stage Speed 7: Increases healing speed." + threshold_desc = list( + "Stealth 2" = "Host appears to die when falling into a coma.", + "Resistance 4" = "The virus also stabilizes the host while they are in critical condition.", + "Stage Speed 7" = "Increases healing speed.", + ) /datum/symptom/heal/coma/Start(datum/disease/advance/A) if(!..()) @@ -313,8 +322,10 @@ level = 6 passive_message = "Your skin feels oddly dry..." var/absorption_coeff = 1 - threshold_desc = "Resistance 5: Water is consumed at a much slower rate.
    \ - Stage Speed 7: Increases healing speed." + threshold_desc = list( + "Resistance 5" = "Water is consumed at a much slower rate.", + "Stage Speed 7" = "Increases healing speed.", + ) /datum/symptom/heal/water/Start(datum/disease/advance/A) if(!..()) @@ -369,9 +380,10 @@ level = 8 passive_message = "You feel an odd attraction to plasma." var/temp_rate = 1 - threshold_desc = "Transmission 6: Increases temperature adjustment rate and heals toxin lovers.
    \ - Stage Speed 7: Increases healing speed." - + threshold_desc = list( + "Transmission 6" = "Additionally increases temperature adjustment rate and heals those who love toxins", + "Resistance 7" = "Increases healing speed.", + ) /datum/symptom/heal/plasma/Start(datum/disease/advance/A) if(!..()) return diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index b0812e0235..c0c312cbc2 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -29,8 +29,10 @@ BONUS symptom_delay_min = 5 symptom_delay_max = 25 var/scratch = FALSE - threshold_desc = "Transmission 6: Increases frequency of itching.
    \ - Stage Speed 7: The host will scrath itself when itching, causing superficial damage." + threshold_desc = list( + "Transmission 6" = "Increases frequency of itching.", + "Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.", + ) /datum/symptom/itching/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/nanites.dm b/code/datums/diseases/advance/symptoms/nanites.dm index b18e089a41..9598b3fd33 100644 --- a/code/datums/diseases/advance/symptoms/nanites.dm +++ b/code/datums/diseases/advance/symptoms/nanites.dm @@ -10,8 +10,10 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/reverse_boost = FALSE - threshold_desc = "Transmission 5: Increases the virus' growth rate while nanites are present.
    \ - Stage Speed 7: Increases the replication boost." + threshold_desc = list( + "Transmission 5" = "Increases the virus' growth rate while nanites are present.", + "Stage Speed 7" = "Increases the replication boost." + ) /datum/symptom/nano_boost/Start(datum/disease/advance/A) if(!..()) @@ -42,8 +44,10 @@ symptom_delay_min = 1 symptom_delay_max = 1 var/reverse_boost = FALSE - threshold_desc = "Stage Speed 5: Increases the virus' growth rate while nanites are present.
    \ - Resistance 7: Severely increases the rate at which the nanites are destroyed." + threshold_desc = list( + "Stage Speed 5" = "Increases the virus' growth rate while nanites are present.", + "Resistance 7" = "Severely increases the rate at which the nanites are destroyed." + ) /datum/symptom/nano_destroy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/narcolepsy.dm b/code/datums/diseases/advance/symptoms/narcolepsy.dm index 24ba024aa6..3f9405328a 100644 --- a/code/datums/diseases/advance/symptoms/narcolepsy.dm +++ b/code/datums/diseases/advance/symptoms/narcolepsy.dm @@ -18,7 +18,7 @@ Bonus stealth = -1 resistance = -2 stage_speed = -3 - transmittable = -4 + transmittable = 0 level = 6 symptom_delay_min = 15 symptom_delay_max = 80 @@ -26,8 +26,10 @@ Bonus var/sleep_level = 0 var/sleepy_ticks = 0 var/stamina = FALSE - threshold_desc = "Transmission 7: Also relaxes the muscles, weakening and slowing the host.
    \ - Resistance 10: Causes narcolepsy more often, increasing the chance of the host falling asleep." + threshold_desc = list( + "Transmission 4" = "Causes the host to periodically emit a yawn that spreads the virus in a manner similar to that of a sneeze.", + "Stage Speed 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep.", + ) /datum/symptom/narcolepsy/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index e66bdf5ee0..3821c0585e 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -28,7 +28,9 @@ Bonus symptom_delay_min = 1 symptom_delay_max = 1 var/regenerate_blood = FALSE - threshold_desc = "Resistance 8:Additionally regenerates lost blood.
    " + threshold_desc = list( + "Resistance 8" = "Additionally regenerates lost blood." + ) /datum/symptom/oxygen/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 1f8cc8d7af..bbacdd885d 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -11,9 +11,11 @@ var/purge_alcohol = FALSE var/trauma_heal_mild = FALSE var/trauma_heal_severe = FALSE - threshold_desc = "Resistance 6: Heals minor brain traumas.
    \ - Resistance 9: Heals severe brain traumas.
    \ - Transmission 8: Purges alcohol in the bloodstream." + threshold_desc = list( + "Resistance 6" = "Heals minor brain traumas.", + "Resistance 9" = "Heals severe brain traumas.", + "Transmission 8" = "Purges alcohol in the bloodstream.", + ) /datum/symptom/mind_restoration/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm index 741e2a1e16..da14ed87cf 100644 --- a/code/datums/diseases/advance/symptoms/shivering.dm +++ b/code/datums/diseases/advance/symptoms/shivering.dm @@ -20,15 +20,17 @@ Bonus desc = "The virus inhibits the body's thermoregulation, cooling the body down." stealth = 0 resistance = 2 - stage_speed = 2 + stage_speed = 3 transmittable = 2 level = 2 severity = 2 symptom_delay_min = 10 symptom_delay_max = 30 var/unsafe = FALSE //over the cold threshold - threshold_desc = "Stage Speed 5: Increases cooling speed; the host can fall below safe temperature levels.
    \ - Stage Speed 10: Further increases cooling speed." + threshold_desc = list( + "Stage Speed 5" = "Increases cooling speed,; the host can fall below safe temperature levels.", + "Stage Speed 10" = "Further increases cooling speed." + ) /datum/symptom/fever/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 9f1696c963..439f391fe4 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -27,8 +27,10 @@ Bonus severity = 1 symptom_delay_min = 5 symptom_delay_max = 35 - threshold_desc = "Transmission 9: Increases sneezing range, spreading the virus over a larger area.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/sneeze/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/viral.dm b/code/datums/diseases/advance/symptoms/viral.dm index 55807aed6b..28ac491fcd 100644 --- a/code/datums/diseases/advance/symptoms/viral.dm +++ b/code/datums/diseases/advance/symptoms/viral.dm @@ -26,7 +26,7 @@ BONUS ////////////////////////////////////// Viral evolution - Moderate stealth reductopn. + Moderate stealth reduction. Major decreases to resistance. increases stage speed. increase to transmission diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index b4a33cb837..5453d6e11a 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -29,9 +29,10 @@ Bonus symptom_delay_min = 25 symptom_delay_max = 80 var/remove_eyes = FALSE - threshold_desc = "Resistance 12: Weakens extraocular muscles, eventually leading to complete detachment of the eyes.
    \ - Stealth 4: The symptom remains hidden until active." - + threshold_desc = list( + "Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.", + "Stealth 4" = "The symptom remains hidden until active.", + ) /datum/symptom/visionloss/Start(datum/disease/advance/A) if(!..()) return @@ -66,7 +67,7 @@ Bonus eyes.applyOrganDamage(eyes.maxHealth) else M.visible_message("[M]'s eyes fall off their sockets!", "Your eyes fall off their sockets!") - eyes.Remove(M) + eyes.Remove() eyes.forceMove(get_turf(M)) else to_chat(M, "Your eyes burn horrifically!") diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm index 8b9b7d069a..9be484d99a 100644 --- a/code/datums/diseases/advance/symptoms/voice_change.dm +++ b/code/datums/diseases/advance/symptoms/voice_change.dm @@ -31,9 +31,11 @@ Bonus var/scramble_language = FALSE var/datum/language/current_language var/datum/language_holder/original_language - threshold_desc = "Transmission 14: The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.
    \ - Stage Speed 7: Changes voice more often.
    \ - Stealth 3: The symptom remains hidden until active." + threshold_desc = list( + "Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.", + "Stage Speed 7" = "Changes voice more often.", + "Stealth 3" = "The symptom remains hidden until active." + ) /datum/symptom/voice_change/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index f53638bc12..22e249a388 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -25,8 +25,8 @@ Bonus desc = "The virus causes nausea and irritates the stomach, causing occasional vomit." stealth = -2 resistance = -1 - stage_speed = 0 - transmittable = 1 + stage_speed = -1 + transmittable = 2 level = 3 severity = 3 base_message_chance = 100 @@ -34,9 +34,11 @@ Bonus symptom_delay_max = 80 var/vomit_blood = FALSE var/proj_vomit = 0 - threshold_desc = "Resistance 7: Host will vomit blood, causing internal damage.
    \ - Transmission 7: Host will projectile vomit, increasing vomiting range.
    \ - Stealth 4: The symptom remains hidden until active." + threshold_desc = list( + "Resistance 7" = "Host will vomit blood, causing internal damage.", + "Transmission 7" = "Host will projectile vomit, increasing vomiting range.", + "Stealth 4" = "The symptom remains hidden until active." + ) /datum/symptom/vomit/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 66fc90f1f8..5eab698750 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -29,7 +29,9 @@ Bonus base_message_chance = 100 symptom_delay_min = 15 symptom_delay_max = 45 - threshold_desc = "Stealth 4: The symptom is less noticeable." + threshold_desc = list( + "Stealth 4" = "The symptom is less noticeable." + ) /datum/symptom/weight_loss/Start(datum/disease/advance/A) if(!..()) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 5fa991c10c..68c6839482 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -370,14 +370,14 @@ /////////////////////////// DNA HELPER-PROCS ////////////////////////////// /proc/getleftblocks(input,blocknumber,blocksize) if(blocknumber > 1) - return copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) + return copytext_char(input,1,((blocksize*blocknumber)-(blocksize-1))) /proc/getrightblocks(input,blocknumber,blocksize) if(blocknumber < (length(input)/blocksize)) - return copytext(input,blocksize*blocknumber+1,length(input)+1) + return copytext_char(input,blocksize*blocknumber+1,length(input)+1) /proc/getblock(input, blocknumber, blocksize=DNA_BLOCK_SIZE) - return copytext(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1) + return copytext_char(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1) /proc/setblock(istring, blocknumber, replacement, blocksize=DNA_BLOCK_SIZE) if(!istring || !blocknumber || !replacement || !blocksize) diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm new file mode 100644 index 0000000000..5b471a0dc7 --- /dev/null +++ b/code/datums/elements/mob_holder.dm @@ -0,0 +1,184 @@ +/datum/element/mob_holder + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/worn_state + var/alt_worn + var/right_hand + var/left_hand + var/inv_slots + var/proctype //if present, will be invoked on headwear generation. + +/datum/element/mob_holder/Attach(datum/target, _worn_state, _alt_worn, _right_hand, _left_hand, _inv_slots = NONE, _proctype) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + worn_state = _worn_state + alt_worn = _alt_worn + right_hand = _right_hand + left_hand = _left_hand + inv_slots = _inv_slots + proctype = _proctype + + RegisterSignal(target, COMSIG_CLICK_ALT, .proc/mob_try_pickup) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_examine) + +/datum/element/mob_holder/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, COMSIG_CLICK_ALT) + UnregisterSignal(source, COMSIG_PARENT_EXAMINE) + +/datum/element/mob_holder/proc/on_examine(mob/living/source, mob/user, list/examine_list) + if(ishuman(user) && !istype(source.loc, /obj/item/clothing/head/mob_holder)) + examine_list += "Looks like [source.p_they(TRUE)] can be picked up with Alt+Click!" + +/datum/element/mob_holder/proc/mob_try_pickup(mob/living/source, mob/user) + if(!ishuman(user) || !user.Adjacent(source) || user.incapacitated()) + return FALSE + if(user.get_active_held_item()) + to_chat(user, "Your hands are full!") + return FALSE + if(source.buckled) + to_chat(user, "[src] is buckled to something!") + return FALSE + if(source == user) + to_chat(user, "You can't pick yourself up.") + return FALSE + source.visible_message("[user] starts picking up [source].", \ + "[user] starts picking you up!") + if(!do_after(user, 20, target = src) || source.buckled) + return FALSE + + source.visible_message("[user] picks up [source]!", \ + "[user] picks you up!") + to_chat(user, "You pick [src] up.") + source.drop_all_held_items() + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(source), source, worn_state, alt_worn, right_hand, left_hand, inv_slots) + if(proctype) + INVOKE_ASYNC(src, proctype, source, holder, user) + user.put_in_hands(holder) + return TRUE + +/datum/element/mob_holder/proc/drone_worn_icon(mob/living/simple_animal/drone/D, obj/item/clothing/head/mob_holder/holder, mob/user) + var/new_state = "[D.visualAppearence]_hat" + holder.item_state = new_state + holder.icon_state = new_state + + +//The item itself, +/obj/item/clothing/head/mob_holder + name = "bugged mob" + desc = "Yell at coderbrush." + icon = null + alternate_worn_icon = 'icons/mob/animals_held.dmi' + righthand_file = 'icons/mob/animals_held_rh.dmi' + lefthand_file = 'icons/mob/animals_held_lh.dmi' + icon_state = "" + w_class = WEIGHT_CLASS_BULKY + var/mob/living/held_mob + +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/target, worn_state, alt_worn, right_hand, left_hand, slots = NONE) + . = ..() + + if(target) + assimilate(target) + + if(alt_worn) + alternate_worn_icon = alt_worn + if(worn_state) + item_state = worn_state + icon_state = worn_state + if(left_hand) + lefthand_file = left_hand + if(right_hand) + righthand_file = right_hand + slot_flags = slots + +/obj/item/clothing/head/mob_holder/proc/assimilate(mob/living/target) + target.setDir(SOUTH) + held_mob = target + target.forceMove(src) + var/image/I = new //work around to retain the same appearance to the mob idependently from inhands/worn states. + I.appearance = target.appearance + I.override = TRUE + add_overlay(I) + name = target.name + desc = target.desc + switch(target.mob_size) + if(MOB_SIZE_TINY) + w_class = WEIGHT_CLASS_TINY + if(MOB_SIZE_SMALL) + w_class = WEIGHT_CLASS_NORMAL + if(MOB_SIZE_LARGE) + w_class = WEIGHT_CLASS_HUGE + RegisterSignal(src, COMSIG_CLICK_SHIFT, .proc/examine_held_mob) + +/obj/item/clothing/head/mob_holder/Destroy() + if(held_mob) + release() + return ..() + +/obj/item/clothing/head/mob_holder/proc/examine_held_mob(datum/source, mob/user) + held_mob.ShiftClick(user) + return COMPONENT_DENY_EXAMINATE + +/obj/item/clothing/head/mob_holder/Exited(atom/movable/AM, atom/newloc) + . = ..() + if(AM == held_mob) + held_mob.reset_perspective() + held_mob = null + qdel(src) + +/obj/item/clothing/head/mob_holder/Entered(atom/movable/AM, atom/newloc) + . = ..() + if(AM != held_mob) + var/destination = loc + if(isliving(loc)) //the mob is held or worn, drop things on the floor + destination = get_turf(loc) + AM.forceMove(destination) + +/obj/item/clothing/head/mob_holder/dropped() + . = ..() + if(held_mob && isturf(loc))//don't release on soft-drops + release() + +/obj/item/clothing/head/mob_holder/proc/release() + if(held_mob) + var/mob/living/L = held_mob + held_mob = null + L.forceMove(get_turf(L)) + L.reset_perspective() + L.setDir(SOUTH) + qdel(src) + +/obj/item/clothing/head/mob_holder/relaymove(mob/user) + return + +/obj/item/clothing/head/mob_holder/container_resist() + if(isliving(loc)) + var/mob/living/L = loc + L.visible_message("[src] escapes from [L]!", "[src] escapes your grip!") + release() + +/obj/item/clothing/head/mob_holder/assume_air(datum/gas_mixture/env) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.assume_air(env) + return loc.assume_air(env) + +/obj/item/clothing/head/mob_holder/remove_air(amount) + var/atom/location = loc + if(!loc) + return //null + var/turf/T = get_turf(loc) + while(location != T) + location = location.loc + if(ismob(location)) + return location.loc.remove_air(amount) + return loc.remove_air(amount) diff --git a/code/datums/elements/wuv.dm b/code/datums/elements/wuv.dm index 84f327500f..55bc9bafad 100644 --- a/code/datums/elements/wuv.dm +++ b/code/datums/elements/wuv.dm @@ -30,6 +30,10 @@ RegisterSignal(target, COMSIG_MOB_ATTACK_HAND, .proc/on_attack_hand) +/datum/element/wuv/Detach(datum/source, force) + . = ..() + UnregisterSignal(source, COMSIG_MOB_ATTACK_HAND) + /datum/element/wuv/proc/on_attack_hand(datum/source, mob/user) var/mob/living/L = source @@ -43,7 +47,7 @@ addtimer(CALLBACK(src, .proc/pet_the_dog, source, user), 1) /datum/element/wuv/proc/pet_the_dog(mob/target, mob/user) - if(!QDELETED(target) || !QDELETED(user) || target.stat != CONSCIOUS) + if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS) return new /obj/effect/temp_visual/heart(target.loc) if(pet_emote) @@ -52,7 +56,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, pet_moodlet, target) /datum/element/wuv/proc/kick_the_dog(mob/target, mob/user) - if(!QDELETED(target) || !QDELETED(user) || target.stat != CONSCIOUS) + if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS) return if(punt_emote) target.emote("me", punt_type, punt_emote) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 599c492d4c..e653e3e36b 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -18,6 +18,7 @@ var/list/mob_type_ignore_stat_typecache var/stat_allowed = CONSCIOUS var/static/list/emote_list = list() + var/static/regex/stop_bad_mime = regex(@"says|exclaims|yells|asks") /datum/emote/New() if(key_third_person) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 420602cc7f..7d040a4982 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -43,7 +43,7 @@ for(var/line in testmerge) var/datum/tgs_revision_information/test_merge/tm = line var/cm = tm.pull_request_commit - var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 11))) + var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11)) if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder)) continue . += "#[tm.number][details]
    " @@ -57,11 +57,11 @@ // Round ID if(GLOB.round_id) msg += "Round ID: [GLOB.round_id]" - + msg += "BYOND Version: [world.byond_version].[world.byond_build]" if(DM_VERSION != world.byond_version || DM_BUILD != world.byond_build) msg += "Compiled with BYOND Version: [DM_VERSION].[DM_BUILD]" - + // Revision information var/datum/getrev/revdata = GLOB.revdata msg += "Server revision compiled on: [revdata.date]" diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 5a4600432d..72fe6f5a1c 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -257,8 +257,8 @@ var/splitpoint = findtext(prepared_line," ") if(!splitpoint) continue - var/command = copytext(prepared_line,1,splitpoint) - var/value = copytext(prepared_line,splitpoint+1) + var/command = copytext(prepared_line, 1, splitpoint) + var/value = copytext(prepared_line, splitpoint + length(prepared_line[splitpoint])) switch(command) if("DELAY") var/delay_value = text2num(value) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index c8caa853c3..cf2adfce8c 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -31,7 +31,7 @@ reset_streak(D) streak = streak+element if(length(streak) > max_streak_length) - streak = copytext(streak,2) + streak = copytext(streak, 1 + length(streak[1])) return /datum/martial_art/proc/reset_streak(mob/living/carbon/human/new_target) diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index b98bc4f951..ea883c5637 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -50,6 +50,12 @@ D.forcesay(GLOB.hit_appends) return 1 +/datum/martial_art/boxing/teach(mob/living/carbon/human/H, make_temporary = TRUE) + . = ..() + if(.) + if(H.pulling && ismob(H.pulling)) + H.stop_pulling() + /obj/item/clothing/gloves/boxing var/datum/martial_art/boxing/style = new @@ -58,7 +64,7 @@ return if(slot == SLOT_GLOVES) var/mob/living/carbon/human/H = user - style.teach(H,1) + style.teach(H,TRUE) return /obj/item/clothing/gloves/boxing/dropped(mob/user) diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 9e00c90a92..779428669c 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -1,8 +1,6 @@ #define SIDE_KICK_COMBO "DH" #define SHOULDER_FLIP_COMBO "GHDGHH" -#define REPULSE_PUNCH_COMBO "GHGH" #define FOOT_SMASH_COMBO "HH" -#define DEFT_SWITCH_COMBO "GDD" /datum/martial_art/the_rising_bass name = "The Rising Bass" @@ -10,6 +8,9 @@ dodge_chance = 100 allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/rising_bass_help + var/datum/action/risingbassmove/repulsepunch = new/datum/action/risingbassmove/repulsepunch() + var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch() + var/repulsecool = 0 /datum/martial_art/the_rising_bass/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,SIDE_KICK_COMBO)) @@ -20,7 +21,7 @@ streak = "" shoulderFlip(A,D) return 1 - if(findtext(streak,REPULSE_PUNCH_COMBO)) + if(findtext(streak,"rplse")) streak = "" repulsePunch(A,D) return 1 @@ -28,13 +29,46 @@ streak = "" footSmash(A,D) return 1 - if(findtext(streak,DEFT_SWITCH_COMBO)) + if(findtext(streak,"deft")) streak = "" deftSwitch(A,D) return 1 return 0 +//Repulse Punch - Slams the opponent far away from you. +/datum/action/risingbassmove + name = "" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "" + var/movestreak = "" + +/datum/action/risingbassmove/Trigger() + if(owner.incapacitated()) + to_chat(owner, "You can't use [name] while you're incapacitated.") + return + var/mob/living/carbon/human/H = owner + if (H.mind.martial_art.streak == "[movestreak]") + H.mind.martial_art.streak = "" + to_chat(H,"You relax your muscles and return to a neutral position.") + else + if(HAS_TRAIT(H, TRAIT_PACIFISM)) + to_chat(H, "You don't want to harm other people!") + return + to_chat(H,"You get ready to use the [name] maneuver!") + H.mind.martial_art.streak = "[movestreak]" + +/datum/action/risingbassmove/repulsepunch + name = "Repulse Punch" + button_icon_state = "repulsepunch" + movestreak = "rplse" + +/datum/action/risingbassmove/deftswitch + name = "Deft Switch" + button_icon_state = "deftswitch" + movestreak = "deft" + + /datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D.IsKnockdown() || D.lying == 0) var/turf/H = get_step(D, A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH)) @@ -75,7 +109,7 @@ return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.IsKnockdown() || !D.lying) + if(!D.IsKnockdown() || !D.lying || repulsecool > world.time) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] smashes [D] in the chest, throwing them away!", \ "[A] smashes you in the chest, repelling you away!") @@ -85,6 +119,7 @@ D.apply_damage(10, BRUTE, BODY_ZONE_CHEST) D.Knockdown(90) log_combat(A, D, "repulse punched (Rising Bass)") + repulsecool = world.time + 3 SECONDS return 1 return basic_hit(A,D) @@ -132,6 +167,11 @@ return 1 return ..() +/datum/martial_art/the_rising_bass/add_to_streak(element,mob/living/carbon/human/D) + if (streak == "deft" || streak == "rplse") + return + . = ..() + /mob/living/carbon/human/proc/rising_bass_help() set name = "Recall Teachings" set desc = "Remember the martial techniques of the Rising Bass clan." @@ -149,10 +189,14 @@ . = ..() if(!.) return + deftswitch.Grant(H) + repulsepunch.Grant(H) ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) /datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H) . = ..() + deftswitch.Remove(H) + repulsepunch.Remove(H) REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f4e675d98b..61d467a20d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -139,7 +139,7 @@ SEND_SIGNAL(new_character, COMSIG_MOB_ON_NEW_MIND) /datum/mind/proc/store_memory(new_text) - if((length(memory) + length(new_text)) <= MAX_MESSAGE_LEN) + if((length_char(memory) + length_char(new_text)) <= MAX_MESSAGE_LEN) memory += "[new_text]
    " /datum/mind/proc/wipe_memory() @@ -409,7 +409,7 @@ assigned_role = new_role else if (href_list["memory_edit"]) - var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN) + var/new_memo = stripped_multiline_input(usr, "Write new memory", "Memory", memory, MAX_MESSAGE_LEN) if (isnull(new_memo)) return memory = new_memo @@ -458,6 +458,7 @@ var/list/allowed_types = list( /datum/objective/assassinate, + /datum/objective/assassinate/once, /datum/objective/maroon, /datum/objective/debrain, /datum/objective/protect, diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 0b9b02af75..81ee5c3989 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -201,51 +201,52 @@ /datum/mood_event/vampcandle description = "Something is making your mind feel... loose...\n" - mood_change = -10 + mood_change = -15 timeout = 1 MINUTES /datum/mood_event/drankblood_bad description = "I drank the blood of a lesser creature. Disgusting.\n" mood_change = -4 - timeout = 900 + timeout = 8 MINUTES /datum/mood_event/drankblood_dead description = "I drank dead blood. I am better than this.\n" mood_change = -7 - timeout = 900 + timeout = 10 MINUTES /datum/mood_event/drankblood_synth description = "I drank synthetic blood. What is wrong with me?\n" mood_change = -7 - timeout = 900 + timeout = 15 MINUTES /datum/mood_event/drankkilled description = "I drank from my victim until they died. I feel...less human.\n" mood_change = -12 - timeout = 6000 + timeout = 25 MINUTES /datum/mood_event/madevamp description = "A soul has been cursed to undeath by my own hand.\n" mood_change = -10 - timeout = 10000 + timeout = 30 MINUTES /datum/mood_event/vampatefood description = "Mortal nourishment no longer sustains me. I feel unwell.\n" mood_change = -6 - timeout = 1000 + timeout = 10 MINUTES /datum/mood_event/daylight_1 description = "I slept poorly in a makeshift coffin during the day.\n" mood_change = -3 - timeout = 1000 + timeout = 10 MINUTES -/datum/mood_event/nanite_sadness - description = "+++++++HAPPINESS SUPPRESSION+++++++\n" - mood_change = -7 /datum/mood_event/daylight_2 description = "I have been scorched by the unforgiving rays of the sun.\n" mood_change = -6 - timeout = 1200 + timeout = 15 MINUTES + +/datum/mood_event/nanite_sadness + description = "+++++++HAPPINESS SUPPRESSION+++++++\n" + mood_change = -7 /datum/mood_event/nanite_sadness/add_effects(message) description = "+++++++[message]+++++++\n" diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index f689ff903e..6397bbe66b 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -32,9 +32,9 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/proc/set_se(se_string, on = 1) if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return - var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) + var/before = copytext_char(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE) - var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0) + var/after = copytext_char(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0) return before + injection + after /datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1) diff --git a/code/datums/ruins/station.dm b/code/datums/ruins/station.dm index dcab384db9..17d5a9e1e2 100644 --- a/code/datums/ruins/station.dm +++ b/code/datums/ruins/station.dm @@ -35,6 +35,26 @@ suffix = "Box/Engine/engine_tesla.dmm" name = "Box Tesla" +/datum/map_template/ruin/station/box/engine/teg + id = "engine_teg" + suffix = "Box/Engine/engine_tesla.dmm" + name = "Box TEG" + +/datum/map_template/ruin/station/box/engine/empty + id = "engine_empty" + suffix = "Box/Engine/engine_tesla.dmm" + name = "Box Empty" + +/datum/map_template/ruin/station/box/engine/am + id = "engine_am" + suffix = "Box/Engine/engine_tesla.dmm" + name = "Box Antimatter" + +/datum/map_template/ruin/station/box/engine/budget + id = "engine_budget" + suffix = "Box/Engine/engine_tesla.dmm" + name = "Box P.A.C.M.A.N" + // Lavaland // Mining Base /datum/map_template/ruin/station/lavaland/mining_base diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm index bb7dc4cdb7..1adcb6fde6 100644 --- a/code/datums/spawners_menu.dm +++ b/code/datums/spawners_menu.dm @@ -18,14 +18,18 @@ for(var/spawner in GLOB.mob_spawners) var/list/this = list() this["name"] = spawner - this["desc"] = "" + this["short_desc"] = "" + this["flavor_text"] = "" + this["important_warning"] = "" this["refs"] = list() for(var/spawner_obj in GLOB.mob_spawners[spawner]) this["refs"] += "[REF(spawner_obj)]" if(!this["desc"]) if(istype(spawner_obj, /obj/effect/mob_spawn)) var/obj/effect/mob_spawn/MS = spawner_obj - this["desc"] = MS.flavour_text + this["short_desc"] = MS.short_desc + this["flavor_text"] = MS.flavour_text + this["important_info"] = MS.important_info else var/obj/O = spawner_obj this["desc"] = O.desc diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index d68b11135f..c6466fdd96 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -8,6 +8,7 @@ var/gain_text var/lose_text var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented + var/antag_removal_text // Text will be given to the quirk holder if they get an antag that has it blacklisted. var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled var/mob_trait //if applicable, apply and remove this mob trait var/mob/living/quirk_holder diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index b19c6a71f7..faa7eec392 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -6,6 +6,7 @@ value = -2 gain_text = "You feel your vigor slowly fading away." lose_text = "You feel vigorous again." + antag_removal_text = "Your antagonistic nature has removed your blood deficiency." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." /datum/quirk/blooddeficiency/on_process() @@ -38,6 +39,8 @@ var/obj/item/heirloom var/where +GLOBAL_LIST_EMPTY(family_heirlooms) + /datum/quirk/family_heirloom/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/heirloom_type @@ -76,6 +79,7 @@ /obj/item/lighter, /obj/item/dice/d20) heirloom = new heirloom_type(get_turf(quirk_holder)) + GLOB.family_heirlooms += heirloom var/list/slots = list( "in your left pocket" = SLOT_L_STORE, "in your right pocket" = SLOT_R_STORE, @@ -188,11 +192,7 @@ gain_text = "You feel repulsed by the thought of violence!" lose_text = "You think you can defend yourself again." medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." - -/datum/quirk/nonviolent/on_process() - if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) - to_chat(quirk_holder, "Your antagonistic nature has caused you to renounce your pacifism.") - qdel(src) + antag_removal_text = "Your antagonistic nature has caused you to renounce your pacifism." /datum/quirk/paraplegic name = "Paraplegic" @@ -355,6 +355,7 @@ gain_text = "You find yourself unable to speak!" lose_text = "You feel a growing strength in your vocal chords." medical_record_text = "Functionally mute, patient is unable to use their voice in any capacity." + antag_removal_text = "Your antagonistic nature has caused your voice to be heard." var/datum/brain_trauma/severe/mute/mute /datum/quirk/mute/add() @@ -366,11 +367,6 @@ var/mob/living/carbon/human/H = quirk_holder H?.cure_trauma_type(mute, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/quirk/mute/on_process() - if(quirk_holder.mind && LAZYLEN(quirk_holder.mind.antag_datums)) - to_chat(quirk_holder, "Your antagonistic nature has caused your voice to be heard.") - qdel(src) - /datum/quirk/unstable name = "Unstable" desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm index 442997288a..39afde14d0 100644 --- a/code/datums/verbs.dm +++ b/code/datums/verbs.dm @@ -88,8 +88,8 @@ var/list/entry = list() entry["parent"] = "[type]" entry["name"] = verbpath.desc - if (copytext(verbpath.name,1,2) == "@") - entry["command"] = copytext(verbpath.name,2) + if (verbpath.name[1] == "@") + entry["command"] = copytext(verbpath.name, length(verbpath.name[1]) + 1) else entry["command"] = replacetext(verbpath.name, " ", "-") diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index fab5a1313c..d4a5dcdeb3 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -118,7 +118,7 @@ return TRUE /datum/wires/proc/is_dud(wire) - return dd_hasprefix(wire, WIRE_DUD_PREFIX) + return findtext(wire, WIRE_DUD_PREFIX) /datum/wires/proc/is_dud_color(color) return is_dud(get_wire(color)) @@ -215,8 +215,8 @@ /datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if (!ui) - ui = new(user, src, ui_key, "wires", "[holder.name] wires", 350, 150 + wires.len * 30, master_ui, state) + if(!ui) + ui = new(user, src, ui_key, "wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state) ui.open() /datum/wires/ui_data(mob/user) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1f62be8a24..7e224080b9 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -6,6 +6,7 @@ var/flags_1 = NONE var/interaction_flags_atom = NONE + var/ghost_flags = NONE var/datum/reagents/reagents = null //This atom's HUD (med/sec, etc) images. Associative list. @@ -505,9 +506,8 @@ return final_rgb /atom/proc/clean_blood() - if(islist(blood_DNA)) - blood_DNA = null - return TRUE + . = blood_DNA? TRUE : FALSE + blood_DNA = null /atom/proc/wash_cream() return TRUE @@ -728,6 +728,13 @@ /atom/proc/multitool_act(mob/living/user, obj/item/I) return +/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) + if(!istype(I, /obj/item/multitool)) + if(user && !silent) + to_chat(user, "[I] has no data buffer!") + return FALSE + return TRUE + /atom/proc/screwdriver_act(mob/living/user, obj/item/I) SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) @@ -761,6 +768,8 @@ log_whisper(log_text) if(LOG_EMOTE) log_emote(log_text) + if(LOG_SUBTLER) + log_subtler(log_text) if(LOG_DSAY) log_dsay(log_text) if(LOG_PDA) @@ -863,4 +872,4 @@ Proc for attack log creation, because really why not return TRUE /atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) - . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) \ No newline at end of file + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index e443d6ad37..b054ff89af 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -57,10 +57,8 @@ /obj/item/melee/transforming/energy/sword/bananium name = "bananium sword" desc = "An elegant weapon, for a more civilized age." - force = 0 - throwforce = 0 - force_on = 0 - throwforce_on = 0 + force_on = 15 + throwforce_on = 15 hitsound = null attack_verb_on = list("slipped") clumsy_check = FALSE @@ -69,24 +67,26 @@ heat = 0 light_color = "#ffff00" var/next_trombone_allowed = 0 + var/datum/component/slippery/slipper /obj/item/melee/transforming/energy/sword/bananium/Initialize() . = ..() - AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) + slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP) slipper.signal_enabled = active /obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user) ..() if(active) - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) - slipper.Slip(M) + slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING + slipper.Slip(src, M) + slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING) /obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum) . = ..() if(active) - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) - slipper.Slip(hit_atom) + slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING + slipper.Slip(src, hit_atom) + slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING) /obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params) if((world.time > next_trombone_allowed) && istype(I, /obj/item/melee/transforming/energy/sword/bananium)) @@ -98,7 +98,6 @@ /obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text) ..() - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user) @@ -108,8 +107,9 @@ if(!active) transform_weapon(user, TRUE) user.visible_message("[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!") - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) - slipper.Slip(user) + slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING + slipper.Slip(src, user) + slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING) return SHAME //BANANIUM SHIELD @@ -126,16 +126,15 @@ on_force = 0 on_throwforce = 0 on_throw_speed = 1 + var/datum/component/slippery/slipper /obj/item/shield/energy/bananium/Initialize() . = ..() - AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP) - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) + slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP) slipper.signal_enabled = active /obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user) ..() - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active /obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) @@ -149,8 +148,9 @@ if(active) var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it - var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) - slipper.Slip(hit_atom) + slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING + slipper.Slip(src, hit_atom) + slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING) if(thrownby && !caught) throw_at(thrownby, throw_range+2, throw_speed, null, 1) else @@ -203,24 +203,35 @@ clumsy_check = GRENADE_NONCLUMSY_FUMBLE /obj/item/grenade/chem_grenade/teargas/moustache/prime() - var/myloc = get_turf(src) + var/list/check_later = list() + for(var/mob/living/carbon/C in get_turf(src)) + check_later += C . = ..() - for(var/mob/living/carbon/M in view(6, myloc)) - if(!istype(M.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(M.wear_mask, /obj/item/clothing/mask/gas/mime) ) - if(!M.wear_mask || M.dropItemToGround(M.wear_mask)) + if(!.) //grenade did not properly prime. + return + for(var/M in check_later) + var/mob/living/carbon/C = M + if(!istype(C.wear_mask, /obj/item/clothing/mask/gas/clown_hat) && !istype(C.wear_mask, /obj/item/clothing/mask/gas/mime)) + if(!C.wear_mask || C.dropItemToGround(C.wear_mask)) var/obj/item/clothing/mask/fakemoustache/sticky/the_stash = new /obj/item/clothing/mask/fakemoustache/sticky() - M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) + C.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE) /obj/item/clothing/mask/fakemoustache/sticky - var/unstick_time = 600 + var/unstick_time = 2 MINUTES /obj/item/clothing/mask/fakemoustache/sticky/Initialize() . = ..() ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) - addtimer(CALLBACK(src, .proc/unstick), unstick_time) + addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT), unstick_time) -/obj/item/clothing/mask/fakemoustache/sticky/proc/unstick() - ADD_TRAIT(src, TRAIT_NODROP, STICKY_MOUSTACHE_TRAIT) +/obj/item/clothing/mask/fakemoustache/sticky/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_WEAR_MASK) + ADD_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) + +/obj/item/clothing/mask/fakemoustache/sticky/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_NO_INTERNALS, STICKY_MOUSTACHE_TRAIT) //DARK H.O.N.K. AND CLOWN MECH WEAPONS diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 821c819664..6ea357163f 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -41,7 +41,7 @@ GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) // Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) -GLOBAL_VAR_INIT(dynamic_storyteller_type, null) +GLOBAL_VAR_INIT(dynamic_storyteller_type, /datum/dynamic_storyteller/classic) /datum/game_mode/dynamic name = "dynamic mode" @@ -239,12 +239,20 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) . += "Peaceful Waypoint
    " . += "Your station orbits deep within controlled, core-sector systems and serves as a waypoint for routine traffic through Nanotrasen's trade empire. Due to the combination of high security, interstellar traffic, and low strategic value, it makes any direct threat of violence unlikely. Your primary enemies will be incompetence and bored crewmen: try to organize team-building events to keep staffers interested and productive. However, even deep in our territory there may be subversive elements, especially for such a high-value target as your station. Keep an eye out, but don't expect much trouble." set_security_level(SEC_LEVEL_GREEN) + for(var/T in subtypesof(/datum/station_goal)) + var/datum/station_goal/G = new T + if(!(G in station_goals)) + station_goals += G if(21 to 79) var/perc_green = 100-round(100*((threat_level-21)/(79-21))) if(prob(perc_green)) . += "Core Territory
    " . += "Your station orbits within reliably mundane, secure space. Although Nanotrasen has a firm grip on security in your region, the valuable resources and strategic position aboard your station make it a potential target for infiltrations. Monitor crew for non-loyal behavior, but expect a relatively tame shift free of large-scale destruction. We expect great things from your station." set_security_level(SEC_LEVEL_GREEN) + for(var/T in subtypesof(/datum/station_goal)) + var/datum/station_goal/G = new T + if(!(G in station_goals)) + station_goals += G else if(prob(perc_green)) . += "Contested System
    " . += "Your station's orbit passes along the edge of Nanotrasen's sphere of influence. While subversive elements remain the most likely threat against your station, hostile organizations are bolder here, where our grip is weaker. Exercise increased caution against elite Syndicate strike forces, or Executives forbid, some kind of ill-conceived unionizing attempt." @@ -273,7 +281,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) if(GLOB.security_level >= SEC_LEVEL_BLUE) priority_announce("A summary has been copied and printed to all communications consoles.", "Security level elevated.", "intercept") else - priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no likely threats to [station_name()]. Have a secure shift!", "Security Report", "commandreport") + priority_announce("Thanks to the tireless efforts of our security and intelligence divisions, there are currently no likely threats to [station_name()]. All station construction projects have been authorized. Have a secure shift!", "Security Report", "commandreport") // Yes, this is copy pasted from game_mode /datum/game_mode/dynamic/check_finished(force_ending) @@ -346,7 +354,8 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) generate_threat() storyteller.start_injection_cooldowns() - + SSevents.frequency_lower = storyteller.event_frequency_lower // 6 minutes by default + SSevents.frequency_upper = storyteller.event_frequency_upper // 20 minutes by default log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") initial_threat_level = threat_level return TRUE @@ -395,7 +404,7 @@ GLOBAL_VAR_INIT(dynamic_storyteller_type, null) /datum/game_mode/dynamic/post_setup(report) update_playercounts() - + for(var/datum/dynamic_ruleset/roundstart/rule in executed_rules) addtimer(CALLBACK(src, /datum/game_mode/dynamic/.proc/execute_roundstart_rule, rule), rule.delay) ..() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index f4e9971a05..f6755057e2 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -47,6 +47,8 @@ assigned += M.mind M.mind.special_role = antag_flag M.mind.add_antag_datum(antag_datum) + log_admin("[M.name] was made into a [name] by dynamic.") + message_admins("[M.name] was made into a [name] by dynamic.") return TRUE ////////////////////////////////////////////// @@ -72,12 +74,6 @@ property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) always_max_weight = TRUE -/datum/dynamic_ruleset/latejoin/infiltrator/execute() - . = ..() - for(var/datum/mind/M in assigned) - log_admin("[M.name] was made into a traitor by dynamic.") - message_admins("[M.name] was made into a traitor by dynamic.") - ////////////////////////////////////////////// // // // REVOLUTIONARY PROVOCATEUR // @@ -225,3 +221,25 @@ log_admin("[M.name] was made into a bloodsucker by dynamic.") message_admins("[M.name] was made into a bloodsucker by dynamic.") return TRUE + +////////////////////////////////////////////// +// // +// COLLECTOR // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/latejoin/collector + name = "Contraband Collector" + config_tag = "latejoin_collector" + antag_datum = /datum/antagonist/collector + antag_flag = ROLE_MINOR_ANTAG + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 1 + weight = 5 + cost = 1 + requirements = list(10,10,10,10,10,10,10,10,10,10) + high_population_requirement = 10 + repeatable = TRUE + flags = TRAITOR_RULESET + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 2) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 92a02f5920..abd560171e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -494,7 +494,7 @@ high_population_requirement = 50 repeatable_weight_decrease = 2 repeatable = TRUE - property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 2) + property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 1) var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute() diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index afa6ed8ba7..303c436f99 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -1,5 +1,6 @@ /datum/dynamic_storyteller var/name = "none" + var/config_tag = null var/desc = "A coder's idiocy." var/list/property_weights = list() var/curve_centre = 0 @@ -7,6 +8,8 @@ var/forced_threat_level = -1 var/flags = 0 var/weight = 3 // how many rounds need to have been recently played for this storyteller to be left out of the vote + var/event_frequency_lower = 6 MINUTES + var/event_frequency_upper = 20 MINUTES var/datum/game_mode/dynamic/mode = null /** @@ -20,14 +23,6 @@ Property weights are: "conversion" -- Basically a bool. Conversion antags, well, convert. It's its own class for a good reason. */ -/datum/dynamic_storyteller/New() - ..() - if (istype(SSticker.mode, /datum/game_mode/dynamic)) - mode = SSticker.mode - GLOB.dynamic_curve_centre = curve_centre - GLOB.dynamic_curve_width = curve_width - GLOB.dynamic_forced_threat_level = forced_threat_level - /datum/dynamic_storyteller/proc/start_injection_cooldowns() var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) mode.latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time @@ -42,7 +37,28 @@ Property weights are: return /datum/dynamic_storyteller/proc/on_start() - return + if (istype(SSticker.mode, /datum/game_mode/dynamic)) + mode = SSticker.mode + GLOB.dynamic_curve_centre = curve_centre + GLOB.dynamic_curve_width = curve_width + if(flags & USE_PREF_WEIGHTS) + var/voters = 0 + var/mean = 0 + for(var/client/c in GLOB.clients) + var/vote = c.prefs.preferred_chaos + if(vote) + voters += 1 + switch(vote) + if(CHAOS_NONE) + mean -= 5 + if(CHAOS_LOW) + mean -= 2.5 + if(CHAOS_HIGH) + mean += 2.5 + if(CHAOS_MAX) + mean += 5 + GLOB.dynamic_curve_centre += (mean/voters) + GLOB.dynamic_forced_threat_level = forced_threat_level /datum/dynamic_storyteller/proc/get_midround_cooldown() var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) @@ -154,12 +170,15 @@ Property weights are: /datum/dynamic_storyteller/cowabunga name = "Chaotic" + config_tag = "chaotic" curve_centre = 10 desc = "Chaos: high. Variation: high. Likely antags: clock cult, revs, wizard." property_weights = list("extended" = -1, "chaos" = 10) - weight = 2 + weight = 1 + event_frequency_lower = 2 MINUTES + event_frequency_upper = 10 MINUTES flags = WAROPS_ALWAYS_ALLOWED - var/refund_cooldown + var/refund_cooldown = 0 /datum/dynamic_storyteller/cowabunga/get_midround_cooldown() return ..() / 4 @@ -169,12 +188,13 @@ Property weights are: /datum/dynamic_storyteller/cowabunga/do_process() if(refund_cooldown < world.time) - mode.refund_threat(10) - mode.log_threat("Cowabunga it is. Refunded 10 threat. Threat is now [mode.threat].") - refund_cooldown = world.time + 300 SECONDS + mode.refund_threat(20) + mode.log_threat("Cowabunga it is. Refunded 20 threat. Threat is now [mode.threat].") + refund_cooldown = world.time + 600 SECONDS /datum/dynamic_storyteller/team name = "Teamwork" + config_tag = "teamwork" desc = "Chaos: high. Variation: low. Likely antags: nukies, clockwork cult, wizard, blob, xenomorph." curve_centre = 2 curve_width = 1.5 @@ -187,6 +207,7 @@ Property weights are: /datum/dynamic_storyteller/conversion name = "Conversion" + config_tag = "conversion" desc = "Chaos: high. Variation: medium. Likely antags: cults, bloodsuckers, revs." curve_centre = 3 curve_width = 1 @@ -196,24 +217,33 @@ Property weights are: /datum/dynamic_storyteller/classic name = "Random" + config_tag = "random" desc = "Chaos: varies. Variation: highest. No special weights attached." weight = 6 + flags = USE_PREF_WEIGHTS curve_width = 4 /datum/dynamic_storyteller/memes name = "Story" + config_tag = "story" desc = "Chaos: varies. Variation: high. Likely antags: abductors, nukies, wizard, traitor." + weight = 4 + flags = USE_PREF_WEIGHTS curve_width = 4 property_weights = list("story_potential" = 10) /datum/dynamic_storyteller/suspicion name = "Intrigue" + config_tag = "intrigue" desc = "Chaos: low. Variation: high. Likely antags: traitor, bloodsucker. Rare: revs, blood cult." + weight = 4 + flags = USE_PREF_WEIGHTS curve_width = 4 property_weights = list("trust" = -5) /datum/dynamic_storyteller/liteextended name = "Calm" + config_tag = "calm" desc = "Chaos: low. Variation: medium. Likely antags: bloodsuckers, traitors, sentient disease, revenant." curve_centre = -5 curve_width = 0.5 @@ -226,10 +256,12 @@ Property weights are: /datum/dynamic_storyteller/extended name = "Extended" + config_tag = "extended" desc = "Chaos: none. Variation: none. Likely antags: none." curve_centre = -20 - weight = 2 + weight = 0 curve_width = 0.5 /datum/dynamic_storyteller/extended/on_start() + ..() GLOB.dynamic_forced_extended = TRUE diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm index 688af3beea..4dba8dae93 100644 --- a/code/game/gamemodes/gangs/gang_items.dm +++ b/code/game/gamemodes/gangs/gang_items.dm @@ -290,12 +290,6 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m cost = 5 item_path = /obj/item/grenade/syndieminibomb/concussion/frag -/datum/gang_item/equipment/stimpack - name = "Black Market Stimulants" - id = "stimpack" - cost = 12 - item_path = /obj/item/reagent_containers/syringe/stimulants - /datum/gang_item/equipment/implant_breaker name = "Implant Breaker" id = "implant_breaker" diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 6d681f8108..cfb4c9a120 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -21,16 +21,16 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event //Meteor spawning global procs /////////////////////////////// -/proc/spawn_meteors(number = 10, list/meteortypes) +/proc/spawn_meteors(number = 10, list/meteortypes, dir) for(var/i = 0; i < number; i++) - spawn_meteor(meteortypes) + spawn_meteor(meteortypes, dir) -/proc/spawn_meteor(list/meteortypes) +/proc/spawn_meteor(list/meteortypes, dir) var/turf/pickedstart var/turf/pickedgoal var/max_i = 10//number of tries to spawn meteor. while(!isspaceturf(pickedstart)) - var/startSide = pick(GLOB.cardinals) + var/startSide = dir || pick(GLOB.cardinals) var/startZ = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) pickedstart = spaceDebrisStartLoc(startSide, startZ) pickedgoal = spaceDebrisFinishLoc(startSide, startZ) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b7003e4f1e..459ff2f3d6 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -9,9 +9,10 @@ GLOBAL_LIST_EMPTY(objectives) var/explanation_text = "Nothing" //What that person is supposed to do. var/team_explanation_text //For when there are multiple owners. var/datum/mind/target = null //If they are focused on a particular person. - var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. - var/completed = 0 //currently only used for custom objectives. - var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. + var/target_amount = FALSE //If they are focused on a particular number. Steal objectives have their own counter. + var/completed = FALSE //currently only used for custom objectives. + var/completable = TRUE //Whether this objective shows greentext when completed + var/martyr_compatible = FALSE //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. /datum/objective/New(var/text) GLOB.objectives += src // CITADEL EDIT FOR CRYOPODS @@ -172,6 +173,26 @@ GLOBAL_LIST_EMPTY(objectives) /datum/objective/assassinate/admin_edit(mob/admin) admin_simple_target_pick(admin) +/datum/objective/assassinate/once + name = "kill once" + var/won = FALSE + +/datum/objective/assassinate/once/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Kill [target.name], the [!target_role_type ? target.assigned_role : target.special_role]. You only need to kill them once; if they come back, you've still succeeded." + START_PROCESSING(SSprocessing,src) + else + explanation_text = "Free Objective" + +/datum/objective/assassinate/once/check_completion() + return won || ..() + +/datum/objective/assassinate/once/process() + won = check_completion() + if(won) + STOP_PROCESSING(SSprocessing,src) + /datum/objective/assassinate/internal var/stolen = 0 //Have we already eliminated this target? @@ -365,6 +386,28 @@ GLOBAL_LIST_EMPTY(objectives) return FALSE return TRUE +/datum/objective/breakout + name = "breakout" + martyr_compatible = 1 + var/target_role_type = 0 + var/human_check = TRUE + +/datum/objective/breakout/check_completion() + return !target || considered_escaped(target) + +/datum/objective/breakout/find_target_by_role(role, role_type=0, invert=0) + if(!invert) + target_role_type = role_type + ..() + return target + +/datum/objective/breakout/update_explanation_text() + ..() + if(target && target.current) + explanation_text = "Make sure [target.name], the [!target_role_type ? target.assigned_role : target.special_role] escapes on the shuttle or an escape pod alive and without being in custody." + else + explanation_text = "Free Objective" + /datum/objective/escape/escape_with_identity name = "escape with identity" var/target_real_name // Has to be stored because the target's real_name can change over the course of the round @@ -582,7 +625,6 @@ GLOBAL_LIST_EMPTY(possible_items_special) explanation_text = "Do not give up or lose [targetinfo.name]." steal_target = targetinfo.targetitem - /datum/objective/download name = "download" @@ -786,40 +828,10 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/destroy/internal var/stolen = FALSE //Have we already eliminated this target? -/datum/objective/steal_five_of_type - name = "steal five of" - explanation_text = "Steal at least five items!" - var/list/wanted_items = list(/obj/item) - -/datum/objective/steal_five_of_type/New() - ..() - wanted_items = typecacheof(wanted_items) - -/datum/objective/steal_five_of_type/summon_guns - name = "steal guns" - explanation_text = "Steal at least five guns!" - wanted_items = list(/obj/item/gun) - -/datum/objective/steal_five_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/necromantic_stone) - -/datum/objective/steal_five_of_type/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= 5 - //Created by admin tools /datum/objective/custom name = "custom" + completable = FALSE /datum/objective/custom/admin_edit(mob/admin) var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text) @@ -997,4 +1009,147 @@ GLOBAL_LIST_EMPTY(possible_items_special) command_staff_only = TRUE +/datum/objective/hoard + name = "hoard" + var/obj/item/hoarded_item = null +/datum/objective/hoard/get_target() + return hoarded_item + +/datum/objective/hoard/proc/set_target(obj/item/I) + if(I) + hoarded_item = I + explanation_text = "Keep [I] on your person at all times." + return hoarded_item + else + explanation_text = "Free objective" + return + +/datum/objective/hoard/check_completion() + var/list/datum/mind/owners = get_owners() + if(!hoarded_item) + return TRUE + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + + var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. + + for(var/obj/I in all_items) //Check for items + if(I == hoarded_item) + return TRUE + return FALSE + +/datum/objective/hoard/heirloom + name = "steal heirloom" + +/datum/objective/hoard/heirloom/find_target() + set_target(pick(GLOB.family_heirlooms)) + +GLOBAL_LIST_EMPTY(traitor_contraband) + +GLOBAL_LIST_EMPTY(cult_contraband) + +/datum/objective/hoard/collector + name = "Hoard contraband" + +/datum/objective/collector/New() + ..() + if(!GLOB.traitor_contraband.len)//Only need to fill the list when it's needed. + GLOB.traitor_contraband = list(/obj/item/card/emag/empty,/obj/item/clothing/glasses/phantomthief,/obj/item/clothing/gloves/chameleon/broken) + if(!GLOB.cult_contraband.len) + GLOB.cult_contraband = list(/obj/item/clockwork/slab,/obj/item/clockwork/component/belligerent_eye,/obj/item/clockwork/component/belligerent_eye/lens_gem,/obj/item/shuttle_curse,/obj/item/cult_shift) + +/datum/objective/hoard/collector/find_target() + var/obj/item/I + var/I_type + if(prob(50)) + I_type = pick_n_take(GLOB.traitor_contraband) // always unique unless it's run out, in which case we refill it anyway + else + I_type = pick_n_take(GLOB.cult_contraband) + I = new I_type + I.forceMove(get_turf(owner)) + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK)) + hoarded_item = I + + + +GLOBAL_LIST_EMPTY(possible_sabotages) +// For saboteurs. Go in and cause some trouble somewhere. Not necessarily breaking things, just sufficiently troublemaking. +/datum/objective/sabotage + name = "sabotage" + var/datum/sabotage_objective/targetinfo = null //composition > inheritance. + +/datum/objective/sabotage/get_target() + return targetinfo.sabotage_type + +/datum/objective/sabotage/New() + ..() + if(!GLOB.possible_sabotages.len)//Only need to fill the list when it's needed. + for(var/I in subtypesof(/datum/sabotage_objective)) + new I + +/datum/objective/sabotage/find_target() + var/list/datum/mind/owners = get_owners() + var/approved_targets = list() + check_sabotages: + for(var/datum/sabotage_objective/possible_sabotage in GLOB.possible_sabotages) + if(!is_unique_objective(possible_sabotage.sabotage_type) || possible_sabotage.check_conditions()) + continue + for(var/datum/mind/M in owners) + if(M.current.mind.assigned_role in possible_sabotage.excludefromjob) + continue check_sabotages + approved_targets += possible_sabotage + return set_target(safepick(approved_targets)) + +/datum/objective/sabotage/proc/set_target(datum/sabotage_objective/sabo) + if(sabo) + targetinfo = sabo + explanation_text = "[targetinfo.name]" + give_special_equipment(targetinfo.special_equipment) + return sabo + else + explanation_text = "Free objective" + return + +/datum/objective/sabotage/check_completion() + return targetinfo.check_conditions() + +/datum/objective/flavor + name = "flavor" + completable = FALSE + var/flavor_file + +/datum/objective/flavor/proc/get_flavor_list() + return world.file2list(flavor_file) + +/datum/objective/flavor/proc/forge_objective() + var/flavor_list = get_flavor_list() + explanation_text = pick(flavor_list) + +/datum/objective/flavor/traitor + name = "traitor flavor" + flavor_file = "strings/flavor_objectives/traitor.txt" + +/datum/objective/flavor/traitor/get_flavor_list() + . = ..() + switch(owner.assigned_role) + if("Station Engineer", "Atmospheric Technician") + . += world.file2list("strings/flavor_objectives/traitor/engineering.txt") + if("Medical Doctor","Chemist","Virologist","Geneticist") + . += world.file2list("strings/flavor_objectives/traitor/medical.txt") + if("Scientist","Roboticist","Geneticist") + . += world.file2list("strings/flavor_objectives/traitor/science.txt") + if("Assistant") + . += world.file2list("strings/flavor_objectives/traitor/assistant.txt") + +/datum/objective/flavor/ninja_helping + flavor_file = "strings/flavor_objectives/ninja_helping.txt" + +/datum/objective/flavor/ninja_syndie + flavor_file = "strings/flavor_objectives/ninja_syndie.txt" + +/datum/objective/flavor/wizard + flavor_file = "strings/flavor_objectives/wizard.txt" diff --git a/code/game/gamemodes/objective_sabotage.dm b/code/game/gamemodes/objective_sabotage.dm new file mode 100644 index 0000000000..248524f1d2 --- /dev/null +++ b/code/game/gamemodes/objective_sabotage.dm @@ -0,0 +1,107 @@ +/datum/sabotage_objective + var/name = "Free Objective" + var/sabotage_type = "nothing" + var/special_equipment = list() + var/list/excludefromjob = list() + +/datum/sabotage_objective/New() + ..() + if(sabotage_type!="nothing") + GLOB.possible_sabotages += src + +/datum/sabotage_objective/proc/check_conditions() + return TRUE + +/datum/sabotage_objective/processing + var/won = FALSE + +/datum/sabotage_objective/processing/New() + ..() + START_PROCESSING(SSprocessing, src) + +/datum/sabotage_objective/processing/proc/check_condition_processing() + return 100 + +/datum/sabotage_objective/processing/process() + check_condition_processing() + if(won >= 100) + STOP_PROCESSING(SSprocessing,src) + +/datum/sabotage_objective/processing/check_conditions() + return won + +/datum/sabotage_objective/processing/power_sink + name = "Drain at least 1 gigajoule of power using a power sink." + sabotage_type = "powersink" + special_equipment = list(/obj/item/powersink) + var/sink_found = FALSE + var/count = 0 + +/datum/sabotage_objective/processing/power_sink/check_condition_processing() + count += 1 + if(count==10 || sink_found) // doesn't need to fire that often unless a sink exists + var/sink_found_this_time = FALSE + for(var/datum/powernet/PN in GLOB.powernets) + for(var/obj/item/powersink/sink in PN.nodes) + sink_found_this_time = TRUE + won = max(won,sink.power_drained/1e9) + sink_found = sink_found_this_time + count = 0 + return FALSE + +/obj/item/paper/guides/antag/supermatter_sabotage + info = "Ways to sabotage a supermatter:
    \ + " + +/datum/sabotage_objective/processing/supermatter + name = "Sabotage the supermatter so that it goes under 50% integrity. If it is delaminated, you will fail." + sabotage_type = "supermatter" + special_equipment = list(/obj/item/paper/guides/antag/supermatter_sabotage) + var/list/supermatters = list() + excludefromjob = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + +/datum/sabotage_objective/processing/supermatter/check_condition_processing() + if(!supermatters.len) + supermatters = list() + for(var/obj/machinery/power/supermatter_crystal/S in GLOB.machines) + // Delaminating, not within coverage, not on a tile. + if (!isturf(S.loc) || !(is_station_level(S.z) || is_mining_level(S.z))) + continue + supermatters.Add(S) + for(var/obj/machinery/power/supermatter_crystal/S in supermatters) // you can win this with a wishgranter... lol. + won = max(1-((S.get_integrity()-50)/50),won) + return FALSE + +/datum/sabotage_objective/station_integrity + name = "Make sure the station is at less than 80% integrity by the end. Smash walls, windows etc. to reach this goal." + sabotage_type = "integrity" + +/datum/sabotage_objective/station_integrity/check_conditions() + return 5-(max(SSticker.station_integrity*4,320)/80) + +/datum/sabotage_objective/cloner + name = "Destroy all Nanotrasen cloning machines." + sabotage_type = "cloner" + +/datum/sabotage_objective/cloner/check_conditions() + return !(locate(/obj/machinery/clonepod) in GLOB.machines) + +/datum/sabotage_objective/ai_law + name = "Upload a hacked law to the AI." + sabotage_type = "ailaw" + special_equipment = list(/obj/item/aiModule/syndicate) + excludefromjob = list("Chief Engineer","Research Director","Head of Personnel","Captain","Chief Medical Officer","Head Of Security") + +/datum/sabotage_objective/ai_law/check_conditions() + for (var/i in GLOB.ai_list) + var/mob/living/silicon/ai/aiPlayer = i + if(aiPlayer.mind && length(aiPlayer.laws.hacked)) + return TRUE + return FALSE diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 5f44fccdac..44739fcbc0 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -113,6 +113,11 @@ Class Procs: var/atom/movable/occupant = null var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + // For storing and overriding ui id and dimensions + var/tgui_id // ID of TGUI interface + var/ui_style // ID of custom TGUI style (optional) + var/ui_x + var/ui_y var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE @@ -237,7 +242,7 @@ Class Procs: else if(interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON) return FALSE - if(!Adjacent(user)) + if(!Adjacent(user) && !isobserver(user)) var/mob/living/carbon/H = user if(!(istype(H) && H.has_dna() && H.dna.check_mutation(TK))) return FALSE diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 0b9ed6bb3f..41867a8520 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -46,34 +46,37 @@ new /obj/item/stack/spacecash/c200(drop_location()) // will autostack playsound(src.loc, 'sound/items/poster_being_created.ogg', 100, 1) SSshuttle.points -= 200 - if(next_warning < world.time && prob(15)) - var/area/A = get_area(loc) - var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" - radio.talk_into(src, message, radio_channel) - next_warning = world.time + minimum_time_between_warnings + if(next_warning < world.time && prob(15)) + var/area/A = get_area(loc) + var/message = "Unauthorized credit withdrawal underway in [A.map_name]!!" + radio.talk_into(src, message, radio_channel) + next_warning = world.time + minimum_time_between_warnings -/obj/machinery/computer/bank_machine/ui_interact(mob/user) - . = ..() - var/dat = "[station_name()] secure vault. Authorized personnel only.
    " - dat += "Current Balance: [SSshuttle.points] credits.
    " - if(!siphoning) - dat += "Siphon Credits
    " - else - dat += "Halt Credit Siphon
    " +/obj/machinery/computer/bank_machine/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, "bank_machine", name, 320, 165, master_ui, state) + ui.open() - dat += "Close" +/obj/machinery/computer/bank_machine/ui_data(mob/user) + var/list/data = list() + data["current_balance"] = SSshuttle.points + data["siphoning"] = siphoning + data["station_name"] = station_name() - var/datum/browser/popup = new(user, "computer", "Bank Vault", 300, 200) - popup.set_content("
    [dat]
    ") - popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() + return data -/obj/machinery/computer/bank_machine/Topic(href, href_list) +/obj/machinery/computer/bank_machine/ui_act(action, params) if(..()) return - if(href_list["siphon"]) - say("Siphon of station credits has begun!") - siphoning = TRUE - if(href_list["halt"]) - say("Station credit withdrawal halted.") - siphoning = FALSE + + switch(action) + if("siphon") + say("Siphon of station credits has begun!") + siphoning = TRUE + . = TRUE + if("halt") + say("Station credit withdrawal halted.") + siphoning = FALSE + . = TRUE diff --git a/code/game/machinery/bloodbankgen.dm b/code/game/machinery/bloodbankgen.dm index 948e9b98f9..cb25adc126 100644 --- a/code/game/machinery/bloodbankgen.dm +++ b/code/game/machinery/bloodbankgen.dm @@ -32,7 +32,7 @@ if(bag) . += "It has \a [bag.name] hooked to its input slot. The counter reads: \"Current Capacity: [bag.reagents.total_volume] of [bag.reagents.maximum_volume]\"" if(outbag) - . += "It has \a [bag.name] hooked to its output slot. The counter reads: \"Current Capacity: [outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]\"" + . += "It has \a [outbag.name] hooked to its output slot. The counter reads: \"Current Capacity: [outbag.reagents.total_volume] of [outbag.reagents.maximum_volume]\"" /obj/machinery/bloodbankgen/handle_atom_del(atom/A) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index afb882598e..62304112b2 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -61,7 +61,7 @@ QDEL_LIST(unattached_flesh) . = ..() -/obj/machinery/clonepod/RefreshParts() +/obj/machinery/clonepod/RefreshParts() speed_coeff = 0 efficiency = 0 for(var/obj/item/stock_parts/scanning_module/S in component_parts) @@ -471,7 +471,7 @@ if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL)) continue organ.organ_flags |= ORGAN_FROZEN - organ.Remove(H, special=TRUE) + organ.Remove(TRUE) organ.forceMove(src) unattached_flesh += organ diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 3c021d0bd1..7439fd1b8b 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -11,7 +11,6 @@ var/obj/structure/table/optable/table var/list/advanced_surgeries = list() var/datum/techweb/linked_techweb - var/menu = MENU_OPERATION light_color = LIGHT_COLOR_BLUE /obj/machinery/computer/operating/Initialize() @@ -54,8 +53,6 @@ var/list/data = list() data["table"] = table if(table) - data["menu"] = menu - var/list/surgeries = list() for(var/X in advanced_surgeries) var/datum/surgery/S = X @@ -64,9 +61,8 @@ surgery["desc"] = initial(S.desc) surgeries += list(surgery) data["surgeries"] = surgeries - - data["patient"] = list() if(table.check_patient()) + data["patient"] = list() patient = table.patient switch(patient.stat) if(CONSCIOUS) @@ -110,15 +106,14 @@ "alternative_step" = alternative_step, "alt_chems_needed" = alt_chems_needed )) + else + data["patient"] = null return data /obj/machinery/computer/operating/ui_act(action, params) if(..()) return switch(action) - if("change_menu") - menu = text2num(params["menu"]) - . = TRUE if("sync") sync_surgeries() . = TRUE diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 8ddbd68c7b..6d22f9d6c8 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -198,7 +198,7 @@ /obj/machinery/computer/apc_control/proc/log_activity(log_text) var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]" - LAZYADD(logs, "([STATION_TIME_TIMESTAMP("hh:mm:ss")]) [op_string] [log_text]") + LAZYADD(logs, "([STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]) [op_string] [log_text]") /mob/proc/using_power_flow_console() for(var/obj/machinery/computer/apc_control/A in range(1, src)) diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index f9d2a3c103..d6ce850da8 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -91,6 +91,8 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) icon_screen = "tank" icon_keyboard = "atmos_key" circuit = /obj/item/circuitboard/computer/atmos_control + ui_x = 400 + ui_y = 925 var/frequency = FREQ_ATMOS_STORAGE var/list/sensors = list( @@ -125,7 +127,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) 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, "atmos_control", name, 400, 925, master_ui, state) + ui = new(user, src, ui_key, "atmos_control", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/atmos_control/ui_data(mob/user) @@ -161,6 +163,20 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA) +//Incinerator sensor only +/obj/machinery/computer/atmos_control/incinerator + name = "Incinerator Air Control" + sensors = list(ATMOS_GAS_MONITOR_SENSOR_INCINERATOR = "Incinerator Chamber") + ui_x = 400 + ui_y = 300 + +//Toxins mix sensor only +/obj/machinery/computer/atmos_control/toxinsmix + name = "Toxins Mixing Air Control" + sensors = list(ATMOS_GAS_MONITOR_SENSOR_TOXINS_LAB = "Toxins Mixing Chamber") + ui_x = 400 + ui_y = 300 + ///////////////////////////////////////////////////////////// // LARGE TANK CONTROL ///////////////////////////////////////////////////////////// @@ -174,6 +190,9 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) var/list/input_info var/list/output_info + ui_x = 500 + ui_y = 315 + /obj/machinery/computer/atmos_control/tank/oxygen_tank name = "Oxygen Supply Control" input_tag = ATMOS_GAS_MONITOR_INPUT_O2 @@ -216,12 +235,6 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) output_tag = ATMOS_GAS_MONITOR_OUTPUT_CO2 sensors = list(ATMOS_GAS_MONITOR_SENSOR_CO2 = "Carbon Dioxide Tank") -/obj/machinery/computer/atmos_control/tank/incinerator - name = "Incinerator Air Control" - input_tag = ATMOS_GAS_MONITOR_INPUT_INCINERATOR - output_tag = ATMOS_GAS_MONITOR_OUTPUT_INCINERATOR - sensors = list(ATMOS_GAS_MONITOR_SENSOR_INCINERATOR = "Incinerator Chamber") - // This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this /obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user) var/list/IO = list() @@ -235,7 +248,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) IO |= text[1] if(!IO.len) to_chat(user, "No machinery detected.") - var/S = input("Select the device set: ", "Selection", IO[1]) as anything in IO + var/S = input("Select the device set: ", "Selection", IO[1]) as anything in sortList(IO) if(src) src.input_tag = "[S]_in" src.output_tag = "[S]_out" @@ -256,7 +269,7 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) 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, "atmos_control", name, 500, 305, master_ui, state) + ui = new(user, src, ui_key, "atmos_control", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/atmos_control/tank/ui_data(mob/user) @@ -280,13 +293,19 @@ GLOBAL_LIST_EMPTY(atmos_air_controllers) if("input") signal.data += list("tag" = input_tag, "power_toggle" = TRUE) . = TRUE + if("rate") + var/target = text2num(params["rate"]) + if(!isnull(target)) + target = CLAMP(target, 0, MAX_TRANSFER_RATE) + signal.data += list("tag" = input_tag, "set_volume_rate" = target) + . = TRUE if("output") signal.data += list("tag" = output_tag, "power_toggle" = TRUE) . = TRUE if("pressure") - var/target = input("New target pressure:", name, output_info ? output_info["internal"] : 0) as num|null - if(!isnull(target) && !..()) - target = CLAMP(target, 0, 50 * ONE_ATMOSPHERE) + var/target = text2num(params["pressure"]) + if(!isnull(target)) + target = CLAMP(target, 0, MAX_OUTPUT_PRESSURE) signal.data += list("tag" = output_tag, "set_internal_pressure" = target) . = TRUE radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 90969bf4a1..4d21ae77b0 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -482,7 +482,7 @@ R.fields["ckey"] = mob_occupant.ckey R.fields["name"] = mob_occupant.real_name - R.fields["id"] = copytext(md5(mob_occupant.real_name), 2, 6) + R.fields["id"] = copytext_char(md5(mob_occupant.real_name), 2, 6) R.fields["UE"] = dna.unique_enzymes R.fields["UI"] = dna.uni_identity R.fields["SE"] = dna.struc_enzymes diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 1bc8a82147..59574bc603 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -443,7 +443,7 @@ var/dat = "" if(SSshuttle.emergency.mode == SHUTTLE_CALL) var/timeleft = SSshuttle.emergency.timeLeft() - dat += "Emergency shuttle\n
    \nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]" + dat += "Emergency shuttle\n
    \nETA: [timeleft / 60 % 60]:[add_leading(num2text(timeleft % 60), 2, "0")]" var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 7330ae26e7..a31f6c71c8 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -274,13 +274,18 @@ var/max_line_len = 7*DNA_BLOCK_SIZE if(viable_occupant) temp_html += "
    1
    " - var/len = length(viable_occupant.dna.uni_identity) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.uni_identity,i,i+1)]" - if ((i % max_line_len) == 0) + var/char = "" + var/ui_text = viable_occupant.dna.uni_identity + var/len_byte = length(ui_text) + var/char_it = 0 + for(var/byte_it = 1, byte_it <= len_byte, byte_it += length(char)) + char_it++ + char = ui_text[byte_it] + temp_html += "[char]" + if((char_it % max_line_len) == 0) temp_html += "
    " - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
    [(i / DNA_BLOCK_SIZE) + 1]
    " + if((char_it % DNA_BLOCK_SIZE) == 0 && byte_it < len_byte) + temp_html += "
    [(char_it / DNA_BLOCK_SIZE) + 1]
    " else temp_html += "----" temp_html += "

    " @@ -288,13 +293,18 @@ temp_html += "
    Structural Enzymes:
    " if(viable_occupant) temp_html += "
    1
    " - var/len = length(viable_occupant.dna.struc_enzymes) - for(var/i=1, i<=len, i++) - temp_html += "[copytext(viable_occupant.dna.struc_enzymes,i,i+1)]" - if ((i % max_line_len) == 0) + var/char = "" + var/se_text = viable_occupant.dna.struc_enzymes + var/len_byte = length(se_text) + var/char_it = 0 + for(var/byte_it = 1, byte_it <= len_byte, byte_it += length(char)) + char_it++ + char = se_text[byte_it] + temp_html += "[char]" + if((char_it % max_line_len) == 0) temp_html += "
    " - if((i % DNA_BLOCK_SIZE) == 0 && i < len) - temp_html += "
    [(i / DNA_BLOCK_SIZE) + 1]
    " + if((char_it % DNA_BLOCK_SIZE) == 0 && byte_it < len_byte) + temp_html += "
    [(char_it / DNA_BLOCK_SIZE) + 1]
    " else temp_html += "----" temp_html += "
    " @@ -465,7 +475,7 @@ viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage if("pulseui") - var/len = length(viable_occupant.dna.uni_identity) + var/len = length_char(viable_occupant.dna.uni_identity) num = WRAP(num, 1, len+1) num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low @@ -473,12 +483,12 @@ var/subblock = num - block*DNA_BLOCK_SIZE last_change = "UI #[block]-[subblock]; " - var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1) + var/hex = copytext_char(viable_occupant.dna.uni_identity, num, num+1) last_change += "[hex]" hex = scramble(hex, radstrength, radduration) last_change += "->[hex]" - viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0) + viable_occupant.dna.uni_identity = copytext_char(viable_occupant.dna.uni_identity, 1, num) + hex + copytext_char(viable_occupant.dna.uni_identity, num + 1) viable_occupant.updateappearance(mutations_overlay_update=1) if("pulsese") var/len = length(viable_occupant.dna.struc_enzymes) @@ -489,12 +499,12 @@ var/subblock = num - block*DNA_BLOCK_SIZE last_change = "SE #[block]-[subblock]; " - var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1) + var/hex = copytext_char(viable_occupant.dna.struc_enzymes, num, num+1) last_change += "[hex]" hex = scramble(hex, radstrength, radduration) last_change += "->[hex]" - viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0) + viable_occupant.dna.struc_enzymes = copytext_char(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext_char(viable_occupant.dna.struc_enzymes, num + 1) viable_occupant.domutcheck() else current_screen = "mainmenu" diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index b5d393bce0..1924cd9f23 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -1,11 +1,13 @@ /obj/machinery/computer/launchpad - name = "\improper launchpad control console" + name = "launchpad control console" desc = "Used to teleport objects to and from a launchpad." icon_screen = "teleport" icon_keyboard = "teleport_key" circuit = /obj/item/circuitboard/computer/launchpad_console - var/sending = TRUE - var/current_pad //current pad viewed on the screen + ui_x = 475 + ui_y = 260 + + var/selected_id var/list/obj/machinery/launchpad/launchpads var/maximum_pads = 4 @@ -18,7 +20,9 @@ return /obj/machinery/computer/launchpad/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/multitool)) + if(W.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, W)) + return var/obj/item/multitool/M = W if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) if(LAZYLEN(launchpads) < maximum_pads) @@ -36,55 +40,7 @@ return FALSE return TRUE -/obj/machinery/computer/launchpad/proc/get_pad(number) - var/obj/machinery/launchpad/pad = launchpads[number] - return pad - -/obj/machinery/computer/launchpad/ui_interact(mob/user) - . = ..() - var/list/t = list() - if(!LAZYLEN(launchpads)) - obj_flags &= ~IN_USE //Yeah so if you deconstruct teleporter while its in the process of shooting it wont disable the console - t += "
    No launchpad located.

    " - else - for(var/i in 1 to LAZYLEN(launchpads)) - if(pad_exists(i)) - var/obj/machinery/launchpad/pad = get_pad(i) - if(pad.stat & NOPOWER) - t+= "[pad.display_name]" - else - t+= "[pad.display_name]" - else - launchpads -= get_pad(i) - t += "
    " - - if(current_pad) - var/obj/machinery/launchpad/pad = get_pad(current_pad) - t += "
    [pad.display_name]
    " - t += "Rename" - t += "Remove

    " - t += "O" //up-left - t += "^" //up - t += "O
    " //up-right - t += "<"//left - t += "R"//reset to 0 - t += ">
    "//right - t += "O"//down-left - t += "v"//down - t += "O
    "//down-right - t += "
    " - t += "
    Current offset:

    " - t += "
    [abs(pad.y_offset)] [pad.y_offset > 0 ? "N":"S"] \[SET\]

    " - t += "
    [abs(pad.x_offset)] [pad.x_offset > 0 ? "E":"W"] \[SET\]

    " - - t += "
    Launch" - t += " Pull" - - var/datum/browser/popup = new(user, "launchpad", name, 300, 500) - popup.set_content(t.Join()) - popup.open() - -/obj/machinery/computer/launchpad/proc/teleport(mob/user, obj/machinery/launchpad/pad) +/obj/machinery/computer/launchpad/proc/teleport(mob/user, obj/machinery/launchpad/pad, sending) if(QDELETED(pad)) to_chat(user, "ERROR: Launchpad not responding. Check launchpad integrity.") return @@ -93,66 +49,83 @@ return pad.doteleport(user, sending) -/obj/machinery/computer/launchpad/Topic(href, href_list) - var/obj/machinery/launchpad/pad - if(href_list["pad"]) - pad = get_pad(text2num(href_list["pad"])) +/obj/machinery/computer/launchpad/proc/get_pad(number) + var/obj/machinery/launchpad/pad = launchpads[number] + return pad +/obj/machinery/computer/launchpad/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, 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, "launchpad_console", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/computer/launchpad/ui_data(mob/user) + var/list/data = list() + var/list/pad_list = list() + for(var/i in 1 to LAZYLEN(launchpads)) + if(pad_exists(i)) + var/obj/machinery/launchpad/pad = get_pad(i) + var/list/this_pad = list() + this_pad["name"] = pad.display_name + this_pad["id"] = i + if(pad.stat & NOPOWER) + this_pad["inactive"] = TRUE + pad_list += list(this_pad) + else + launchpads -= get_pad(i) + data["launchpads"] = pad_list + data["selected_id"] = selected_id + if(selected_id) + var/obj/machinery/launchpad/current_pad = launchpads[selected_id] + data["x"] = current_pad.x_offset + data["y"] = current_pad.y_offset + data["pad_name"] = current_pad.display_name + data["range"] = current_pad.range + data["selected_pad"] = current_pad + if(QDELETED(current_pad) || (current_pad.stat & NOPOWER)) + data["pad_active"] = FALSE + return data + data["pad_active"] = TRUE + + return data + +/obj/machinery/computer/launchpad/ui_act(action, params) if(..()) return - if(!LAZYLEN(launchpads)) - updateDialog() - return + var/obj/machinery/launchpad/current_pad = launchpads[selected_id] + switch(action) + if("select_pad") + selected_id = text2num(params["id"]) + . = TRUE + if("set_pos") + var/new_x = text2num(params["x"]) + var/new_y = text2num(params["y"]) + current_pad.set_offset(new_x, new_y) + . = TRUE + if("move_pos") + var/plus_x = text2num(params["x"]) + var/plus_y = text2num(params["y"]) + current_pad.set_offset( + x = current_pad.x_offset + plus_x, + y = current_pad.y_offset + plus_y + ) + . = TRUE + if("rename") + . = TRUE + var/new_name = params["name"] + if(!new_name) + return + current_pad.display_name = new_name + if("remove") + if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") + launchpads -= current_pad + selected_id = null + . = TRUE + if("launch") + teleport(usr, current_pad, TRUE) + . = TRUE - if(href_list["choose_pad"]) - current_pad = text2num(href_list["pad"]) - - if(href_list["raisex"]) - if(pad.x_offset < pad.range) - pad.x_offset++ - - if(href_list["lowerx"]) - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - - if(href_list["raisey"]) - if(pad.y_offset < pad.range) - pad.y_offset++ - - if(href_list["lowery"]) - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - - if(href_list["reset"]) - pad.y_offset = 0 - pad.x_offset = 0 - - if(href_list["change_name"]) - var/new_name = stripped_input(usr, "What do you wish to name the launchpad?", "Launchpad", pad.display_name, 15) - if(!new_name) - return - pad.display_name = new_name - - if(href_list["setx"]) - var/newx = input(usr, "Input new x offset", pad.display_name, pad.x_offset) as null|num - if(!isnull(newx)) - pad.x_offset = CLAMP(newx, -pad.range, pad.range) - - if(href_list["sety"]) - var/newy = input(usr, "Input new y offset", pad.display_name, pad.y_offset) as null|num - if(!isnull(newy)) - pad.y_offset = CLAMP(newy, -pad.range, pad.range) - - if(href_list["remove"]) - if(usr && alert(usr, "Are you sure?", "Remove Launchpad", "I'm Sure", "Abort") != "Abort") - launchpads -= pad - - if(href_list["launch"]) - sending = TRUE - teleport(usr, pad) - - if(href_list["pull"]) - sending = FALSE - teleport(usr, pad) - - updateDialog() + if("pull") + teleport(usr, current_pad, FALSE) + . = TRUE + . = TRUE \ No newline at end of file diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 29055e87c3..ecbde43044 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -478,7 +478,7 @@ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1) + active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss", world.time), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1) else if(href_list["del_c"]) if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index f6e164efe9..e4a6a0b2d4 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -6,6 +6,9 @@ icon_keyboard = "security_key" req_access = list(ACCESS_ARMORY) circuit = /obj/item/circuitboard/computer/gulag_teleporter_console + ui_x = 350 + ui_y = 295 + var/default_goal = 200 var/obj/machinery/gulag_teleporter/teleporter = null var/obj/structure/gulag_beacon/beacon = null @@ -22,7 +25,7 @@ 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, "gulag_console", name, 455, 440, master_ui, state) + ui = new(user, src, ui_key, "gulag_console", name, ui_x, ui_y, master_ui, state) ui.open() /obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user) @@ -50,13 +53,19 @@ data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" data["teleporter_lock"] = teleporter.locked data["teleporter_state_open"] = teleporter.state_open + else + data["teleporter"] = null if(beacon) data["beacon"] = beacon data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" + else + data["beacon"] = null if(contained_id) data["id"] = contained_id data["id_name"] = contained_id.registered_name data["goal"] = contained_id.goal + else + data["id"] = null data["can_teleport"] = can_teleport return data @@ -72,36 +81,41 @@ switch(action) if("scan_teleporter") teleporter = findteleporter() + return TRUE if("scan_beacon") beacon = findbeacon() + return TRUE if("handle_id") if(contained_id) id_eject(usr) else id_insert(usr) + return TRUE if("set_goal") - var/new_goal = input("Set the amount of points:", "Points", contained_id.goal) as num|null + var/new_goal = text2num(params["value"]) if(!isnum(new_goal)) return if(!new_goal) new_goal = default_goal - if (new_goal > 1000) - to_chat(usr, "The entered amount of points is too large. Points have instead been set to the maximum allowed amount.") contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + return TRUE if("toggle_open") if(teleporter.locked) - to_chat(usr, "The teleporter is locked") + to_chat(usr, "The teleporter must be unlocked first.") return teleporter.toggle_open() + return TRUE if("teleporter_lock") if(teleporter.state_open) - to_chat(usr, "Close the teleporter before locking!") + to_chat(usr, "The teleporter must be closed first.") return teleporter.locked = !teleporter.locked + return TRUE if("teleport") if(!teleporter || !beacon) return addtimer(CALLBACK(src, .proc/teleport, usr), 5) + return TRUE /obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/scan_machinery() teleporter = findteleporter() @@ -129,12 +143,12 @@ say("[contained_id]'s ID card goal defaulting to [contained_id.goal] points.") log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.") teleporter.handle_prisoner(contained_id, temporary_record) - playsound(src, 'sound/weapons/emitter.ogg', 50, 1) + playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE) prisoner.forceMove(get_turf(beacon)) prisoner.Stun(40) // small travel dizziness to_chat(prisoner, "The teleportation makes you a little dizzy.") new /obj/effect/particle_effect/sparks(get_turf(prisoner)) - playsound(src, "sparks", 50, 1) + playsound(src, "sparks", 50, TRUE) if(teleporter.locked) teleporter.locked = FALSE teleporter.toggle_open() diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index 653f6bf48b..496e14b8f1 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -125,7 +125,7 @@ to_chat(usr, "Unauthorized access.") else if(href_list["warn"]) - var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) + var/warning = stripped_input(usr, "Message:", "Enter your message here!", "", MAX_MESSAGE_LEN) if(!warning) return var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index aabb1fe408..42e31b2ea6 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -456,7 +456,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1) + active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
    []", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss", world.time), time2text(world.realtime, "MMM DD"), GLOB.year_integer, t1) if("Delete Record (ALL)") if(active1) @@ -544,7 +544,7 @@ What a mess.*/ switch(href_list["field"]) if("name") if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record)) - var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN) + var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], MAX_MESSAGE_LEN) if(!canUseSecurityRecordsConsole(usr, t1, a1)) return if(istype(active1, /datum/data/record)) @@ -636,7 +636,7 @@ What a mess.*/ var/t2 = stripped_input(usr, "Please input minor crime details:", "Secure. records", "", null) if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss")) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)) GLOB.data_core.addMinorCrime(active1.fields["id"], crime) investigate_log("New Minor Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) if("mi_crim_delete") @@ -651,7 +651,7 @@ What a mess.*/ var/t2 = stripped_input(usr, "Please input major crime details:", "Secure. records", "", null) if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return - var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss")) + var/crime = GLOB.data_core.createCrimeEntry(t1, t2, authenticated, STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)) GLOB.data_core.addMajorCrime(active1.fields["id"], crime) investigate_log("New Major Crime: [t1]: [t2] | Added to [active1.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) if("ma_crim_delete") diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 1b700fdf36..c3fef3ff92 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -20,17 +20,18 @@ 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, "station_alert", name, 300, 500, master_ui, state) + ui = new(user, src, ui_key, "station_alert", name, 325, 500, master_ui, state) ui.open() /obj/machinery/computer/station_alert/ui_data(mob/user) - . = list() + var/list/data = list() - .["alarms"] = list() + data["alarms"] = list() for(var/class in alarms) - .["alarms"][class] = list() + data["alarms"][class] = list() for(var/area in alarms[class]) - .["alarms"][class] += area + data["alarms"][class] += area + return data /obj/machinery/computer/station_alert/proc/triggerAlarm(class, area/A, O, obj/source) if(source.z != z) diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 768faa8301..72c8979006 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -136,7 +136,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E var/list/transferlog = list() /obj/machinery/computer/telecrystals/boss/proc/logTransfer(logmessage) - transferlog += ("[STATION_TIME_TIMESTAMP("hh:mm:ss")] [logmessage]") + transferlog += ("[STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)] [logmessage]") /obj/machinery/computer/telecrystals/boss/proc/scanUplinkers() for(var/obj/machinery/computer/telecrystals/uplinker/A in urange(scanrange, src.loc)) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index c52cf29660..518f38fc35 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -5,6 +5,8 @@ icon_keyboard = "teleport_key" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/computer/teleporter + ui_x = 475 + ui_y = 130 var/regime_set = "Teleporter" var/id var/obj/machinery/teleport/station/power_station @@ -32,34 +34,30 @@ break return power_station -/obj/machinery/computer/teleporter/ui_interact(mob/user) - . = ..() - var/data = "

    Teleporter Status

    " - if(!power_station) - data += "
    No power station linked.
    " - else if(!power_station.teleporter_hub) - data += "
    No hub linked.
    " +obj/machinery/computer/teleporter/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, "teleporter", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/computer/teleporter/ui_data(mob/user) + var/list/data = list() + data["power_station"] = power_station ? TRUE : FALSE + data["teleporter_hub"] = power_station?.teleporter_hub ? TRUE : FALSE + data["regime_set"] = regime_set + data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]" + data["calibrating"] = calibrating + + if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 3) + data["calibrated"] = TRUE else - data += "
    Current regime: [regime_set]
    " - data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"]
    " - if(calibrating) - data += "Calibration: In Progress" - else if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) - data += "Calibration: Optimal" - else - data += "Calibration: Sub-Optimal" - data += "

    " + data["calibrated"] = FALSE - data += "Change regime
    " - data += "Set target
    " + return data - data += "
    Calibrate Hub" - var/datum/browser/popup = new(user, "teleporter", name, 400, 400) - popup.set_content(data) - popup.open() - -/obj/machinery/computer/teleporter/Topic(href, href_list) +/obj/machinery/computer/teleporter/ui_act(action, params) if(..()) return @@ -70,38 +68,39 @@ say("Error: Calibration in progress. Stand by.") return - if(href_list["regimeset"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - reset_regime() - if(href_list["settarget"]) - power_station.engaged = 0 - power_station.teleporter_hub.update_icon() - power_station.teleporter_hub.calibrated = 0 - set_target(usr) - if(href_list["calibrate"]) - if(!target) - say("Error: No target set to calibrate to.") - return - if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3) - say("Hub is already calibrated!") - return - say("Processing hub calibration to target...") + switch(action) + if("regimeset") + power_station.engaged = FALSE + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = FALSE + reset_regime() + . = TRUE + if("settarget") + power_station.engaged = FALSE + power_station.teleporter_hub.update_icon() + power_station.teleporter_hub.calibrated = FALSE + set_target(usr) + . = TRUE + if("calibrate") + if(!target) + say("Error: No target set to calibrate to.") + return + if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3) + say("Hub is already calibrated!") + return - calibrating = 1 - power_station.update_icon() - spawn(50 * (3 - power_station.efficiency)) //Better parts mean faster calibration - calibrating = 0 - if(check_hub_connection()) - power_station.teleporter_hub.calibrated = 1 - say("Calibration complete.") - else - say("Error: Unable to detect hub.") + say("Processing hub calibration to target...") + calibrating = TRUE power_station.update_icon() - updateDialog() - - updateDialog() + spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration + calibrating = FALSE + if(check_hub_connection()) + power_station.teleporter_hub.calibrated = TRUE + say("Calibration complete.") + else + say("Error: Unable to detect hub.") + power_station.update_icon() + . = TRUE /obj/machinery/computer/teleporter/proc/check_hub_connection() if(!power_station) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index c6b4f2fcf5..6bedfb0a10 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -430,6 +430,6 @@ /obj/machinery/jukebox/disco/process() . = ..() if(active) - for(var/mob/M in rangers) + for(var/mob/living/M in rangers) if(prob(5+(allowed(M)*4)) && M.canmove) dance(M) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index f3be6ac214..a1931e133a 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -120,7 +120,7 @@ /obj/machinery/defibrillator_mount/AltClick(mob/living/carbon/user) . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return . = TRUE if(!defib) @@ -129,9 +129,10 @@ if(clamps_locked) to_chat(user, "You try to tug out [defib], but the mount's clamps are locked tight!") return - if(!user.put_in_hands(defib)) + if(!user.get_empty_held_indexes()) to_chat(user, "You need a free hand!") return + user.put_in_hands(defib) user.visible_message("[user] unhooks [defib] from [src].", \ "You slide out [defib] from [src] and unhook the charging cables.") playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) @@ -147,4 +148,4 @@ materials = list(MAT_METAL = 300, MAT_GLASS = 100) w_class = WEIGHT_CLASS_BULKY result_path = /obj/machinery/defibrillator_mount - pixel_shift = -28 \ No newline at end of file + pixel_shift = -28 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 3e88223037..f28d520114 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1434,7 +1434,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "ai_airlock", name, 550, 456, master_ui, state) + ui = new(user, src, ui_key, "ai_airlock", name, 500, 390, master_ui, state) ui.open() return TRUE @@ -1503,83 +1503,24 @@ if("shock-perm") shock_perm(usr) . = TRUE - if("idscan-on") - if(wires.is_cut(WIRE_IDSCAN)) - to_chat(usr, "You can't enable IdScan - The IdScan wire has been cut.") - else if(src.aiDisabledIdScanner) - aiDisabledIdScanner = FALSE - else - to_chat(usr, "The IdScan feature is not disabled.") + if("idscan-toggle") + aiDisabledIdScanner = !aiDisabledIdScanner . = TRUE - if("idscan-off") - if(wires.is_cut(WIRE_IDSCAN)) - to_chat(usr, "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways.") - else if(aiDisabledIdScanner) - to_chat(usr, "You've already disabled the IdScan feature.") - else - aiDisabledIdScanner = TRUE + if("emergency-toggle") + toggle_emergency(usr) . = TRUE - if("emergency-on") - emergency_on(usr) + if("bolt-toggle") + toggle_bolt(usr) . = TRUE - if("emergency-off") - emergency_off(usr) + if("light-toggle") + lights = !lights + update_icon() . = TRUE - if("bolt-raise") - bolt_raise(usr) + if("safe-toggle") + safe = !safe . = TRUE - if("bolt-drop") - bolt_drop(usr) - . = TRUE - if("light-on") - if(wires.is_cut(WIRE_LIGHT)) - to_chat(usr, "Control to door bolt lights has been severed.") - else if (!src.lights) - lights = TRUE - update_icon() - else - to_chat(usr, text("Door bolt lights are already enabled!")) - . = TRUE - if("light-off") - if(wires.is_cut(WIRE_LIGHT)) - to_chat(usr, "Control to door bolt lights has been severed.") - else if (lights) - lights = FALSE - update_icon() - else - to_chat(usr, "Door bolt lights are already disabled!") - . = TRUE - if("safe-on") - if(wires.is_cut(WIRE_SAFETY)) - to_chat(usr, "Control to door sensors is disabled.") - else if (!src.safe) - safe = TRUE - else - to_chat(usr, "Firmware reports safeties already in place.") - . = TRUE - if("safe-off") - if(wires.is_cut(WIRE_SAFETY)) - to_chat(usr, "Control to door sensors is disabled.") - else if (safe) - safe = FALSE - else - to_chat(usr, "Firmware reports safeties already overridden.") - . = TRUE - if("speed-on") - if(wires.is_cut(WIRE_TIMING)) - to_chat(usr, "Control to door timing circuitry has been severed.") - else if (!src.normalspeed) - normalspeed = 1 - else - to_chat(usr,"Door timing circuitry currently operating normally.") - . = TRUE - if("speed-off") - if(wires.is_cut(WIRE_TIMING)) - to_chat(usr, "Control to door timing circuitry has been severed.") - else if (normalspeed) - normalspeed = 0 - else - to_chat(usr, "Door timing circuitry already accelerated.") + if("speed-toggle") + normalspeed = !normalspeed . = TRUE if("open-close") @@ -1617,45 +1558,26 @@ log_combat(user, src, "electrified") set_electrified(ELECTRIFIED_PERMANENT) -/obj/machinery/door/airlock/proc/emergency_on(mob/user) - if(!user_allowed(user)) - return - if (!emergency) - emergency = TRUE - update_icon() - else - to_chat(user, "Emergency access is already enabled!") - -/obj/machinery/door/airlock/proc/emergency_off(mob/user) - if(!user_allowed(user)) - return - if (emergency) - emergency = FALSE - update_icon() - else - to_chat(user, "Emergency access is already disabled!") - -/obj/machinery/door/airlock/proc/bolt_raise(mob/user) +/obj/machinery/door/airlock/proc/toggle_bolt(mob/user) if(!user_allowed(user)) return if(wires.is_cut(WIRE_BOLTS)) - to_chat(user, "The door bolt drop wire is cut - you can't raise the door bolts") - else if(!src.locked) - to_chat(user, "The door bolts are already up") - else - if(src.hasPower()) - unbolt() + to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.") + return + if(locked) + if(!hasPower()) + to_chat(user, "The door has no power - you can't raise the door bolts.") else - to_chat(user, "Cannot raise door bolts due to power failure") - -/obj/machinery/door/airlock/proc/bolt_drop(mob/user) - if(!user_allowed(user)) - return - if(wires.is_cut(WIRE_BOLTS)) - to_chat(user, "You can't drop the door bolts - The door bolt dropping wire has been cut.") + unbolt() else bolt() +/obj/machinery/door/airlock/proc/toggle_emergency(mob/user) + if(!user_allowed(user)) + return + emergency = !emergency + update_icon() + /obj/machinery/door/airlock/proc/user_toggle_open(mob/user) if(!user_allowed(user)) return diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 54774a8f99..7b90715f2b 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -14,7 +14,7 @@ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state) SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, master_ui, state) + ui = new(user, src, ui_key, "airlock_electronics", name, 420, 485, master_ui, state) ui.open() /obj/item/electronics/airlock/ui_data() @@ -43,13 +43,16 @@ if(..()) return switch(action) - if("clear") + if("clear_all") accesses = list() one_access = 0 . = TRUE if("one_access") one_access = !one_access . = TRUE + if("grant_all") + accesses = get_all_accesses() + . = TRUE if("set") var/access = text2num(params["access"]) if (!(access in accesses)) diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index beaf47d0a3..3bfcececda 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -149,7 +149,7 @@ 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, "brig_timer", name, 300, 200, master_ui, state) + ui = new(user, src, ui_key, "brig_timer", name, 300, 138, master_ui, state) ui.open() //icon update function @@ -168,7 +168,7 @@ if(timing) var/disp1 = id var/time_left = time_left(seconds = TRUE) - var/disp2 = "[add_zero(num2text((time_left / 60) % 60),2)]~[add_zero(num2text(time_left % 60), 2)]" + var/disp2 = "[add_leading(num2text((time_left / 60) % 60), 2, "0")]:[add_leading(num2text(time_left % 60), 2, "0")]" if(length(disp2) > CHARS_PER_LINE) disp2 = "Error" update_display(disp1, disp2) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index f51c145635..55b1e34022 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -31,7 +31,7 @@ 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, "gulag_item_reclaimer", name, 455, 440, master_ui, state) + ui = new(user, src, ui_key, "gulag_item_reclaimer", name, 300, 400, master_ui, state) ui.open() /obj/machinery/gulag_item_reclaimer/ui_data(mob/user) diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index b4a9584368..0f5e51215d 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -16,6 +16,7 @@ var/power_efficiency = 1 var/x_offset = 0 var/y_offset = 0 + var/indicator_icon = "launchpad_target" /obj/machinery/launchpad/RefreshParts() var/E = 0 @@ -34,17 +35,28 @@ return if(panel_open) - if(istype(I, /obj/item/multitool)) + if(I.tool_behaviour == TOOL_MULTITOOL) + if(!multitool_check_buffer(user, I)) + return var/obj/item/multitool/M = I M.buffer = src to_chat(user, "You save the data in the [I.name]'s buffer.") - return 1 + return TRUE if(default_deconstruction_crowbar(I)) return return ..() +/obj/machinery/launchpad/attack_ghost(mob/dead/observer/ghost) + . = ..() + if(.) + return + var/target_x = x + x_offset + var/target_y = y + y_offset + var/turf/target = locate(target_x, target_y, z) + ghost.forceMove(target) + /obj/machinery/launchpad/proc/isAvailable() if(stat & NOPOWER) return FALSE @@ -52,6 +64,14 @@ return FALSE return TRUE +/obj/machinery/launchpad/proc/set_offset(x, y) + if(teleporting) + return + if(!isnull(x)) + x_offset = CLAMP(x, -range, range) + if(!isnull(y)) + y_offset = CLAMP(y, -range, range) + /obj/machinery/launchpad/proc/doteleport(mob/user, sending) if(teleporting) to_chat(user, "ERROR: Launchpad busy.") @@ -69,12 +89,22 @@ var/area/A = get_area(target) flick(icon_teleport, src) - playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1) + + //Change the indicator's icon to show that we're teleporting + if(sending) + indicator_icon = "launchpad_launch" + else + indicator_icon = "launchpad_pull" + + playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE) teleporting = TRUE sleep(teleport_speed) + //Set the indicator icon back to normal + indicator_icon = "launchpad_target" + if(QDELETED(src) || !isAvailable()) return @@ -91,25 +121,25 @@ source = dest dest = target - playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1) + playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE) var/first = TRUE for(var/atom/movable/ROI in source) if(ROI == src) continue - // if it's anchored, don't teleport + if(!istype(ROI) || isdead(ROI) || iscameramob(ROI) || istype(ROI, /obj/effect/dummy/phased_mob)) + continue//don't teleport these var/on_chair = "" - if(ROI.anchored) + if(ROI.anchored)// if it's anchored, don't teleport if(isliving(ROI)) var/mob/living/L = ROI if(L.buckled) // TP people on office chairs if(L.buckled.anchored) continue - on_chair = " (on a chair)" else continue - else if(!isobserver(ROI)) + else continue if(!first) log_msg += ", " @@ -158,11 +188,11 @@ var/obj/item/storage/briefcase/launchpad/briefcase /obj/machinery/launchpad/briefcase/Initialize(mapload, briefcase) - . = ..() - if(!briefcase) - log_game("[src] has been spawned without a briefcase.") - return INITIALIZE_HINT_QDEL - src.briefcase = briefcase + . = ..() + if(!briefcase) + log_game("[src] has been spawned without a briefcase.") + return INITIALIZE_HINT_QDEL + src.briefcase = briefcase /obj/machinery/launchpad/briefcase/Destroy() QDEL_NULL(briefcase) @@ -255,7 +285,7 @@ /obj/item/launchpad_remote/ui_interact(mob/user, ui_key = "launchpad_remote", 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, "launchpad_remote", "Briefcase Launchpad Remote", 550, 400, master_ui, state) //width, height + ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 300, 240, master_ui, state) //width, height ui.set_style("syndicate") ui.open() @@ -270,10 +300,9 @@ return data data["pad_name"] = pad.display_name - data["abs_x"] = abs(pad.x_offset) - data["abs_y"] = abs(pad.y_offset) - data["north_south"] = pad.y_offset > 0 ? "N":"S" - data["east_west"] = pad.x_offset > 0 ? "E":"W" + data["range"] = pad.range + data["x"] = pad.x_offset + data["y"] = pad.y_offset return data /obj/item/launchpad_remote/proc/teleport(mob/user, obj/machinery/launchpad/pad) @@ -289,76 +318,33 @@ if(..()) return switch(action) - if("right") - if(pad.x_offset < pad.range) - pad.x_offset++ + if("set_pos") + var/new_x = text2num(params["x"]) + var/new_y = text2num(params["y"]) + pad.set_offset(new_x, new_y) . = TRUE - - if("left") - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- + if("move_pos") + var/plus_x = text2num(params["x"]) + var/plus_y = text2num(params["y"]) + pad.set_offset( + x = pad.x_offset + plus_x, + y = pad.y_offset + plus_y + ) . = TRUE - - if("up") - if(pad.y_offset < pad.range) - pad.y_offset++ - . = TRUE - - if("down") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - . = TRUE - - if("up-right") - if(pad.y_offset < pad.range) - pad.y_offset++ - if(pad.x_offset < pad.range) - pad.x_offset++ - . = TRUE - - if("up-left") - if(pad.y_offset < pad.range) - pad.y_offset++ - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - . = TRUE - - if("down-right") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - if(pad.x_offset < pad.range) - pad.x_offset++ - . = TRUE - - if("down-left") - if(pad.y_offset > (pad.range * -1)) - pad.y_offset-- - if(pad.x_offset > (pad.range * -1)) - pad.x_offset-- - . = TRUE - - if("reset") - pad.y_offset = 0 - pad.x_offset = 0 - . = TRUE - if("rename") . = TRUE - var/new_name = stripped_input(usr, "How do you want to rename the launchpad?", "Launchpad", pad.display_name, 15) + var/new_name = params["name"] if(!new_name) return pad.display_name = new_name - if("remove") . = TRUE if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort") pad = null - if("launch") sending = TRUE teleport(usr, pad) . = TRUE - if("pull") sending = FALSE teleport(usr, pad) diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 9a10ede1ac..b010f77cac 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -306,7 +306,7 @@ if(speed <= 0) speed = 1 if("setpath") - var/newpath = copytext(sanitize(input(usr, "Please define a new path!",,path) as text|null),1,MAX_MESSAGE_LEN) + var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN) if(newpath && newpath != "") moving = 0 // stop moving path = newpath @@ -368,13 +368,19 @@ // Generates the rpath variable using the path string, think of this as "string2list" // Doesn't use params2list() because of the akward way it stacks entities rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length + var/maximum_characters = 50 - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path + var/lentext = length(path) + var/nextchar = "" + var/charcount = 0 - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list + for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path + nextchar = path[i] // find next character + if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore + continue + rpath += nextchar // else, add to list // there doesn't HAVE to be separators but it makes paths syntatically visible + charcount++ + if(charcount >= maximum_characters) + break diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 5a567886b8..93c94ae8b6 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -62,7 +62,7 @@ var/index = findtext(e, "=") // format is "key=value" if(index) var/key = copytext(e, 1, index) - var/val = copytext(e, index+1) + var/val = copytext(e, index + length(e[index])) codes[key] = val else codes[e] = "1" @@ -167,7 +167,7 @@ Transponder Codes:
    + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AtmosControlConsole.js b/tgui-next/packages/tgui/interfaces/AtmosControlConsole.js new file mode 100644 index 0000000000..80c23d434b --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AtmosControlConsole.js @@ -0,0 +1,100 @@ +import { map } from 'common/collections'; +import { toFixed } from 'common/math'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Button, LabeledList, NumberInput, Section } from '../components'; + +export const AtmosControlConsole = props => { + const { act, data } = useBackend(props); + const sensors = data.sensors || []; + return ( + +
    + {sensors.map(sensor => { + const gases = sensor.gases || {}; + return ( +
    + + + {toFixed(sensor.pressure, 2) + ' kPa'} + + {!!sensor.temperature && ( + + {toFixed(sensor.temperature, 2) + ' K'} + + )} + {map((gasPercent, gasId) => { + return ( + + {toFixed(gasPercent, 2) + '%'} + + ); + })(gases)} + +
    + ); + })} +
    + {data.tank && ( +
    act('reconnect')} /> + )}> + + +
    + )} +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AtmosFilter.js b/tgui-next/packages/tgui/interfaces/AtmosFilter.js new file mode 100644 index 0000000000..35bbf34686 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AtmosFilter.js @@ -0,0 +1,52 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, NumberInput, Section } from '../components'; +import { getGasLabel } from '../constants'; + +export const AtmosFilter = props => { + const { act, data } = useBackend(props); + const filterTypes = data.filter_types || []; + return ( +
    + + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AtmosMixer.js b/tgui-next/packages/tgui/interfaces/AtmosMixer.js new file mode 100644 index 0000000000..a944bfb686 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AtmosMixer.js @@ -0,0 +1,66 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, NumberInput, Section } from '../components'; + +export const AtmosMixer = props => { + const { act, data } = useBackend(props); + return ( +
    + + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AtmosPump.js b/tgui-next/packages/tgui/interfaces/AtmosPump.js new file mode 100644 index 0000000000..01c50de4d4 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AtmosPump.js @@ -0,0 +1,63 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, NumberInput, Section } from '../components'; + +export const AtmosPump = props => { + const { act, data } = useBackend(props); + return ( +
    + + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/AtmosRelief.js b/tgui-next/packages/tgui/interfaces/AtmosRelief.js new file mode 100644 index 0000000000..4654ec6582 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/AtmosRelief.js @@ -0,0 +1,54 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, NumberInput, Section } from '../components'; + +export const AtmosRelief = props => { + const { act, data } = useBackend(props); + return ( +
    + + + act('open_pressure', { + open_pressure: value, + })} /> +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/BankMachine.js b/tgui-next/packages/tgui/interfaces/BankMachine.js new file mode 100644 index 0000000000..a3d52097ec --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/BankMachine.js @@ -0,0 +1,33 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Button, LabeledList, NoticeBox, Section } from '../components'; + +export const BankMachine = props => { + const { act, data } = useBackend(props); + const { + current_balance, + siphoning, + station_name, + } = data; + return ( + +
    + + act(siphoning ? 'halt' : 'siphon')} /> + )}> + {current_balance + ' cr'} + + +
    + + Authorized personnel only + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/Bepis.js b/tgui-next/packages/tgui/interfaces/Bepis.js new file mode 100644 index 0000000000..da23cb11aa --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Bepis.js @@ -0,0 +1,109 @@ +import { multiline } from 'common/string'; +import { Fragment } from 'inferno'; +import { act } from '../byond'; +import { Section, LabeledList, Button, NumberInput, Box, Grid } from '../components'; + +export const Bepis = props => { + const { state } = props; + const { config, data } = state; + const { ref } = config; + const { + amount, + } = data; + return ( +
    +
    act(ref, 'toggle_power')} /> + )}> + All you need to know about the B.E.P.I.S. and you! + The B.E.P.I.S. performs hundreds of tests a second + using electrical and financial resources to invent + new products, or discover new technologies otherwise + overlooked for being too risky or too niche to produce! +
    +
    act(ref, 'account_reset')} /> + )}> + Console is currently being operated + by {data.account_owner ? data.account_owner : 'no one'}. +
    + + +
    + + + {data.stored_cash} + + + {data.accuracy_percentage}% + + + {data.positive_cash_offset} + + + {data.negative_cash_offset} + + + act(ref, 'amount', { + amount: value, + })} /> + + +
    + +
    + + + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/BluespaceArtillery.js b/tgui-next/packages/tgui/interfaces/BluespaceArtillery.js new file mode 100644 index 0000000000..b9f07eabe9 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/BluespaceArtillery.js @@ -0,0 +1,78 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NoticeBox, Section } from '../components'; + +export const BluespaceArtillery = props => { + const { act, data } = useBackend(props); + const { + notice, + connected, + unlocked, + target, + } = data; + return ( + + {!!notice && ( + + {notice} + + )} + {connected ? ( + +
    act('recalibrate')} /> + )}> + + {target || 'No Target Set'} + +
    +
    + {unlocked ? ( + +
    +
    + ) : ( +
    + + +
    + )} +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/BorgPanel.js b/tgui-next/packages/tgui/interfaces/BorgPanel.js new file mode 100644 index 0000000000..7cc4c860e6 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/BorgPanel.js @@ -0,0 +1,135 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, ProgressBar, Section } from '../components'; + +export const BorgPanel = props => { + const { act, data } = useBackend(props); + const borg = data.borg || {}; + const cell = data.cell || {}; + const cellPercent = cell.charge / cell.maxcharge; + const channels = data.channels || []; + const modules = data.modules || []; + const upgrades = data.upgrades || []; + const ais = data.ais || []; + const laws = data.laws || []; + return ( + +
    act('rename')} /> + )}> + + +
    +
    act('toggle_lawupdate')} /> + )}> + {laws.map(law => ( + + {law} + + ))} +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/BrigTimer.js b/tgui-next/packages/tgui/interfaces/BrigTimer.js new file mode 100644 index 0000000000..a83d643334 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/BrigTimer.js @@ -0,0 +1,55 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Button, Section } from '../components'; + +export const BrigTimer = props => { + const { act, data } = useBackend(props); + return ( +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/Canister.js b/tgui-next/packages/tgui/interfaces/Canister.js new file mode 100644 index 0000000000..0e2810e290 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Canister.js @@ -0,0 +1,121 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { AnimatedNumber, Box, Button, LabeledList, NoticeBox, ProgressBar, Section } from '../components'; + +export const Canister = props => { + const { act, data } = useBackend(props); + return ( + + + The regulator {data.hasHoldingTank ? 'is' : 'is not'} connected + to a tank. + +
    act('relabel')} /> + )}> + + + kPa + + + {!!data.isPrototype && ( + +
    + +
    + + + + kPa + + + +
    + +
    act('eject')} /> + )}> + {!!data.hasHoldingTank && ( + + + {data.holdingTank.name} + + + kPa + + + )} + {!data.hasHoldingTank && ( + + No Holding Tank + + )} +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/Cargo.js b/tgui-next/packages/tgui/interfaces/Cargo.js new file mode 100644 index 0000000000..85ae19755e --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Cargo.js @@ -0,0 +1,339 @@ +import { map } from 'common/collections'; +import { Fragment } from 'inferno'; +import { act } from '../byond'; +import { AnimatedNumber, Box, Button, LabeledList, Section, Tabs } from '../components'; +import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; + +export const Cargo = props => { + const { state } = props; + const { config, data } = state; + const { ref } = config; + const supplies = data.supplies || {}; + const requests = data.requests || []; + const cart = data.cart || []; + + const cartTotalAmount = cart + .reduce((total, entry) => total + entry.cost, 0); + + const cartButtons = !data.requestonly && ( + + + {cart.length === 0 && 'Cart is empty'} + {cart.length === 1 && '1 item'} + {cart.length >= 2 && cart.length + ' items'} + {' '} + {cartTotalAmount > 0 && `(${cartTotalAmount} cr)`} + + + + ))} + + + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js b/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js new file mode 100644 index 0000000000..8c829258ec --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemReactionChamber.js @@ -0,0 +1,98 @@ +import { Component } from 'inferno'; +import { act } from '../byond'; +import { Box, Button, LabeledList, NumberInput, Section, Input } from '../components'; +import { map } from 'common/collections'; +import { classes } from 'common/react'; + + +export class ChemReactionChamber extends Component { + constructor() { + super(); + this.state = { + reagentName: "", + reagentQuantity: 1, + }; + } + + setReagentName(reagentName) { + this.setState({ + reagentName, + }); + } + + setReagentQuantity(reagentQuantity) { + this.setState({ + reagentQuantity, + }); + } + + render() { + const { state } = this.props; + const { config, data } = state; + const { ref } = config; + const emptying = data.emptying; + const reagents = data.reagents || []; + return ( +
    + {emptying ? "Emptying" : "Filling"} + + )} > + + + + this.setReagentName(value)} /> + + + this.setReagentQuantity(value)} /> + +
    + ); + } +} diff --git a/tgui-next/packages/tgui/interfaces/ChemSplitter.js b/tgui-next/packages/tgui/interfaces/ChemSplitter.js new file mode 100644 index 0000000000..8e64c43e0f --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemSplitter.js @@ -0,0 +1,48 @@ +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { LabeledList, NumberInput, Section } from '../components'; + +export const ChemSplitter = props => { + const { act, data } = useBackend(props); + const { + straight, + side, + max_transfer, + } = data; + return ( +
    + + + toFixed(value, 2)} + step={0.05} + stepPixelSize={4} + onChange={(e, value) => act('set_amount', { + target: 'straight', + amount: value, + })} /> + + + toFixed(value, 2)} + step={0.05} + stepPixelSize={4} + onChange={(e, value) => act('set_amount', { + target: 'side', + amount: value, + })} /> + + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js b/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js new file mode 100644 index 0000000000..df56dfdc07 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ChemSynthesizer.js @@ -0,0 +1,42 @@ +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { Box, Button, Section } from '../components'; + +export const ChemSynthesizer = props => { + const { act, data } = useBackend(props); + const { + amount, + current_reagent, + chemicals = [], + possible_amounts = [], + } = data; + return ( +
    + + {possible_amounts.map(possible_amount => ( +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/CodexGigas.js b/tgui-next/packages/tgui/interfaces/CodexGigas.js new file mode 100644 index 0000000000..f96ce9380b --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/CodexGigas.js @@ -0,0 +1,98 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, Section } from '../components'; + +// TODO: refactor the backend of this it's a trainwreck +export const CodexGigas = props => { + const { act, data } = useBackend(props); + const prefixes = [ + "Dark", + "Hellish", + "Fallen", + "Fiery", + "Sinful", + "Blood", + "Fluffy", + ]; + const titles = [ + "Lord", + "Prelate", + "Count", + "Viscount", + "Vizier", + "Elder", + "Adept", + ]; + const names = [ + "hal", + "ve", + "odr", + "neit", + "ci", + "quon", + "mya", + "folth", + "wren", + "geyr", + "hil", + "niet", + "twou", + "phi", + "coa", + ]; + const suffixes = [ + "the Red", + "the Soulless", + "the Master", + "the Lord of all things", + "Jr.", + ]; + return ( +
    + {data.name} + + + {prefixes.map(prefix => ( +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ComputerFabricator.js b/tgui-next/packages/tgui/interfaces/ComputerFabricator.js new file mode 100644 index 0000000000..87366f6f73 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ComputerFabricator.js @@ -0,0 +1,403 @@ +import { multiline } from 'common/string'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Grid, Section, Table, Tooltip } from '../components'; + +export const ComputerFabricator = props => { + const { state } = props; + const { act, data } = useBackend(props); + return ( + +
    + Your perfect device, only three steps away... +
    + {data.state !== 0 && ( + + )} /> + + K + + + + + + )} +
    + + {programs.map(program => ( + + +
    +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/NtosNetChat.js b/tgui-next/packages/tgui/interfaces/NtosNetChat.js new file mode 100644 index 0000000000..e6b2ff5f9d --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NtosNetChat.js @@ -0,0 +1,170 @@ +import { useBackend } from '../backend'; +import { AnimatedNumber, Box, Button, Grid, LabeledList, ProgressBar, Section, Input, Table, Icon, Flex } from '../components'; +import { Fragment } from 'inferno'; +import { createLogger } from '../logging'; + +const logger = createLogger('ntos chat'); + +export const NtosNetChat = props => { + const { act, data } = useBackend(props); + + const { + can_admin, + adminmode, + authed, + username, + active_channel, + is_operator, + all_channels = [], + clients = [], + messages = [], + } = data; + + const in_channel = (active_channel !== null); + const authorized = (authed || adminmode); + + return ( +
    + + + + + act('PRG_newchannel', { + new_channel_name: value, + })} /> + {all_channels.map(channel => ( +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js b/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js new file mode 100644 index 0000000000..da3359fb87 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/NtosNetDownloader.js @@ -0,0 +1,123 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Flex, Icon, LabeledList, NoticeBox, ProgressBar, Section } from '../components'; + +export const NtosNetDownloader = props => { + const { state } = props; + const { act, data } = useBackend(props); + const { + disk_size, + disk_used, + downloadable_programs = [], + error, + hacked_programs = [], + hackedavailable, + } = data; + return ( + + {!!error && ( + + + {error} + + + + + {data.sheets} + {(data.sheets >= 1) && ( + + )} + + + + + + {data.current_heat < 100 ? ( + Nominal + ) : ( + data.current_heat < 200 ? ( + Caution + ) : ( + DANGER + ) + )} + + + +
    + + + {data.power_output} + + + + + + + + {data.connected ? data.power_available : "Unconnected"} + + + +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/PowerMonitor.js b/tgui-next/packages/tgui/interfaces/PowerMonitor.js new file mode 100644 index 0000000000..8998344be5 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/PowerMonitor.js @@ -0,0 +1,222 @@ +import { map, sortBy } from 'common/collections'; +import { flow } from 'common/fp'; +import { toFixed } from 'common/math'; +import { pureComponentHooks } from 'common/react'; +import { Component, Fragment } from 'inferno'; +import { Box, Button, Chart, ColorBox, Flex, Icon, LabeledList, ProgressBar, Section, Table } from '../components'; + +const PEAK_DRAW = 500000; + +const powerRank = str => { + const unit = String(str.split(' ')[1]).toLowerCase(); + return ['w', 'kw', 'mw', 'gw'].indexOf(unit); +}; + +export class PowerMonitor extends Component { + constructor() { + super(); + this.state = { + sortByField: null, + }; + } + + render() { + const { state } = this.props; + const { data } = state; + const { history } = data; + const { sortByField } = this.state; + const supply = history.supply[history.supply.length - 1] || 0; + const demand = history.demand[history.demand.length - 1] || 0; + const supplyData = history.supply.map((value, i) => [i, value]); + const demandData = history.demand.map((value, i) => [i, value]); + const maxValue = Math.max( + PEAK_DRAW, + ...history.supply, + ...history.demand); + // Process area data + const areas = flow([ + map((area, i) => ({ + ...area, + // Generate a unique id + id: area.name + i, + })), + sortByField === 'name' && sortBy(area => area.name), + sortByField === 'charge' && sortBy(area => -area.charge), + sortByField === 'draw' && sortBy( + area => -powerRank(area.load), + area => -parseFloat(area.load)), + ])(data.areas); + return ( + + + +
    + + + + + + + + +
    +
    + +
    + + +
    +
    +
    +
    + + + Sort by: + + this.setState({ + sortByField: sortByField !== 'name' && 'name', + })} /> + this.setState({ + sortByField: sortByField !== 'charge' && 'charge', + })} /> + this.setState({ + sortByField: sortByField !== 'draw' && 'draw', + })} /> + + + + + Area + + + Charge + + + Draw + + + Eqp + + + Lgt + + + Env + + + {areas.map((area, i) => ( + + + + + + + + + ))} +
    + {area.name} + + + + {area.load} + + + + + + +
    +
    +
    + ); + } +} + +const AreaCharge = props => { + const { charging, charge } = props; + return ( + + 50 + ? 'battery-half' + : 'battery-quarter' + ) + || charging === 1 && 'bolt' + || charging === 2 && 'battery-full' + )} + color={( + charging === 0 && ( + charge > 50 + ? 'yellow' + : 'red' + ) + || charging === 1 && 'yellow' + || charging === 2 && 'green' + )} /> + + {toFixed(charge) + '%'} + + + ); +}; + +AreaCharge.defaultHooks = pureComponentHooks; + +const AreaStatusColorBox = props => { + const { status } = props; + const power = Boolean(status & 2); + const mode = Boolean(status & 1); + const tooltipText = (power ? 'On' : 'Off') + + ` [${mode ? 'auto' : 'manual'}]`; + return ( + + ); +}; + +AreaStatusColorBox.defaultHooks = pureComponentHooks; diff --git a/tgui-next/packages/tgui/interfaces/Radio.js b/tgui-next/packages/tgui/interfaces/Radio.js new file mode 100644 index 0000000000..e335cf1cac --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Radio.js @@ -0,0 +1,108 @@ +import { map } from 'common/collections'; +import { toFixed } from 'common/math'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { RADIO_CHANNELS } from '../constants'; + +export const Radio = props => { + const { act, data } = useBackend(props); + const { + freqlock, + frequency, + minFrequency, + maxFrequency, + listening, + broadcasting, + command, + useCommand, + subspace, + subspaceSwitchable, + } = data; + const tunedChannel = RADIO_CHANNELS + .find(channel => channel.freq === frequency); + const channels = map((value, key) => ({ + name: key, + status: !!value, + }))(data.channels); + return ( +
    + + + {freqlock && ( + + {toFixed(frequency / 10, 1) + ' kHz'} + + ) || ( + toFixed(value, 1)} + onDrag={(e, value) => act('frequency', { + adjust: (value - frequency / 10), + })} /> + )} + {tunedChannel && ( + + [{tunedChannel.name}] + + )} + + +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js b/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js new file mode 100644 index 0000000000..17e4fd9d15 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/RapidPipeDispenser.js @@ -0,0 +1,188 @@ +import { classes } from 'common/react'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, ColorBox, Flex, LabeledList, Section, Tabs } from '../components'; + +const ROOT_CATEGORIES = [ + 'Atmospherics', + 'Disposals', + 'Transit Tubes', +]; + +const ICON_BY_CATEGORY_NAME = { + 'Atmospherics': 'wrench', + 'Disposals': 'trash-alt', + 'Transit Tubes': 'bus', + 'Pipes': 'grip-lines', + 'Disposal Pipes': 'grip-lines', + 'Devices': 'microchip', + 'Heat Exchange': 'thermometer-half', + 'Station Equipment': 'microchip', +}; + +const PAINT_COLORS = { + grey: '#bbbbbb', + amethyst: '#a365ff', + blue: '#4466ff', + brown: '#b26438', + cyan: '#48eae8', + dark: '#808080', + green: '#1edd00', + orange: '#ffa030', + purple: '#b535ea', + red: '#ff3333', + violet: '#6e00f6', + yellow: '#ffce26', +}; + +const TOOLS = [ + { + name: 'Dispense', + bitmask: 1, + }, + { + name: 'Connect', + bitmask: 2, + }, + { + name: 'Destroy', + bitmask: 4, + }, + { + name: 'Paint', + bitmask: 8, + }, +]; + +export const RapidPipeDispenser = props => { + const { act, data } = useBackend(props); + const { + category: rootCategoryIndex, + categories = [], + selected_color, + piping_layer, + mode, + } = data; + const previews = data.preview_rows.flatMap(row => row.previews); + return ( + +
    + + + {ROOT_CATEGORIES.map((categoryName, i) => ( +
    + + +
    + {rootCategoryIndex === 0 && ( + + {[1, 2, 3].map(layer => ( + act('piping_layer', { + piping_layer: layer, + })} /> + ))} + + )} + + {previews.map(preview => ( + + ))} + +
    +
    + +
    + + {categories.map(category => ( + + {() => category.recipes.map(recipe => ( + act('pipe_type', { + pipe_type: recipe.pipe_index, + category: category.cat_name, + })} /> + ))} + + ))} + +
    +
    +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SatelliteControl.js b/tgui-next/packages/tgui/interfaces/SatelliteControl.js new file mode 100644 index 0000000000..73a7f1ffbb --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SatelliteControl.js @@ -0,0 +1,45 @@ +import { useBackend } from '../backend'; +import { Button, LabeledList, ProgressBar, Section, Table, Box } from '../components'; +import { Fragment } from 'inferno'; +import { LabeledListItem } from '../components/LabeledList'; + +export const SatelliteControl = props => { + const { act, data } = useBackend(props); + const satellites = data.satellites || []; + return ( + + {data.meteor_shield && ( +
    + + + + + +
    + )} +
    + + {satellites.map(satellite => ( + act('toggle', { + id: satellite.id, + })} + /> + ))} + +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/ScannerGate.js b/tgui-next/packages/tgui/interfaces/ScannerGate.js new file mode 100644 index 0000000000..f1e82729bc --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/ScannerGate.js @@ -0,0 +1,351 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, Section } from '../components'; +import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox'; + +const DISEASE_THEASHOLD_LIST = [ + 'Positive', + 'Harmless', + 'Minor', + 'Medium', + 'Harmful', + 'Dangerous', + 'BIOHAZARD', +]; + +const TARGET_SPECIES_LIST = [ + { + name: 'Human', + value: 'human', + }, + { + name: 'Lizardperson', + value: 'lizard', + }, + { + name: 'Flyperson', + value: 'fly', + }, + { + name: 'Felinid', + value: 'felinid', + }, + { + name: 'Plasmaman', + value: 'plasma', + }, + { + name: 'Mothperson', + value: 'moth', + }, + { + name: 'Jellyperson', + value: 'jelly', + }, + { + name: 'Podperson', + value: 'pod', + }, + { + name: 'Golem', + value: 'golem', + }, + { + name: 'Zombie', + value: 'zombie', + }, +]; + +const TARGET_NUTRITION_LIST = [ + { + name: 'Starving', + value: 150, + }, + { + name: 'Obese', + value: 600, + }, +]; + +export const ScannerGate = props => { + const { state } = props; + const { act, data } = useBackend(props); + return ( + + act('toggle_lock')} /> + {!data.locked && ( + + )} + + ); +}; + +const SCANNER_GATE_ROUTES = { + Off: { + title: 'Scanner Mode: Off', + component: () => ScannerGateOff, + }, + Wanted: { + title: 'Scanner Mode: Wanted', + component: () => ScannerGateWanted, + }, + Guns: { + title: 'Scanner Mode: Guns', + component: () => ScannerGateGuns, + }, + Mindshield: { + title: 'Scanner Mode: Mindshield', + component: () => ScannerGateMindshield, + }, + Disease: { + title: 'Scanner Mode: Disease', + component: () => ScannerGateDisease, + }, + Species: { + title: 'Scanner Mode: Species', + component: () => ScannerGateSpecies, + }, + Nutrition: { + title: 'Scanner Mode: Nutrition', + component: () => ScannerGateNutrition, + }, + Nanites: { + title: 'Scanner Mode: Nanites', + component: () => ScannerGateNanites, + }, +}; + +const ScannerGateControl = props => { + const { state } = props; + const { act, data } = useBackend(props); + const { scan_mode } = data; + const route = SCANNER_GATE_ROUTES[scan_mode] + || SCANNER_GATE_ROUTES.off; + const Component = route.component(); + return ( +
    act('set_mode', { new_mode: 'Off' })} /> + )}> + +
    + ); +}; + +const ScannerGateOff = props => { + const { act } = useBackend(props); + return ( + + + Select a scanning mode below. + + + + )}> + {data.contents.length === 0 && ( + + Unfortunately, this {data.name} is empty. + + ) || ( + + + + Item + + + + {data.verb ? data.verb : 'Dispense'} + + + {map((value, key) => ( + + + {value.name} + + + {value.amount} + + +
    + )} + + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/Smes.js b/tgui-next/packages/tgui/interfaces/Smes.js new file mode 100644 index 0000000000..7479af5894 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/Smes.js @@ -0,0 +1,176 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, NumberInput, LabeledList, ProgressBar, Section } from '../components'; + +export const Smes = props => { + const { act, data } = useBackend(props); + + let inputState; + if (data.capacityPercent >= 100) { + inputState = 'good'; + } + else if (data.inputting) { + inputState = 'average'; + } + else { + inputState = 'bad'; + } + let outputState; + if (data.outputting) { + outputState = 'good'; + } + else if (data.charge > 0) { + outputState = 'average'; + } + else { + outputState = 'bad'; + } + + return ( + +
    + +
    +
    + + act('tryinput')}> + {data.inputAttempt ? 'Auto' : 'Off'} + + }> + + {data.capacityPercent >= 100 + ? 'Fully Charged' + : data.inputting + ? 'Charging' + : 'Not Charging'} + + + + + + +
    +
    + + act('tryoutput')}> + {data.outputAttempt ? 'On' : 'Off'} + + }> + + {data.outputting + ? 'Sending' + : data.charge > 0 + ? 'Not Sending' + : 'No Charge'} + + + + + + +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SmokeMachine.js b/tgui-next/packages/tgui/interfaces/SmokeMachine.js new file mode 100644 index 0000000000..16ba078910 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SmokeMachine.js @@ -0,0 +1,71 @@ +import { useBackend } from '../backend'; +import { Fragment } from 'inferno'; +import { AnimatedNumber, Box, Button, LabeledList, ProgressBar, NoticeBox, Section } from '../components'; + +export const SmokeMachine = props => { + const { act, data } = useBackend(props); + const { + TankContents, + isTankLoaded, + TankCurrentVolume, + TankMaxVolume, + active, + setting, + screen, + maxSetting = [], + } = data; + return ( + +
    act('power')} /> + )}> + + + {' / ' + TankMaxVolume} + + + + + { [1, 2, 3, 4, 5].map(amount => ( +
    +
    act('purge')} /> + )}> + {TankContents.map(chemical => ( + + + {' '} + units of {chemical.name} + + ))} +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SolarControl.js b/tgui-next/packages/tgui/interfaces/SolarControl.js new file mode 100644 index 0000000000..1cfb4800c0 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SolarControl.js @@ -0,0 +1,118 @@ +import { toFixed } from 'common/math'; +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Grid, LabeledList, NumberInput, ProgressBar, Section } from '../components'; + +export const SolarControl = props => { + const { act, data } = useBackend(props); + const { + generated, + generated_ratio, + azimuth_current, + azimuth_rate, + max_rotation_rate, + tracking_state, + connected_panels, + connected_tracker, + } = data; + return ( + +
    act('refresh')} /> + )}> + + + + + {connected_tracker ? 'OK' : 'N/A'} + + 0 ? 'good' : 'bad'}> + {connected_panels} + + + + + + + + + + + +
    +
    + + +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SpaceHeater.js b/tgui-next/packages/tgui/interfaces/SpaceHeater.js new file mode 100644 index 0000000000..c44f3e9c47 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SpaceHeater.js @@ -0,0 +1,104 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, NumberInput, ProgressBar, Section } from '../components'; + +export const SpaceHeater = props => { + const { act, data } = useBackend(props); + return ( + +
    +
    +
    + + + 50 + ? 'bad' + : Math.abs(data.targetTemp - data.currentTemp) > 20 + ? 'average' + : 'good'}> + {data.currentTemp}°C + + + + {data.open && ( + act('target', { + target: value, + })} /> + ) || ( + data.targetTemp + '°C' + )} + + + {!data.open && 'Auto' || ( + +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SpawnersMenu.js b/tgui-next/packages/tgui/interfaces/SpawnersMenu.js new file mode 100644 index 0000000000..27d8b1f9ff --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SpawnersMenu.js @@ -0,0 +1,51 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Section } from '../components'; + +export const SpawnersMenu = props => { + const { act, data } = useBackend(props); + const spawners = data.spawners || []; + return ( +
    + {spawners.map(spawner => ( +
    +
    + ))} +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/StationAlertConsole.js b/tgui-next/packages/tgui/interfaces/StationAlertConsole.js new file mode 100644 index 0000000000..c372b532e9 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/StationAlertConsole.js @@ -0,0 +1,57 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Section } from '../components'; + +export const StationAlertConsole = props => { + const { data } = useBackend(props); + const categories = data.alarms || []; + const fire = categories['Fire'] || []; + const atmos = categories['Atmosphere'] || []; + const power = categories['Power'] || []; + return ( + +
    +
      + {fire.length === 0 && ( +
    • + Systems Nominal +
    • + )} + {fire.map(alert => ( +
    • + {alert} +
    • + ))} +
    +
    +
    +
      + {atmos.length === 0 && ( +
    • + Systems Nominal +
    • + )} + {atmos.map(alert => ( +
    • + {alert} +
    • + ))} +
    +
    +
    +
      + {power.length === 0 && ( +
    • + Systems Nominal +
    • + )} + {power.map(alert => ( +
    • + {alert} +
    • + ))} +
    +
    +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js b/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js new file mode 100644 index 0000000000..f858505a37 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SuitStorageUnit.js @@ -0,0 +1,111 @@ +import { Fragment } from 'inferno'; +import { useBackend } from '../backend'; +import { Box, Button, Icon, LabeledList, NoticeBox, Section } from '../components'; + +export const SuitStorageUnit = props => { + const { act, data } = useBackend(props); + const { + locked, + open, + safeties, + uv_active, + occupied, + suit, + helmet, + mask, + storage, + } = data; + return ( + + {!!(occupied && safeties) && ( + + Biological entity detected in suit chamber. Please remove + before continuing with operation. + + )} + {uv_active && ( + + Contents are currently being decontaminated. Please wait. + + ) || ( +
    + {!open && ( +
    + )} +
    + ); +}; diff --git a/tgui-next/packages/tgui/interfaces/SyndContractor.js b/tgui-next/packages/tgui/interfaces/SyndContractor.js new file mode 100644 index 0000000000..23f152a831 --- /dev/null +++ b/tgui-next/packages/tgui/interfaces/SyndContractor.js @@ -0,0 +1,382 @@ +import { Box, Button, Section, Dimmer, Table, Icon, NoticeBox, Tabs, Grid, LabeledList } from "../components"; +import { useBackend } from "../backend"; +import { Fragment, Component } from "inferno"; + +export class FakeTerminal extends Component { + constructor(props) { + super(props); + this.timer = null; + this.state = { + currentIndex: 0, + currentDisplay: [], + }; + } + + tick() { + const { props, state } = this; + if (state.currentIndex <= props.allMessages.length) { + this.setState(prevState => { + return ({ + currentIndex: prevState.currentIndex + 1, + }); + }); + const { currentDisplay } = state; + currentDisplay.push(props.allMessages[state.currentIndex]); + } else { + clearTimeout(this.timer); + setTimeout(props.onFinished, props.finishedTimeout); + } + } + + componentDidMount() { + const { + linesPerSecond = 2.5, + } = this.props; + this.timer = setInterval(() => this.tick(), 1000 / linesPerSecond); + } + + componentWillUnmount() { + clearTimeout(this.timer); + } + + render() { + return ( + + {this.state.currentDisplay.map(value => ( + + {value} +
    +
    + ))} +
    + ); + } +} + +export const SyndContractor = props => { + const { data, act } = useBackend(props); + + const terminalMessages = [ + "Recording biometric data...", + "Analyzing embedded syndicate info...", + "STATUS CONFIRMED", + "Contacting syndicate database...", + "Awaiting response...", + "Awaiting response...", + "Awaiting response...", + "Awaiting response...", + "Awaiting response...", + "Awaiting response...", + "Response received, ack 4851234...", + "CONFIRM ACC " + (Math.round(Math.random() * 20000)), + "Setting up private accounts...", + "CONTRACTOR ACCOUNT CREATED", + "Searching for available contracts...", + "Searching for available contracts...", + "Searching for available contracts...", + "Searching for available contracts...", + "CONTRACTS FOUND", + "WELCOME, AGENT", + ]; + + const infoEntries = [ + "SyndTract v2.0", + "", + "We've identified potentional high-value targets that are", + "currently assigned to your mission area. They are believed", + "to hold valuable information which could be of immediate", + "importance to our organisation.", + "", + "Listed below are all of the contracts available to you. You", + "are to bring the specified target to the designated", + "drop-off, and contact us via this uplink. We will send", + "a specialised extraction unit to put the body into.", + "", + "We want targets alive - but we will sometimes pay slight", + "amounts if they're not, you just won't recieve the shown", + "bonus. You can redeem your payment through this uplink in", + "the form of raw telecrystals, which can be put into your", + "regular Syndicate uplink to purchase whatever you may need.", + "We provide you with these crystals the moment you send the", + "target up to us, which can be collected at anytime through", + "this system.", + "", + "Targets extracted will be ransomed back to the station once", + "their use to us is fulfilled, with us providing you a small", + "percentage cut. You may want to be mindful of them", + "identifying you when they come back. We provide you with", + "a standard contractor loadout, which will help cover your", + "identity.", + ]; + + const errorPane = !!data.error && ( + + + + + + + + + + {data.error} + +
    +
    +
    + ); + + if (!data.logged_in) { + return ( +
    + +
    + ); + } + + if (data.logged_in && data.first_load) { + return ( + + act('PRG_set_first_load_finished')} /> + + ); + } + + if (data.info_screen) { + return ( + + + + +