diff --git a/DLLSocket/DLLSocket.cbp b/DLLSocket/DLLSocket.cbp deleted file mode 100644 index 6415a5ebd67..00000000000 --- a/DLLSocket/DLLSocket.cbp +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - diff --git a/DLLSocket/compile.sh b/DLLSocket/compile.sh deleted file mode 100755 index 0ff309bdb9f..00000000000 --- a/DLLSocket/compile.sh +++ /dev/null @@ -1 +0,0 @@ -g++ -static -shared -O3 -fPIC main.cpp -o DLLSocket.so diff --git a/DLLSocket/main.cpp b/DLLSocket/main.cpp deleted file mode 100644 index e3aafb8791a..00000000000 --- a/DLLSocket/main.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// OS-specific networking includes -// ------------------------------- -#ifdef __WIN32 - #include - typedef int socklen_t; -#else - extern "C" { - #include - #include - #include - #include - #include - #include - #include - #include - } - - typedef int SOCKET; - typedef sockaddr_in SOCKADDR_IN; - typedef sockaddr SOCKADDR; - #define SOCKET_ERROR -1 -#endif - -// Socket used for all communications -SOCKET sock; - -// Address of the remote server -SOCKADDR_IN addr; - -// Buffer used to return dynamic strings to the caller -#define BUFFER_SIZE 1024 -char return_buffer[BUFFER_SIZE]; - -// exposed functions -// ------------------------------ - -const char* SUCCESS = "1\0"; // string representing success - -#ifdef __WIN32 - #define DLL_EXPORT __declspec(dllexport) -#else - #define DLL_EXPORT __attribute__ ((visibility ("default"))) -#endif - -// arg1: ip(in the xx.xx.xx.xx format) -// arg2: port(a short) -// return: NULL on failure, SUCCESS otherwise -extern "C" DLL_EXPORT const char* establish_connection(int n, char *v[]) -{ - // extract args - // ------------ - if(n < 2) return 0; - const char* ip = v[0]; - const char* port_s = v[1]; - unsigned short port = atoi(port_s); - - // set up network stuff - // -------------------- - #ifdef __WIN32 - WSADATA wsa; - WSAStartup(MAKEWORD(2,0),&wsa); - #endif - sock = socket(AF_INET,SOCK_DGRAM,0); - - // make the socket non-blocking - // ---------------------------- - #ifdef __WIN32 - unsigned long iMode=1; - ioctlsocket(sock,FIONBIO,&iMode); - #else - fcntl(sock, F_SETFL, O_NONBLOCK); - #endif - - // establish a connection to the server - // ------------------------------------ - memset(&addr,0,sizeof(SOCKADDR_IN)); - addr.sin_family=AF_INET; - addr.sin_port=htons(port); - - // convert the string representation of the ip to a byte representation - addr.sin_addr.s_addr=inet_addr(ip); - - return SUCCESS; -} - -// arg1: string message to send -// return: NULL on failure, SUCCESS otherwise -extern "C" DLL_EXPORT const char* send_message(int n, char *v[]) -{ - // extract the args - if(n < 1) return 0; - const char* msg = v[0]; - - // send the message - int rc = sendto(sock,msg,strlen(msg),0,(SOCKADDR*)&addr,sizeof(SOCKADDR)); - - // check for errors - if (rc != -1) { - return SUCCESS; - } - else { - return 0; - } -} - -// no args -// return: message if any received, NULL otherwise -extern "C" DLL_EXPORT const char* recv_message(int n, char *v[]) -{ - SOCKADDR_IN sender; // we will store the sender address here - - socklen_t sender_byte_length = sizeof(sender); - - // Try receiving messages until we receive one that's valid, or there are no more messages - while(1) { - int rc = recvfrom(sock, return_buffer, BUFFER_SIZE,0,(SOCKADDR*) &sender,&sender_byte_length); - if(rc > 0) { - // we could read something - - if(sender.sin_addr.s_addr != addr.sin_addr.s_addr) { - continue; // not our connection, ignore and try again - } else { - return_buffer[rc] = 0; // 0-terminate the string - return return_buffer; - } - } - else { - break; // no more messages, stop trying to receive - } - } - - return 0; -} diff --git a/DLLSocket/server_controller.py b/DLLSocket/server_controller.py deleted file mode 100644 index 943f37f6777..00000000000 --- a/DLLSocket/server_controller.py +++ /dev/null @@ -1,51 +0,0 @@ -import subprocess -import socket -import urlparse - -UDP_IP="127.0.0.1" -UDP_PORT=8019 - -sock = socket.socket( socket.AF_INET, # Internet - socket.SOCK_DGRAM ) # UDP -sock.bind( (UDP_IP,UDP_PORT) ) - -last_ticker_state = None - -def handle_message(data, addr): - global last_ticker_state - - params = urlparse.parse_qs(data) - print(data) - - try: - if params["type"][0] == "log" and str(params["log"][0]) and str(params["message"][0]): - open(params["log"][0],"a+").write(params["message"][0]+"\n") - except IOError: - pass - except KeyError: - pass - - try: - if params["type"][0] == "ticker_state" and str(params["message"][0]): - last_ticker_state = str(params["message"][0]) - except KeyError: - pass - - try: - if params["type"][0] == "startup" and last_ticker_state: - open("crashlog.txt","a+").write("Server exited, last ticker state was: "+last_ticker_state+"\n") - except KeyError: - pass - -sock.settimeout(60*6) # 10 minute timeout -while True: - try: - data, addr = sock.recvfrom( 1024 ) # buffer size is 1024 bytes - handle_message(data,addr) - except socket.timeout: - # try to start the server again - print("Server timed out.. attempting restart.") - if last_ticker_state: - open("crashmsg.txt","a+").write("Server crashed, trying to reboot. last ticker state: "+last_ticker_state+"\n") - subprocess.call("killall -9 DreamDaemon") - subprocess.call("./start") \ No newline at end of file diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index c07960eab59..b3e72e8977c 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -858,6 +858,15 @@ icon_state = "floor4" }, /area/shuttle/syndicate) +"abK" = ( +/obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_2) "abL" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -1514,8 +1523,8 @@ /obj/structure/shuttle/engine/propulsion/burst, /turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; + tag = "icon-swall_f9"; + icon_state = "swall_f9"; dir = 2 }, /area/shuttle/pod_2) @@ -1596,14 +1605,22 @@ }, /area/security/permabrig) "adg" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f9"; - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security RC"; + pixel_y = 30 }, -/area/shuttle/pod_2) +/obj/item/storage/secure/safe{ + pixel_x = 36; + pixel_y = 28 + }, +/obj/machinery/computer/card/minor/hos, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/security/hos) "adh" = ( /obj/machinery/door/airlock/shuttle{ name = "Escape Pod Airlock" @@ -1869,15 +1886,12 @@ "adH" = ( /obj/structure/rack, /obj/item/tank/jetpack/oxygen, -/obj/item/tank/air, -/obj/item/clothing/mask/breath, /obj/item/clothing/shoes/magboots, /obj/machinery/camera{ c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13") }, -/obj/item/clothing/suit/space/hardsuit/security, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -2055,6 +2069,12 @@ icon_state = "dark" }, /area/security/permabrig) +"adZ" = ( +/obj/machinery/suit_storage_unit/security/secure, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/security/podbay) "aea" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -3610,11 +3630,21 @@ /turf/simulated/wall/r_wall, /area/security/hos) "agE" = ( -/obj/machinery/space_heater, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/reagent_dispensers/peppertank{ + pixel_x = 30 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27; + pixel_y = 29 + }, +/obj/machinery/suit_storage_unit/security/secure, /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/security/podbay) +/area/security/hos) "agF" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable/yellow{ @@ -3853,23 +3883,12 @@ }, /area/security/armoury) "agZ" = ( -/obj/structure/table/wood, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Head of Security's Desk"; - departmentType = 5; - name = "Head of Security RC"; - pixel_y = 30 - }, -/obj/machinery/computer/med_data/laptop, -/obj/item/storage/secure/safe{ - pixel_x = 36; - pixel_y = 28 - }, +/obj/machinery/atmospherics/unary/vent_pump, +/obj/machinery/space_heater, /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/security/hos) +/area/security/podbay) "aha" = ( /obj/machinery/computer/prisoner, /turf/simulated/floor/plasteel{ @@ -4291,23 +4310,15 @@ }, /area/security/permabrig) "ahH" = ( -/obj/machinery/light{ - dir = 4 +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27; - pixel_y = 29 - }, -/obj/structure/rack, -/obj/item/clothing/suit/space/hardsuit/security, -/obj/item/clothing/mask/gas/sechailer, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/security/hos) +/area/shuttle/pod_3) "ahI" = ( /obj/machinery/door_control{ id = "permacell2"; @@ -5380,21 +5391,26 @@ /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) "ajr" = ( +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/masks, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "whitered"; + tag = "icon-whitehall (WEST)" + }, +/area/security/brig) +"ajs" = ( /obj/structure/shuttle/engine/propulsion/burst{ dir = 8 }, /turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; + icon_state = "swall_f5"; dir = 2 }, /area/shuttle/pod_3) -"ajs" = ( -/obj/machinery/atmospherics/unary/vent_pump, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/security/podbay) "ajt" = ( /obj/structure/rack, /obj/item/rcd, @@ -5496,6 +5512,19 @@ icon_state = "vault" }, /area/security/hos) +"ajA" = ( +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "vault"; + dir = 5 + }, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 + }, +/area/shuttle/pod_4) "ajB" = ( /turf/simulated/wall/r_wall, /area/maintenance/auxsolarport) @@ -5666,15 +5695,10 @@ }, /area/security/permabrig) "ajS" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; - dir = 2 - }, -/area/shuttle/pod_3) +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/machinery/suit_storage_unit/engine/secure, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "ajT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/yellow{ @@ -6173,6 +6197,16 @@ icon_state = "dark" }, /area/security/podbay) +"akP" = ( +/obj/machinery/camera{ + c_tag = "Engineering - Storage"; + dir = 2; + network = list("SS13") + }, +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/machinery/suit_storage_unit/engine/secure, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "akQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6768,6 +6802,17 @@ }, /turf/simulated/floor/plating, /area/security/main) +"alQ" = ( +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Singularity"; + name = "Containment Blast Doors"; + opacity = 0 + }, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "alR" = ( /obj/machinery/door/firedoor, /obj/structure/cable/yellow{ @@ -7713,6 +7758,15 @@ /obj/structure/window/reinforced, /turf/simulated/floor/plating, /area/maintenance/disposal) +"anx" = ( +/obj/effect/spawner/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/plating, +/area/security/brig) "any" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating, @@ -8952,6 +9006,32 @@ }, /turf/simulated/floor/plating, /area/maintenance/fore) +"apP" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/firedoor, +/obj/machinery/flasher{ + id = "secentranceflasher"; + pixel_x = 25 + }, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/mapping_helpers/airlock/unres{ + icon_state = "airlock_unres_helper"; + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "red"; + dir = 1 + }, +/area/security/brig) "apQ" = ( /obj/machinery/sleeper{ icon_state = "sleeper-open"; @@ -9075,6 +9155,11 @@ dir = 4 }, /area/security/brig) +"aqe" = ( +/obj/effect/decal/warning_stripes/west, +/obj/machinery/suit_storage_unit/engine/secure, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "aqf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -9230,6 +9315,16 @@ }, /turf/simulated/floor/plating, /area/maintenance/fore) +"aqv" = ( +/obj/machinery/alarm{ + dir = 4; + icon_state = "alarm0"; + pixel_x = -22 + }, +/obj/effect/decal/warning_stripes/southwest, +/obj/machinery/suit_storage_unit/engine/secure, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "aqw" = ( /obj/structure/closet/crate, /obj/item/bodybag, @@ -10614,6 +10709,19 @@ icon_state = "dark" }, /area/engine/gravitygenerator) +"asL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Primary Tool Storage" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel, +/area/storage/primary) "asM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -11124,24 +11232,29 @@ name = "Port Maintenance" }) "atI" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 +/obj/structure/shuttle/engine/propulsion/burst{ + dir = 8 }, -/obj/structure/morgue, /turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "whitered"; - tag = "icon-whitehall (WEST)" + icon_state = "vault"; + dir = 5 }, -/area/security/brig) +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/shuttle/pod_4) "atJ" = ( -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/turf/simulated/wall, -/area/security/brig) +/obj/structure/table, +/obj/item/weldingtool, +/obj/item/crowbar, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/storage/primary) "atK" = ( /turf/simulated/wall/r_wall, /area/security/main) @@ -13012,6 +13125,14 @@ dir = 1 }, /area/security/processing) +"axg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Primary Tool Storage" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel, +/area/storage/primary) "axh" = ( /turf/simulated/wall/r_wall, /area/maintenance/starboard) @@ -13574,8 +13695,10 @@ /area/crew_quarters/mrchangs) "ayc" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 4; + on = 1; + scrub_Toxins = 0 }, /turf/simulated/floor/plasteel{ dir = 1; @@ -13601,6 +13724,9 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "neutralcorner" @@ -13614,13 +13740,19 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + level = 1 + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "ayg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/carpet, /area/crew_quarters/sleep) "ayh" = ( @@ -13842,6 +13974,17 @@ /area/maintenance/fpmaint2{ name = "Port Maintenance" }) +"ayE" = ( +/obj/machinery/alarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/drone_fabricator, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "yellow" + }, +/area/engine/engineering) "ayF" = ( /obj/structure/grille, /obj/structure/window/reinforced/tinted{ @@ -14177,12 +14320,6 @@ dir = 8; initialize_directions = 11 }, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "azk" = ( @@ -14200,12 +14337,6 @@ }, /turf/simulated/wall, /area/crew_quarters/sleep) -"azm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/wall, -/area/crew_quarters/sleep) "azn" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -14290,6 +14421,17 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/simulated/floor/plating, /area/maintenance/starboard) +"azv" = ( +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_y = 29 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "yellow" + }, +/area/engine/engineering) "azw" = ( /obj/effect/spawner/window/reinforced, /obj/structure/cable/yellow{ @@ -14447,6 +14589,21 @@ }, /turf/simulated/floor/plating/airless, /area/space/nearstation) +"azJ" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "yellow" + }, +/area/engine/engineering) "azK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -14620,9 +14777,6 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, /obj/machinery/firealarm{ dir = 8; pixel_x = -26 @@ -14684,12 +14838,12 @@ /area/security/brig) "aAe" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "neutralcorner" @@ -15071,6 +15225,18 @@ icon_state = "red" }, /area/security/brig) +"aAO" = ( +/obj/machinery/computer/security/telescreen{ + dir = 4; + name = "MiniSat Monitor"; + network = list("MiniSat","tcomm"); + pixel_x = -29 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "yellow" + }, +/area/engine/engineering) "aAP" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -15118,6 +15284,12 @@ /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating, /area/maintenance/fore) +"aAW" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/turf/simulated/floor/plasteel, +/area/engine/engineering) "aAX" = ( /obj/structure/closet/crate, /obj/item/coin/silver, @@ -15618,13 +15790,18 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aBQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aBR" = ( @@ -16354,19 +16531,21 @@ icon_state = "pipe-c" }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 11 + dir = 8 }, /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aCY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/machinery/light/small{ dir = 4 }, +/obj/structure/sign/pods{ + pixel_x = 30 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "neutralcorner" @@ -18481,36 +18660,9 @@ name = "Storage Wing" }) "aGz" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/firedoor, -/obj/machinery/flasher{ - id = "secentranceflasher"; - pixel_x = 25 - }, -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/mapping_helpers/airlock/unres{ - icon_state = "airlock_unres_helper"; - dir = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 1 - }, -/area/security/brig) +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel, +/area/crew_quarters/sleep) "aGA" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -18677,12 +18829,12 @@ dir = 4 }, /obj/machinery/hologram/holopad, -/turf/simulated/floor/plasteel, -/area/crew_quarters/sleep) -"aGQ" = ( /obj/structure/chair/stool{ pixel_y = 8 }, +/turf/simulated/floor/plasteel, +/area/crew_quarters/sleep) +"aGQ" = ( /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" @@ -18696,20 +18848,19 @@ dir = 8; initialize_directions = 11 }, +/obj/effect/landmark/start{ + name = "Mime" + }, /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aGS" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "neutralcorner" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 }, +/turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aGT" = ( /obj/structure/cable{ @@ -18720,23 +18871,25 @@ /turf/simulated/floor/plating/airless, /area/engine/engineering) "aGU" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/machinery/alarm{ - pixel_y = 23 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/item/clothing/under/suit_jacket/navy, -/turf/simulated/floor/carpet, +/obj/machinery/door/airlock/titanium/glass, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aGV" = ( -/obj/item/clothing/glasses/meson, -/obj/structure/closet/crate, -/obj/item/poster/random_contraband, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/maintenance/starboard) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/mineral/tranquillite, +/area/crew_quarters/sleep) "aGW" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -18747,16 +18900,15 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "aGX" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -29 }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/clothing/mask/breath, -/obj/effect/decal/warning_stripes/yellow/hollow, -/turf/simulated/floor/plasteel, -/area/engine/engineering) +/obj/machinery/suit_storage_unit/ce/secure, +/turf/simulated/floor/plasteel{ + icon_state = "vault"; + dir = 5 + }, +/area/engine/chiefs_office) "aGY" = ( /obj/item/stack/ore/silver, /obj/item/stack/ore/silver, @@ -18882,6 +19034,21 @@ "aHk" = ( /turf/simulated/wall, /area/construction) +"aHl" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + pixel_x = 30 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "yellow" + }, +/area/engine/engineering) "aHm" = ( /obj/structure/closet/crate, /obj/item/coin/silver, @@ -18976,6 +19143,21 @@ /area/maintenance/fpmaint2{ name = "Port Maintenance" }) +"aHw" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "Drone Fabricator APC"; + pixel_x = -24 + }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "yellow" + }, +/area/engine/engineering) "aHx" = ( /obj/structure/closet/crate, /obj/structure/extinguisher_cabinet{ @@ -19367,14 +19549,13 @@ /turf/simulated/floor/plating, /area/bridge) "aIc" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/sign/pods{ - pixel_x = 30 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "neutralcorner" +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 }, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aId" = ( /obj/machinery/door/airlock{ @@ -19462,9 +19643,17 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aIm" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, -/turf/simulated/floor/plasteel, +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/structure/chair/office/light, +/obj/effect/landmark/start{ + name = "Mime" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aIn" = ( /obj/structure/table, @@ -19472,62 +19661,55 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aIo" = ( +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/structure/closet/secure_closet/mime, +/turf/simulated/floor/mineral/tranquillite, +/area/crew_quarters/sleep) +"aIp" = ( /obj/structure/table, +/obj/item/storage/pill_bottle/dice, /obj/item/toy/cards/deck, /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) -"aIp" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel, -/area/crew_quarters/sleep) "aIq" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin6"; - name = "Cabin 2" - }, +/obj/structure/statue/tranquillite/mime, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 5 }, -/turf/simulated/floor/wood, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aIr" = ( -/obj/effect/landmark{ - name = "xeno_spawn"; - pixel_x = -1 +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28 }, +/turf/simulated/wall, +/area/crew_quarters/sleep) +"aIs" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/carpet, +/obj/item/flag/mime, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) -"aIs" = ( +"aIt" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 8; on = 1 }, -/turf/simulated/floor/carpet, -/area/crew_quarters/sleep) -"aIt" = ( -/obj/machinery/light/small, -/turf/simulated/floor/carpet, +/obj/structure/table/wood, +/obj/item/storage/fancy/crayons, +/obj/item/toy/crayon/mime, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aIu" = ( -/obj/machinery/camera{ - c_tag = "Engineering - Storage"; - dir = 2; - network = list("SS13") +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" }, -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/clothing/mask/breath, -/obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, /area/engine/engineering) "aIv" = ( @@ -19800,24 +19982,12 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "aIT" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/door_control{ - id = "Cabin6"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - req_access_txt = "0"; - specialfunctions = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/carpet, +/obj/machinery/light/small, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/item/paper_bin, +/obj/item/pen/multi, +/turf/simulated/floor/mineral/tranquillite, /area/crew_quarters/sleep) "aIU" = ( /obj/effect/decal/warning_stripes/west, @@ -20293,15 +20463,14 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aJH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 28 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "neutralcorner" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6; + level = 1 }, +/turf/simulated/floor/plasteel, /area/crew_quarters/sleep) "aJI" = ( /obj/machinery/portable_atmospherics/canister/oxygen, @@ -20326,6 +20495,16 @@ }, /turf/simulated/floor/plating/airless, /area/space/nearstation) +"aJK" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 2 + }, +/obj/machinery/door/airlock/bananium/glass, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/sleep) "aJL" = ( /obj/effect/decal/warning_stripes/southwest, /turf/simulated/floor/plasteel, @@ -21178,41 +21357,24 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/landmark/start{ + name = "Clown" + }, /turf/simulated/floor/plasteel{ dir = 2; icon_state = "neutralcorner" }, /area/crew_quarters/sleep) "aLi" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 2 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "neutralcorner" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, +/turf/simulated/floor/wood, /area/crew_quarters/sleep) "aLj" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin7"; - name = "Cabin 1" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/sleep) -"aLk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/sleep) -"aLl" = ( -/obj/effect/landmark{ - name = "xeno_spawn"; - pixel_x = -1 - }, /obj/machinery/alarm{ pixel_y = 23 }, @@ -21223,12 +21385,32 @@ dir = 8; on = 1 }, +/obj/structure/chair/office/dark, +/obj/effect/landmark/start{ + name = "Clown" + }, +/turf/simulated/floor/wood, +/area/crew_quarters/sleep) +"aLk" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/crew_quarters/sleep) +"aLl" = ( +/obj/structure/closet/secure_closet/clown, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aLm" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/assistantformal, -/turf/simulated/floor/wood, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2; + initialize_directions = 11 + }, +/obj/structure/closet/wardrobe/pjs, +/turf/simulated/floor/plasteel{ + tag = "icon-vault"; + icon_state = "vault" + }, /area/crew_quarters/sleep) "aLn" = ( /obj/structure/cable{ @@ -21863,9 +22045,10 @@ }, /area/crew_quarters/sleep) "aMw" = ( -/obj/structure/closet/wardrobe/pjs, +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/assistantformal, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 9 }, /turf/simulated/floor/plasteel{ tag = "icon-vault"; @@ -21873,16 +22056,14 @@ }, /area/crew_quarters/sleep) "aMx" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/assistantformal, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 2; - initialize_directions = 11 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-vault"; - icon_state = "vault" +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 }, +/obj/item/flag/clown, +/turf/simulated/floor/wood, /area/crew_quarters/sleep) "aMy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -21914,29 +22095,29 @@ name = "\improper Warehouse" }) "aMA" = ( -/obj/structure/chair/wood{ - dir = 4 - }, +/obj/structure/table/wood, +/obj/item/stamp/clown, +/obj/item/reagent_containers/food/snacks/pie, +/obj/item/toy/crayon/rainbow, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aMB" = ( -/obj/structure/table/wood, /obj/machinery/newscaster{ pixel_x = 29; pixel_y = 1 }, -/obj/item/paper, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp, /turf/simulated/floor/wood, /area/crew_quarters/sleep) "aMC" = ( -/obj/structure/closet, -/obj/item/storage/box/donkpockets, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/structure/statue/bananium/clown, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5; + level = 1 }, -/turf/simulated/floor/plating, -/area/maintenance/starboard) +/turf/simulated/floor/wood, +/area/crew_quarters/sleep) "aMD" = ( /obj/structure/disposalpipe/sortjunction{ dir = 1; @@ -23096,7 +23277,7 @@ /area/storage/tools) "aOE" = ( /mob/living/simple_animal/slime, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -23926,24 +24107,14 @@ }, /area/turret_protected/ai_upload) "aQi" = ( -/obj/machinery/door_control{ - id = "Cabin7"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = -25; - req_access_txt = "0"; - specialfunctions = 4 +/obj/structure/rack, +/obj/item/clothing/suit/storage/hazardvest, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" }, -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/wood, -/area/crew_quarters/sleep) +/turf/simulated/floor/plating, +/area/maintenance/starboard) "aQj" = ( /obj/structure/sign/kiddieplaque{ pixel_y = 32 @@ -24965,8 +25136,12 @@ name = "\improper Garden" }) "aSf" = ( -/obj/structure/rack, -/obj/item/clothing/suit/storage/hazardvest, +/obj/item/storage/box/donkpockets, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, /turf/simulated/floor/plating, /area/maintenance/starboard) "aSg" = ( @@ -26063,19 +26238,21 @@ /turf/simulated/floor/plasteel, /area/quartermaster/storage) "aUe" = ( -/obj/structure/table, -/obj/item/weldingtool, -/obj/item/crowbar, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "browncorner" +/obj/machinery/light_switch{ + pixel_x = -25 }, -/area/storage/primary) +/obj/machinery/alarm{ + pixel_y = 23 + }, +/obj/structure/chair/stool, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" + }) "aUf" = ( /obj/item/reagent_containers/spray/plantbgone, /obj/item/reagent_containers/glass/bottle/nutrient/ez, @@ -27315,10 +27492,24 @@ /turf/simulated/floor/plasteel, /area/crew_quarters/courtroom) "aWj" = ( -/obj/effect/spawner/window/reinforced, -/turf/simulated/floor/plating, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/obj/machinery/power/apc{ + dir = 1; + name = "Cargo Break Room APC"; + pixel_x = 1; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/obj/structure/table/glass, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "aWk" = ( /obj/machinery/door_control{ @@ -27479,6 +27670,20 @@ /obj/effect/decal/cleanable/fungus, /turf/simulated/wall, /area/maintenance/fore) +"aWw" = ( +/obj/item/radio/intercom{ + frequency = 1459; + name = "Station Intercom (General)"; + pixel_y = 21 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "yellow" + }, +/area/engine/break_room) "aWx" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room"; @@ -27540,18 +27745,15 @@ name = "Arrivals" }) "aWE" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 }, -/turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 5 - }, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 - }, -/area/shuttle/pod_4) +/obj/machinery/suit_storage_unit/captain/secure, +/turf/simulated/floor/wood, +/area/crew_quarters/captain{ + name = "\improper Captain's Quarters" + }) "aWF" = ( /obj/machinery/door/airlock/shuttle{ name = "Escape Pod Airlock" @@ -27563,18 +27765,14 @@ /turf/simulated/shuttle/floor, /area/shuttle/pod_1) "aWG" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 5 - }, +/obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, /turf/simulated/shuttle/wall{ + tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2 }, -/area/shuttle/pod_4) +/area/shuttle/pod_1) "aWH" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 4; @@ -28398,9 +28596,22 @@ name = "Port Maintenance" }) "aYn" = ( -/turf/simulated/wall, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Security"; + departmentType = 5; + pixel_y = 30 + }, +/obj/structure/chair/stool, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "aYo" = ( /obj/machinery/conveyor_switch/oneway{ @@ -29153,43 +29364,24 @@ }, /area/turret_protected/ai_upload) "aZy" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Security Post - Cargo APC"; - pixel_x = 1; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" - }, +/obj/item/flag/cargo, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 1 + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "aZz" = ( -/obj/item/screwdriver{ - pixel_y = 10 +/obj/structure/shuttle/engine/propulsion/burst, +/turf/simulated/floor/plating, +/turf/simulated/shuttle/wall{ + tag = "icon-swall_f9"; + icon_state = "swall_f9"; + dir = 2 }, -/obj/item/radio/off, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_y = 30 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 1 - }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" - }) +/area/shuttle/pod_1) "aZA" = ( /obj/structure/table, /obj/item/hatchet, @@ -29301,11 +29493,6 @@ /area/turret_protected/ai_upload_foyer) "aZM" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, /obj/machinery/door/airlock/engineering/glass{ name = "Power Monitoring"; req_access_txt = "32" @@ -29772,15 +29959,40 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "baE" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 +/obj/machinery/camera/autoname{ + dir = 4; + network = list("SS13") + }, +/obj/machinery/door_control{ + desc = "A remote control-switch for the engineering security doors."; + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_x = -24; + pixel_y = -6; + req_access_txt = "1" + }, +/obj/machinery/door_control{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_x = -24; + pixel_y = 5; + req_access_txt = "1" + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "yellow" }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/clothing/mask/breath, -/obj/effect/decal/warning_stripes/west, -/turf/simulated/floor/plasteel, /area/engine/engineering) "baF" = ( /obj/machinery/light{ @@ -29972,61 +30184,62 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo"; - req_access_txt = "63" +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "baZ" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 - }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" - }) -"bba" = ( /obj/structure/cable/yellow{ d1 = 1; d2 = 8; icon_state = "1-8" }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) -"bbb" = ( -/obj/structure/chair/office/dark, +"bba" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 2; on = 1 }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) -"bbc" = ( +"bbb" = ( /obj/item/radio/intercom{ dir = 4; name = "Station Intercom (General)"; pixel_x = 27 }, -/obj/machinery/computer/security/mining, /turf/simulated/floor/plasteel{ - icon_state = "red"; + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" + }) +"bbc" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/turf/simulated/wall, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bbd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -30416,19 +30629,26 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "bbP" = ( -/obj/structure/closet/secure_closet/security/cargo, -/obj/machinery/light_switch{ - pixel_x = -25 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/alarm{ - pixel_y = 23 +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 10 }, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/toy/figure/cargotech, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 9 + dir = 2; + icon_state = "whitehall"; + tag = "icon-whitehall (WEST)" }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bbQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -30460,16 +30680,22 @@ name = "Arrivals" }) "bbT" = ( -/obj/structure/filingcabinet, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, +/obj/machinery/camera{ + c_tag = "Security Post - Cargo"; + dir = 1; + network = list("SS13") + }, +/obj/machinery/vending/cola, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 5 + dir = 2; + icon_state = "whitehall"; + tag = "icon-whitehall (WEST)" }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bbU" = ( /obj/structure/cable{ @@ -30662,20 +30888,32 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bck" = ( -/obj/machinery/alarm{ - dir = 4; - icon_state = "alarm0"; - pixel_x = -22 +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/structure/rack{ - dir = 8; - layer = 2.9 +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6; + level = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "yellow" }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/suit/space/hardsuit/engine, -/obj/item/clothing/mask/breath, -/obj/effect/decal/warning_stripes/southwest, -/turf/simulated/floor/plasteel, /area/engine/engineering) "bcl" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ @@ -30874,27 +31112,30 @@ name = "Arrivals" }) "bcz" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/newscaster{ + pixel_y = -32 }, -/turf/simulated/wall, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 + }, +/obj/machinery/vending/coffee, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whitehall"; + tag = "icon-whitehall (WEST)" + }, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bcA" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/table/reinforced, +/obj/machinery/vending/cigarette, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 10 + dir = 2; + icon_state = "whitehall"; + tag = "icon-whitehall (WEST)" }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bcB" = ( /obj/structure/cable/yellow{ @@ -30926,13 +31167,20 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "bcD" = ( -/obj/machinery/computer/secure_data, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 6 +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining/glass{ + name = "Cargo Break Room"; + req_access_txt = "0"; + req_one_access_txt = "48;50" + }, +/turf/simulated/floor/plasteel, +/area/quartermaster/office{ + name = "\improper Cargo Office" }) "bcE" = ( /obj/machinery/power/apc{ @@ -31562,8 +31810,24 @@ /turf/simulated/floor/plasteel, /area/engine/chiefs_office) "bdE" = ( -/turf/simulated/wall, -/area/security/checkpoint/engineering) +/obj/machinery/keycard_auth{ + pixel_x = -25; + pixel_y = 25 + }, +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_y = 32 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 + }, +/obj/machinery/computer/card/minor/ce, +/turf/simulated/floor/plasteel{ + tag = "icon-vault"; + icon_state = "vault" + }, +/area/engine/chiefs_office) "bdF" = ( /obj/machinery/light/small{ dir = 1 @@ -31734,19 +31998,6 @@ /obj/effect/decal/warning_stripes/northwestcorner, /turf/simulated/floor/plasteel, /area/hallway/primary/central) -"bdV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Primary Tool Storage" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel, -/area/storage/primary) "bdW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -32622,24 +32873,19 @@ /turf/simulated/floor/plasteel, /area/quartermaster/storage) "bfr" = ( -/obj/structure/bookcase/manuals/engineering, -/obj/machinery/keycard_auth{ - pixel_x = -25; - pixel_y = 25 - }, -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_y = 32 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring the singularity engine safely."; + dir = 8; + name = "Singularity Monitor"; + network = list("Singulo"); + pixel_x = 32 }, +/obj/machinery/computer/drone_control, /turf/simulated/floor/plasteel{ - tag = "icon-vault"; - icon_state = "vault" + dir = 4; + icon_state = "yellow" }, -/area/engine/chiefs_office) +/area/engine/engineering) "bfs" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 2; @@ -33431,27 +33677,18 @@ }, /turf/simulated/floor/plasteel, /area/quartermaster/storage) -"bgD" = ( -/obj/item/book/manual/security_space_law, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/obj/structure/table/reinforced, -/turf/simulated/floor/plasteel{ - icon_state = "red" - }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" - }) "bgE" = ( -/obj/structure/chair/office/dark{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, +/obj/machinery/door/airlock/engineering, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel, -/area/security/checkpoint/engineering) +/area/engine/engineering) "bgF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -33522,6 +33759,11 @@ }, /turf/simulated/floor/plasteel, /area/quartermaster/storage) +"bgL" = ( +/obj/effect/decal/warning_stripes/west, +/obj/structure/closet/secure_closet/atmos_personal, +/turf/simulated/floor/plasteel, +/area/atmos) "bgM" = ( /obj/structure/window/reinforced{ dir = 4 @@ -34223,28 +34465,16 @@ name = "\improper Cargo Office" }) "bhY" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "Engineering Security APC"; - pixel_x = -24 - }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, +/obj/machinery/suit_storage_unit/atmos, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + icon_state = "dark" }, -/area/security/checkpoint/engineering) +/area/atmos) "bhZ" = ( -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/engineering) +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow, +/turf/simulated/floor/plating, +/area/engine/engineering) "bia" = ( /obj/machinery/power/apc{ dir = 8; @@ -34552,37 +34782,22 @@ name = "Customs" }) "biz" = ( -/obj/structure/filingcabinet, -/obj/structure/reagent_dispensers/peppertank{ - pixel_y = 30 - }, -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 9 - }, -/area/security/checkpoint/engineering) +/obj/effect/decal/warning_stripes/southwest, +/obj/structure/closet/wardrobe/atmospherics_yellow, +/obj/item/flashlight, +/turf/simulated/floor/plasteel, +/area/atmos) "biA" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 5 +/obj/item/radio/intercom{ + frequency = 1459; + name = "Station Intercom (General)"; + pixel_y = 28 }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/newscaster/security_unit{ - pixel_x = 30 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 5 - }, -/area/security/checkpoint/engineering) +/obj/effect/decal/warning_stripes/southeast, +/obj/structure/closet/wardrobe/atmospherics_yellow, +/obj/item/flashlight, +/turf/simulated/floor/plasteel, +/area/atmos) "biB" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 2 @@ -34678,20 +34893,18 @@ /turf/simulated/floor/plasteel, /area/quartermaster/storage) "biJ" = ( -/obj/structure/table, -/obj/item/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_y = 29 +/obj/machinery/light_switch{ + pixel_y = 28 }, -/obj/machinery/recharger{ - pixel_y = 4 +/obj/machinery/atmospherics/pipe/simple/visible/purple{ + dir = 6 }, +/obj/machinery/suit_storage_unit/atmos, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 1 + dir = 9; + icon_state = "caution" }, -/area/security/checkpoint/engineering) +/area/atmos) "biK" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -35313,66 +35526,36 @@ }, /area/hallway/primary/port) "bjK" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, -/obj/machinery/camera/autoname{ - dir = 4; - network = list("SS13") - }, -/obj/machinery/door_control{ - desc = "A remote control-switch for the engineering security doors."; - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_x = -24; - pixel_y = -6; - req_access_txt = "1" - }, -/obj/machinery/door_control{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = -24; - pixel_y = 5; - req_access_txt = "1" - }, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 4; - icon_state = "2-4" +/obj/machinery/atmospherics/pipe/simple/visible/purple{ + dir = 4 }, +/obj/machinery/suit_storage_unit/atmos, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 10 + dir = 1; + icon_state = "caution" }, -/area/security/checkpoint/engineering) +/area/atmos) "bjL" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 +/obj/effect/spawner/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /obj/structure/cable/yellow{ - d1 = 1; + d1 = 0; d2 = 2; - icon_state = "1-2" + icon_state = "0-2" }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "red" - }, -/area/security/checkpoint/engineering) +/turf/simulated/floor/plating, +/area/engine/break_room) "bjM" = ( -/obj/structure/closet/secure_closet/security/engine, +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow, +/turf/simulated/floor/plating, +/area/engine/break_room) +"bjN" = ( +/turf/simulated/wall, +/area/engine/break_room) +"bjO" = ( /obj/machinery/firealarm{ dir = 4; pixel_x = 24 @@ -35382,46 +35565,32 @@ d2 = 8; icon_state = "2-8" }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 6 +/obj/machinery/computer/monitor, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" }, -/area/security/checkpoint/engineering) -"bjN" = ( -/turf/simulated/wall, -/area/engine/break_room) -"bjO" = ( -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/obj/machinery/computer/security/telescreen{ - dir = 4; - name = "MiniSat Monitor"; - network = list("MiniSat","tcomm"); - pixel_x = -29 +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + dir = 6; + icon_state = "yellow" }, -/area/security/checkpoint/engineering) +/area/engine/engineering) "bjP" = ( -/obj/structure/table, -/obj/item/book/manual/security_space_law, -/obj/machinery/light{ +/obj/effect/spawner/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_x = 30 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 - }, -/area/security/checkpoint/engineering) +/obj/structure/cable/yellow, +/turf/simulated/floor/plating, +/area/security/checkpoint2{ + name = "Customs" + }) "bjQ" = ( /turf/simulated/floor/plasteel{ icon_state = "vault"; @@ -35592,14 +35761,18 @@ }, /area/shuttle/arrival/station) "bkj" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f5"; - icon_state = "swall_f5"; - dir = 2 +/obj/item/crowbar, +/obj/item/wrench, +/obj/structure/table, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 1; + on = 1 }, -/area/shuttle/pod_1) +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "cautioncorner" + }, +/area/hallway/primary/starboard) "bkk" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -36044,16 +36217,26 @@ /turf/simulated/floor/plasteel, /area/engine/engineering) "bkU" = ( -/obj/effect/spawner/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=13.3-Engineering-Central"; + location = "13.2-Tcommstore" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/yellow, -/turf/simulated/floor/plating, -/area/security/checkpoint/engineering) +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "neutralcorner" + }, +/area/hallway/primary/starboard) "bkV" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow, -/turf/simulated/floor/plating, -/area/security/checkpoint/engineering) +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 1; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/turf/simulated/floor/engine, +/area/engine/mechanic_workshop) "bkW" = ( /turf/simulated/wall/r_wall, /area/bridge) @@ -36157,15 +36340,14 @@ }, /area/hallway/primary/central) "blh" = ( -/obj/structure/sign/directions/security{ - dir = 4; - pixel_y = 8 +/obj/structure/closet/wardrobe/pjs, +/turf/simulated/floor/plasteel{ + icon_state = "neutral"; + dir = 1 }, -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/turf/simulated/wall, -/area/janitor) +/area/hallway/secondary/construction{ + name = "\improper Garden" + }) "bli" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -36184,14 +36366,11 @@ /turf/simulated/floor/plasteel, /area/engine/mechanic_workshop) "blk" = ( -/obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 + dir = 10 }, -/turf/simulated/floor/plating, -/area/security/checkpoint2{ - name = "Customs" - }) +/turf/simulated/floor/plasteel, +/area/engine/break_room) "bll" = ( /obj/structure/closet/emcloset, /obj/structure/sign/double/map/left{ @@ -36258,12 +36437,17 @@ /turf/simulated/floor/plating, /area/maintenance/incinerator) "bls" = ( -/obj/effect/spawner/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/turf/simulated/floor/plating, -/area/engine/break_room) +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f6"; + dir = 2 + }, +/area/shuttle/transport) "blt" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -36293,19 +36477,17 @@ name = "\improper Cargo Office" }) "blw" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Engineering Security Post"; - req_access_txt = "63" +/obj/structure/shuttle/engine/propulsion{ + dir = 8; + icon_state = "propulsion"; + tag = "icon-propulsion (EAST)" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/turf/space, +/turf/simulated/shuttle/wall{ + icon_state = "swall_f5"; + dir = 2 }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/engineering) +/area/shuttle/transport) "blx" = ( /obj/effect/spawner/window/reinforced, /obj/structure/disposalpipe/segment, @@ -36314,14 +36496,15 @@ name = "\improper Cargo Office" }) "bly" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/simulated/floor/plating, -/turf/simulated/shuttle/wall{ - tag = "icon-swall_f9"; - icon_state = "swall_f9"; - dir = 2 +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 2; + on = 1 }, -/area/shuttle/pod_1) +/turf/simulated/floor/plasteel{ + icon_state = "vault"; + dir = 8 + }, +/area/engine/break_room) "blz" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -37058,19 +37241,10 @@ name = "Central Maintenance" }) "bmG" = ( -/obj/machinery/computer/secure_data, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the singularity engine safely."; - dir = 8; - name = "Singularity Monitor"; - network = list("Singulo"); - pixel_x = 32 - }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 + icon_state = "dark" }, -/area/security/checkpoint/engineering) +/area/maintenance/starboard) "bmH" = ( /obj/structure/window/reinforced{ dir = 8 @@ -37644,10 +37818,12 @@ name = "\improper Captain's Quarters" }) "bnB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "yellow" @@ -37663,6 +37839,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9; + level = 1 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "yellow" @@ -37757,21 +37937,13 @@ name = "\improper MiniSat Exterior" }) "bnL" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -29 - }, -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/clothing/shoes/magboots/advance, -/obj/item/clothing/suit/space/hardsuit/engine/elite, -/obj/item/clothing/mask/breath, +/obj/structure/table, +/obj/item/toy/figure/clown, +/obj/item/reagent_containers/food/snacks/baguette, /turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 5 + icon_state = "dark" }, -/area/engine/chiefs_office) +/area/maintenance/starboard) "bnM" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -37836,6 +38008,18 @@ }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) +"bnR" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/maintenance/starboard) +"bnS" = ( +/obj/item/storage/backpack/duffel/clown, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/maintenance/starboard) "bnT" = ( /obj/machinery/light/small{ dir = 1 @@ -37847,6 +38031,14 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"bnU" = ( +/obj/structure/bed, +/obj/item/bedsheet/clown, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/maintenance/starboard) "bnV" = ( /obj/effect/landmark{ name = "Observer-Start" @@ -39653,9 +39845,9 @@ }, /area/hallway/primary/starboard) "bqN" = ( -/obj/effect/spawner/window/reinforced, -/turf/simulated/floor/plating, -/area/engine/break_room) +/obj/structure/sign/clown, +/turf/simulated/wall/r_wall, +/area/maintenance/starboard) "bqO" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -39839,6 +40031,12 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"brg" = ( +/obj/structure/barricade/wooden, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/maintenance/starboard) "brh" = ( /obj/structure/window/reinforced{ dir = 4 @@ -40241,20 +40439,11 @@ }, /area/turret_protected/ai) "brR" = ( -/obj/item/radio/intercom{ - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 21 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/drone_fabricator, +/obj/effect/decal/remains/human, /turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "yellow" + icon_state = "dark" }, -/area/engine/break_room) +/area/maintenance/starboard) "brS" = ( /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, @@ -42361,15 +42550,21 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bvk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/structure/transit_tube{ + tag = "icon-S-NE"; + icon_state = "S-NE" }, -/obj/structure/cable{ - icon_state = "0-4"; - d2 = 4 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/turf/simulated/floor/plasteel{ + icon_state = "vault"; + dir = 8 + }, +/area/space/nearstation) "bvl" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor/shutters{ @@ -43153,20 +43348,18 @@ name = "Port Maintenance" }) "bwr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Transit Tube"; - req_one_access_txt = "32;19" +/obj/structure/transit_tube{ + tag = "icon-D-NW"; + icon_state = "D-NW" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/structure/window/reinforced{ + dir = 8 }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/area/engine/break_room) +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "bws" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -43197,21 +43390,11 @@ name = "\improper Captain's Quarters" }) "bwv" = ( -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "transittube"; - name = "Transit Tube Blast Door"; - opacity = 0 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/effect/decal/warning_stripes/yellow, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "bww" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -43235,15 +43418,19 @@ }, /area/hallway/primary/central) "bwy" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/structure/transit_tube{ + tag = "icon-D-SE"; + icon_state = "D-SE" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/structure/transit_tube{ + tag = "icon-D-NE"; + icon_state = "D-NE" }, -/area/engine/break_room) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "bwz" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 1; @@ -43299,20 +43486,15 @@ /turf/simulated/floor/wood, /area/crew_quarters/bar) "bwF" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 2; - on = 1 +/obj/structure/transit_tube{ + tag = "icon-E-SW-NW"; + icon_state = "E-SW-NW" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 8 - }, -/area/engine/break_room) +/turf/simulated/floor/plating/airless, +/area/space/nearstation) "bwG" = ( /obj/machinery/door/airlock/maintenance{ name = "Bar Maintenance"; @@ -43361,43 +43543,21 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bwL" = ( -/obj/structure/transit_tube{ - tag = "icon-D-NW"; - icon_state = "D-NW" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, +/obj/structure/transit_tube, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /turf/simulated/floor/plating/airless, /area/space/nearstation) "bwM" = ( /obj/structure/transit_tube{ - tag = "icon-S-NE"; - icon_state = "S-NE" - }, -/obj/structure/window/reinforced{ - dir = 4 + tag = "icon-E-W-Pass"; + icon_state = "E-W-Pass" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 8 + dir = 4 }, +/turf/simulated/floor/plating/airless, /area/space/nearstation) "bwN" = ( /obj/item/assembly/prox_sensor, @@ -43499,11 +43659,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, +/obj/structure/transit_tube, /turf/simulated/floor/plating/airless, /area/space/nearstation) "bwV" = ( @@ -43516,49 +43672,38 @@ /area/engine/break_room) "bwW" = ( /obj/structure/transit_tube{ - tag = "icon-E-SW-NW"; - icon_state = "E-SW-NW" + icon_state = "W-NE-SE" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 4; + level = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bwX" = ( /obj/structure/transit_tube{ - tag = "icon-D-SE"; - icon_state = "D-SE" + tag = "icon-D-SW"; + icon_state = "D-SW" }, /obj/structure/transit_tube{ - tag = "icon-D-NE"; - icon_state = "D-NE" + icon_state = "D-NW"; + tag = "icon-D-NE" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 4; + level = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bwY" = ( -/obj/structure/transit_tube, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 4; + level = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plating/airless, +/obj/structure/lattice/catwalk, +/turf/space, /area/space/nearstation) "bwZ" = ( /obj/structure/cable/yellow{ @@ -43573,38 +43718,37 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bxa" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ +/obj/structure/window/reinforced{ dir = 4 }, -/obj/machinery/power/apc{ - dir = 2; - name = "Engineering Foyer APC"; - pixel_x = -1; - pixel_y = -26 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/obj/machinery/light, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/obj/structure/lattice/catwalk, +/turf/space, +/area/space/nearstation) "bxb" = ( +/obj/structure/transit_tube_pod, +/obj/structure/window/reinforced{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, +/obj/structure/transit_tube/station{ + tag = "icon-closed (EAST)"; + icon_state = "closed"; dir = 4 }, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/turf/simulated/floor/plasteel{ + icon_state = "vault"; + dir = 5 }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/obj/machinery/computer/drone_control, -/turf/simulated/floor/plasteel, -/area/engine/break_room) +/area/construction/hallway{ + name = "\improper MiniSat Exterior" + }) "bxc" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -43672,20 +43816,15 @@ }, /area/engine/break_room) "bxi" = ( -/obj/structure/transit_tube{ - tag = "icon-E-W-Pass"; - icon_state = "E-W-Pass" - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 10 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/turf/simulated/floor/plasteel{ + icon_state = "dark" }, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) +/area/construction/hallway{ + name = "\improper MiniSat Exterior" + }) "bxj" = ( /obj/structure/transit_tube{ tag = "icon-S-NE"; @@ -43702,109 +43841,93 @@ /turf/space, /area/space/nearstation) "bxl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/unary/vent_pump{ + on = 1 }, -/obj/structure/transit_tube, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plating/airless, -/area/space/nearstation) -"bxm" = ( -/obj/structure/transit_tube{ - icon_state = "W-NE-SE" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/lattice/catwalk, -/turf/space, -/area/space/nearstation) -"bxn" = ( -/obj/structure/transit_tube{ - tag = "icon-D-SW"; - icon_state = "D-SW" - }, -/obj/structure/transit_tube{ - icon_state = "D-NW"; - tag = "icon-D-NE" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/lattice/catwalk, -/turf/space, -/area/space/nearstation) -"bxo" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/lattice/catwalk, -/turf/space, -/area/space/nearstation) -"bxp" = ( -/obj/structure/transit_tube_pod, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/transit_tube/station{ - tag = "icon-closed (EAST)"; - icon_state = "closed"; - dir = 4 +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" }, /turf/simulated/floor/plasteel{ - icon_state = "vault"; - dir = 5 + icon_state = "dark" }, /area/construction/hallway{ name = "\improper MiniSat Exterior" }) -"bxq" = ( -/obj/structure/window/reinforced{ +"bxm" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 +/obj/machinery/power/apc{ + dir = 2; + name = "Engineering Foyer APC"; + pixel_x = -1; + pixel_y = -26 }, -/obj/structure/cable{ +/obj/machinery/light, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/plasteel, +/area/engine/break_room) +"bxn" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/cable/yellow{ d1 = 4; d2 = 8; icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/space, -/area/space/nearstation) +/turf/simulated/floor/plasteel, +/area/engine/break_room) +"bxo" = ( +/obj/machinery/door/airlock/command{ + name = "Blueshield's Office"; + req_access_txt = "67" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/blueshield) +"bxp" = ( +/obj/machinery/door/airlock/command{ + name = "NT Representative's Office"; + req_access_txt = "73" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/ntrep) +"bxq" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/door/airlock/command{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/obj/effect/decal/warning_stripes/yellow, +/turf/simulated/floor/plasteel, +/area/ai_monitored/storage/eva{ + name = "E.V.A. Storage" + }) "bxr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -43819,37 +43942,24 @@ name = "Arrivals" }) "bxs" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 4; - icon_state = "2-4" - }, +/obj/item/gun/throw/crossbow/french, +/obj/effect/decal/cleanable/cobweb, /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/construction/hallway{ - name = "\improper MiniSat Exterior" - }) +/area/maintenance/starboard) "bxt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/structure/cable{ +/obj/structure/girder, +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/structure/cable/yellow{ + d1 = 4; d2 = 8; - icon_state = "0-8" + icon_state = "4-8" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/construction/hallway{ - name = "\improper MiniSat Exterior" +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" }) "bxu" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ @@ -48684,6 +48794,19 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"bFh" = ( +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 4; + on = 1; + scrub_N2O = 1; + scrub_Toxins = 1 + }, +/obj/structure/closet/emcloset, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "caution" + }, +/area/hallway/primary/starboard) "bFi" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -48718,6 +48841,13 @@ /obj/structure/lattice, /turf/space, /area/space/nearstation) +"bFl" = ( +/obj/structure/bed, +/obj/item/bedsheet/mime, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/maintenance/starboard) "bFm" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 8; @@ -49630,6 +49760,32 @@ dir = 5 }, /area/atmos) +"bGQ" = ( +/obj/machinery/camera{ + c_tag = "Toxins - Launch Area"; + dir = 2; + network = list("SS13","RD") + }, +/obj/effect/decal/warning_stripes/yellow/hollow, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-16"; + layer = 4.1; + tag = "icon-plant-16" + }, +/turf/simulated/floor/plasteel, +/area/toxins/mixing{ + name = "\improper Toxins Lab" + }) +"bGR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/turf/simulated/floor/plasteel{ + icon_state = "caution"; + dir = 4 + }, +/area/hallway/primary/starboard) "bGS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/window/reinforced{ @@ -49659,6 +49815,15 @@ /area/tcommsat/computer{ name = "\improper Telecoms Control Room" }) +"bGU" = ( +/obj/machinery/shieldwallgen{ + req_access = list(55) + }, +/obj/structure/cable/yellow, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bGV" = ( /obj/machinery/power/apc{ cell_type = 10000; @@ -49677,17 +49842,22 @@ /turf/simulated/floor/plasteel, /area/atmos) "bGW" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f6"; - dir = 2 +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Xenolab"; + name = "test chamber blast door"; + opacity = 0 }, -/area/shuttle/transport) +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bGX" = ( /turf/simulated/shuttle/wall{ icon_state = "swall12"; @@ -49831,6 +50001,29 @@ /area/crew_quarters/toilet{ name = "\improper Auxiliary Restrooms" }) +"bHo" = ( +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/atmospherics/pipe/simple/visible, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Xenolab"; + name = "test chamber blast door"; + opacity = 0 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bHp" = ( /obj/structure/rack, /obj/item/flashlight, @@ -50128,13 +50321,16 @@ /turf/simulated/floor/carpet, /area/crew_quarters/theatre) "bHV" = ( -/obj/structure/chair/wood/wings, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/landmark/start{ - name = "Mime" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5; + level = 1 }, -/turf/simulated/floor/carpet, -/area/crew_quarters/theatre) +/obj/machinery/vending/medical, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "whiteblue" + }, +/area/medical/reception) "bHW" = ( /turf/simulated/floor/carpet, /area/crew_quarters/theatre) @@ -52465,16 +52661,8 @@ /turf/simulated/floor/carpet, /area/crew_quarters/theatre) "bLI" = ( -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/structure/chair/wood/wings, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/landmark/start{ - name = "Clown" - }, /turf/simulated/floor/carpet, /area/crew_quarters/theatre) "bLJ" = ( @@ -52826,6 +53014,67 @@ /obj/structure/window/reinforced, /turf/space, /area/space/nearstation) +"bMo" = ( +/obj/machinery/door/window/southleft{ + dir = 2; + name = "Maximum Security Test Chamber"; + req_access_txt = "55" + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Xenolab"; + name = "test chamber blast door"; + opacity = 0 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) +"bMp" = ( +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/structure/cable/yellow{ + d2 = 4; + icon_state = "0-4" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Xenolab"; + name = "test chamber blast door"; + opacity = 0 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) +"bMq" = ( +/obj/effect/spawner/window/reinforced, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Xenolab"; + name = "test chamber blast door"; + opacity = 0 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bMr" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -52837,6 +53086,12 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"bMs" = ( +/obj/machinery/atmospherics/pipe/simple/visible, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bMt" = ( /obj/structure/window/reinforced{ dir = 8 @@ -52858,18 +53113,19 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"bMu" = ( +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bMv" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8; - icon_state = "propulsion"; - tag = "icon-propulsion (EAST)" - }, -/turf/space, -/turf/simulated/shuttle/wall{ - icon_state = "swall_f5"; +/obj/structure/disposaloutlet{ dir = 2 }, -/area/shuttle/transport) +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bMw" = ( /turf/simulated/shuttle/floor, /turf/simulated/shuttle/wall/interior{ @@ -53174,14 +53430,10 @@ /turf/simulated/floor/plating, /area/atmos) "bNb" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/door/airlock/command{ - name = "Blueshield's Office"; - req_access_txt = "67" + d2 = 4; + icon_state = "1-4" }, /turf/simulated/floor/wood, /area/blueshield) @@ -53205,17 +53457,13 @@ /turf/simulated/floor/plating, /area/atmos) "bNf" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/door/airlock/command{ - name = "NT Representative's Office"; - req_access_txt = "73" +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, /turf/simulated/floor/wood, -/area/ntrep) +/area/blueshield) "bNg" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/atmospherics/pipe/simple/visible/green, @@ -53531,31 +53779,24 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bNG" = ( -/obj/item/crowbar, -/obj/item/wrench, /obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "cautioncorner" +/obj/item/stack/sheet/metal{ + amount = 10 }, -/area/hallway/primary/starboard) +/obj/item/radio/electropack, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bNH" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/sparker{ + id = "Xenobio"; + pixel_x = -25 }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.3-Engineering-Central"; - location = "13.2-Tcommstore" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "neutralcorner" - }, -/area/hallway/primary/starboard) +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bNI" = ( /obj/machinery/light/small{ dir = 4 @@ -53638,27 +53879,13 @@ name = "E.V.A. Storage" }) "bNN" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/computer/card/minor/rd, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, -/obj/machinery/door/airlock/command{ - name = "E.V.A. Storage"; - req_access_txt = "18" - }, -/obj/effect/decal/warning_stripes/yellow, -/turf/simulated/floor/plasteel, -/area/ai_monitored/storage/eva{ - name = "E.V.A. Storage" - }) +/area/crew_quarters/hor) "bNO" = ( /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 @@ -53753,6 +53980,14 @@ }, /turf/space, /area/space/nearstation) +"bNZ" = ( +/obj/machinery/atmospherics/unary/outlet_injector/on{ + dir = 1 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bOa" = ( /turf/simulated/floor/plasteel/dark, /area/tcommsat/server) @@ -53762,6 +53997,12 @@ }, /turf/simulated/floor/plasteel/dark, /area/tcommsat/server) +"bOc" = ( +/obj/item/radio/beacon, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bOd" = ( /turf/space, /turf/simulated/shuttle/wall{ @@ -54087,10 +54328,23 @@ /turf/simulated/floor/wood, /area/blueshield) "bOI" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + dir = 4; + name = "Blueshield Office APC"; + pixel_x = 24; + pixel_y = -3 + }, +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" }, /turf/simulated/floor/wood, /area/blueshield) @@ -54156,7 +54410,7 @@ /turf/simulated/floor/wood, /area/ntrep) "bON" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ d1 = 1; d2 = 4; icon_state = "1-4" @@ -54396,36 +54650,39 @@ name = "E.V.A. Storage" }) "bPj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "yellow" +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_y = 5 }, -/area/hallway/primary/starboard) +/obj/item/stack/cable_coil, +/obj/item/multitool, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bPk" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 11 - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "yellow" - }, -/area/hallway/primary/starboard) +/obj/effect/decal/remains/xeno, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bPl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 +/obj/machinery/light{ + dir = 2 }, -/turf/simulated/floor/plasteel{ - dir = 6; - icon_state = "yellow" +/obj/machinery/camera{ + c_tag = "Secure Lab - Test Chamber"; + dir = 1; + network = list("SS13","RD") }, -/area/hallway/primary/starboard) +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bPm" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -54496,13 +54753,13 @@ /turf/simulated/wall/r_wall, /area/atmos) "bPs" = ( -/obj/structure/cable{ +/obj/structure/cable/yellow{ d1 = 4; d2 = 8; icon_state = "4-8" }, /turf/simulated/floor/wood, -/area/blueshield) +/area/ntrep) "bPt" = ( /obj/machinery/atmospherics/binary/volume_pump/on{ dir = 8; @@ -54568,26 +54825,26 @@ /turf/simulated/floor/plasteel, /area/atmos) "bPB" = ( -/obj/machinery/light{ - dir = 1 - }, /obj/machinery/power/apc{ dir = 4; - name = "Blueshield Office APC"; + name = "Centcomm Rep APC"; pixel_x = 24; pixel_y = -3 }, -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" +/obj/machinery/light{ + dir = 1 }, /obj/machinery/status_display{ density = 0; layer = 4; pixel_y = 32 }, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, /turf/simulated/floor/wood, -/area/blueshield) +/area/ntrep) "bPC" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ @@ -54634,6 +54891,14 @@ /obj/structure/lattice, /turf/space, /area/space/nearstation) +"bPI" = ( +/obj/item/radio/intercom{ + pixel_y = -25 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bPJ" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -54647,6 +54912,28 @@ /area/tcommsat/computer{ name = "\improper Telecoms Control Room" }) +"bPK" = ( +/obj/structure/table, +/obj/item/assembly/igniter{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 5; + pixel_y = -4 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = -1 + }, +/turf/simulated/floor/engine, +/area/toxins/xenobiology{ + name = "\improper Secure Lab" + }) "bPL" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -54728,13 +55015,22 @@ /turf/simulated/floor/wood, /area/security/vacantoffice) "bPS" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/decal/warning_stripes/southeast, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" }, -/turf/simulated/floor/wood, -/area/ntrep) +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel, +/area/teleporter{ + name = "\improper Teleporter Room" + }) "bPT" = ( /obj/item/folder/blue, /obj/structure/table/wood, @@ -54799,26 +55095,12 @@ /turf/simulated/floor/wood, /area/library) "bQa" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Centcomm Rep APC"; - pixel_x = 24; - pixel_y = -3 - }, -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/light{ +/obj/structure/window/reinforced{ dir = 1 }, -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_y = 32 - }, -/turf/simulated/floor/wood, -/area/ntrep) +/obj/structure/closet/secure_closet/medical2, +/turf/simulated/floor/plasteel, +/area/assembly/robotics) "bQb" = ( /obj/structure/closet/firecloset, /turf/simulated/floor/plasteel{ @@ -55014,13 +55296,6 @@ }, /turf/simulated/floor/wood, /area/ntrep) -"bQv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/spawner/window/reinforced, -/turf/simulated/floor/plating, -/area/medical/research{ - name = "Research Division" - }) "bQw" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -55288,16 +55563,48 @@ /turf/simulated/floor/wood, /area/crew_quarters/theatre) "bQV" = ( -/turf/simulated/wall/r_wall, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/obj/structure/extinguisher_cabinet{ + pixel_x = 6; + pixel_y = -30 + }, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -30 + }, +/obj/machinery/computer/card/minor/cmo, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "barber" + }, +/area/medical/cmo) "bQW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/wall/r_wall, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/table/reinforced, +/obj/item/cartridge/signal/toxins{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/cartridge/signal/toxins{ + pixel_x = 4; + pixel_y = 6 + }, +/obj/item/paper/monitorkey, +/obj/item/stamp/rd{ + pixel_x = 3; + pixel_y = -2 + }, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/crew_quarters/hor) "bQX" = ( /obj/structure/closet/crate{ icon_state = "crateopen"; @@ -55416,6 +55723,17 @@ /obj/structure/lattice, /turf/simulated/wall/r_wall, /area/space/nearstation) +"bRn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/door/airlock/medical{ + name = "Coroner" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/genetics_cloning) "bRo" = ( /obj/machinery/light/small, /obj/item/folder, @@ -55454,6 +55772,17 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel/dark, /area/tcommsat/server) +"bRr" = ( +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 4; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "bRs" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -55463,6 +55792,20 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel/dark, /area/tcommsat/server) +"bRt" = ( +/obj/machinery/requests_console{ + department = "Morgue"; + departmentType = 5; + name = "Morgue Requests Console"; + pixel_y = 30 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "bRu" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 1; @@ -56150,36 +56493,33 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "bSD" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 1; - on = 1 +/obj/machinery/door/poddoor{ + density = 0; + icon_state = "open"; + id_tag = "Biohazard_medi"; + name = "Quarantine Lockdown"; + opacity = 0 }, -/obj/machinery/camera{ - c_tag = "Gravity Generation Access"; - dir = 4; - network = list("Engineering","SS13"); - pixel_y = -22 +/obj/machinery/door/airlock/maintenance{ + name = "Surgery Maintenance"; + req_access_txt = "45" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/turf/simulated/floor/plating, +/area/medical/medbay3) "bSE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/hologram/holopad, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/camera{ + c_tag = "Morgue"; + dir = 2; + network = list("SS13","Medbay") }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/bodyscanner, /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/area/medical/morgue) "bSF" = ( /obj/machinery/door/window/northleft{ dir = 8; @@ -56379,6 +56719,115 @@ icon_state = "neutralcorner" }, /area/hallway/primary/central) +"bSX" = ( +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"bSY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Morgue" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"bSZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Morgue" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"bTa" = ( +/obj/structure/table, +/obj/item/storage/box/gloves{ + pixel_y = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"bTb" = ( +/obj/machinery/alarm{ + pixel_y = 32 + }, +/obj/structure/morgue, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"bTc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/spawner/lootdrop{ + loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); + name = "maint grille or trash spawner" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 2 + }, +/obj/effect/decal/warning_stripes/north, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"bTd" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/carpet, +/area/crew_quarters/theatre) +"bTe" = ( +/obj/machinery/power/apc{ + dir = 8; + name = "west bump"; + pixel_x = -24; + shock_proof = 0 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/plasteel{ + dir = 9; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "bTf" = ( /obj/structure/table/reinforced, /obj/item/flashlight, @@ -56719,24 +57168,16 @@ name = "Arrivals" }) "bTK" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock/engineering{ - name = "Telecoms Storage"; - req_access_txt = "61" +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/alarm{ + dir = 1; + pixel_y = -22 }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel{ - icon_state = "dark" + dir = 2; + icon_state = "neutralcorner" }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/area/hallway/primary/starboard) "bTL" = ( /obj/machinery/alarm{ dir = 8; @@ -56928,15 +57369,11 @@ }, /area/crew_quarters/kitchen) "bUg" = ( -/obj/machinery/light_switch{ - pixel_y = 26 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/turf/simulated/floor/wood, +/area/crew_quarters/theatre) "bUh" = ( /obj/structure/sink/kitchen{ desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; @@ -56975,11 +57412,9 @@ /turf/simulated/floor/wood, /area/crew_quarters/theatre) "bUm" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/landmark/start{ - name = "Mime" +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + on = 1 }, /turf/simulated/floor/wood, /area/crew_quarters/theatre) @@ -57007,37 +57442,18 @@ /turf/simulated/floor/plasteel, /area/atmos) "bUp" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 1; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 8; - icon_state = "1-8" - }, +/obj/item/toy/figure/mime, /turf/simulated/floor/plasteel{ icon_state = "dark" }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/area/maintenance/starboard) "bUq" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 - }, +/obj/vehicle/ambulance, /turf/simulated/floor/plasteel{ - icon_state = "dark" + dir = 1; + icon_state = "whiteblue" }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" - }) +/area/medical/paramedic) "bUr" = ( /obj/machinery/atmospherics/unary/portables_connector, /turf/simulated/floor/plating, @@ -57095,6 +57511,51 @@ icon_state = "dark" }, /area/atmos) +"bUx" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10; + initialize_directions = 10; + level = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/research{ + name = "Research Division" + }) +"bUy" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 1; + on = 1; + scrub_Toxins = 0 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/research{ + name = "Research Division" + }) +"bUz" = ( +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/research{ + name = "Research Division" + }) "bUA" = ( /obj/structure/window/reinforced{ dir = 4 @@ -57296,6 +57757,12 @@ /area/hallway/secondary/entry{ name = "Arrivals" }) +"bUR" = ( +/obj/machinery/door/airlock/welded, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bUS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -57523,6 +57990,61 @@ }, /turf/simulated/floor/plating, /area/maintenance/fore) +"bVj" = ( +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8; + initialize_directions = 11 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/research{ + name = "Research Division" + }) +"bVk" = ( +/obj/machinery/power/apc{ + cell_type = 10000; + dir = 1; + name = "Research Division APC"; + pixel_y = 25 + }, +/obj/structure/cable/yellow{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/camera{ + c_tag = "Research Division - Airlock"; + dir = 2; + network = list("SS13","RD") + }, +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/research{ + name = "Research Division" + }) +"bVl" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/plating, +/area/medical/research{ + name = "Research Division" + }) "bVm" = ( /obj/machinery/door/firedoor, /obj/structure/cable/yellow{ @@ -57579,23 +58101,22 @@ }, /area/crew_quarters/kitchen) "bVr" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/power/apc{ - dir = 8; - name = "Telecoms Storage APC"; - pixel_x = -28 +/obj/effect/landmark{ + name = "blobstart" }, /obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" +/obj/structure/disposalpipe/segment, +/obj/item/cigbutt, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 8 }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" }) "bVs" = ( /obj/structure/table, @@ -57695,15 +58216,18 @@ /turf/simulated/floor/wood, /area/crew_quarters/theatre) "bVC" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 4; - on = 1 +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/obj/effect/landmark/start{ - name = "Clown" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "white" }, -/turf/simulated/floor/wood, -/area/crew_quarters/theatre) +/area/medical/research{ + name = "Research Division" + }) "bVD" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ dir = 1; @@ -57750,22 +58274,20 @@ name = "\improper Teleporter Room" }) "bVG" = ( -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating, +/area/medical/research{ + name = "Research Division" }) -"bVH" = ( -/obj/machinery/alarm{ +"bVI" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/light{ dir = 1; - pixel_y = -22 + in_use = 1 }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/maintenance/atmos_control{ - name = "Telecoms Storage" +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" }) "bVJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -57912,6 +58434,14 @@ }, /turf/simulated/floor/engine/plasma, /area/atmos) +"bVX" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb2, +/obj/item/trash/tapetrash, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bVY" = ( /obj/structure/window/reinforced{ dir = 4 @@ -57938,6 +58468,28 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) +"bVZ" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/suit/storage/labcoat/mad, +/obj/item/clothing/glasses/science, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"bWa" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bWb" = ( /obj/machinery/keycard_auth{ pixel_x = -24 @@ -58025,21 +58577,9 @@ name = "Port Maintenance" }) "bWl" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/effect/decal/warning_stripes/southeast, -/turf/simulated/floor/plasteel, -/area/teleporter{ - name = "\improper Teleporter Room" +/turf/simulated/wall/rust, +/area/maintenance/aft{ + name = "Aft Maintenance" }) "bWm" = ( /obj/structure/rack, @@ -58781,6 +59321,52 @@ }, /turf/simulated/floor/engine/plasma, /area/atmos) +"bXC" = ( +/obj/structure/computerframe, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"bXD" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"bXE" = ( +/obj/structure/table, +/obj/item/reagent_containers/syringe, +/obj/item/storage/pill_bottle/random_drug_bottle, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"bXF" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14"; + layer = 4.1; + tag = "icon-plant-14" + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whitepurple" + }, +/area/medical/research{ + name = "Research Division" + }) +"bXG" = ( +/obj/item/reagent_containers/iv_bag, +/obj/item/reagent_containers/iv_bag/salglu, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/item/reagent_containers/iv_bag/blood/random, +/obj/machinery/iv_drip, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bXH" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -59159,13 +59745,11 @@ name = "Central Maintenance" }) "bYq" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/hardsuit/engine/atmos, -/obj/effect/decal/warning_stripes/west, -/turf/simulated/floor/plasteel, -/area/atmos) +/obj/item/mounted/frame/apc_frame, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bYr" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/firealarm{ @@ -59425,6 +60009,13 @@ /obj/effect/decal/warning_stripes/yellow/hollow, /turf/simulated/floor/plasteel, /area/gateway) +"bYQ" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/blood/old, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bYR" = ( /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plasteel, @@ -59926,6 +60517,12 @@ }, /turf/simulated/floor/engine/plasma, /area/atmos) +"bZO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/simulated/wall, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "bZP" = ( /turf/simulated/wall, /area/maintenance/portsolar) @@ -61055,14 +61652,21 @@ /turf/simulated/floor/plasteel, /area/hallway/primary/central) "cbJ" = ( -/obj/item/radio/intercom{ - frequency = 1459; - name = "Station Intercom (General)"; - pixel_y = 28 +/obj/machinery/light_switch{ + pixel_x = -25; + pixel_y = -5 }, -/obj/effect/decal/warning_stripes/southeast, -/turf/simulated/floor/plasteel, -/area/atmos) +/obj/machinery/status_display{ + density = 0; + layer = 4; + pixel_y = 32 + }, +/obj/machinery/suit_storage_unit/cmo, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "barber" + }, +/area/medical/cmo) "cbK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -61193,34 +61797,29 @@ name = "\improper Toxins Lab" }) "cca" = ( -/obj/machinery/light_switch{ - pixel_y = 28 +/obj/machinery/camera{ + c_tag = "Security Post - Medbay"; + dir = 2; + network = list("SS13","Medbay") }, -/obj/machinery/atmospherics/pipe/simple/visible/purple{ - dir = 6 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/hardsuit/engine/atmos, -/turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "caution" - }, -/area/atmos) -"ccb" = ( -/obj/machinery/atmospherics/pipe/simple/visible/purple{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/mask/breath, -/obj/item/clothing/suit/space/hardsuit/engine/atmos, /turf/simulated/floor/plasteel{ dir = 1; - icon_state = "caution" + icon_state = "whiteblue" }, -/area/atmos) +/area/medical/paramedic) +"ccb" = ( +/obj/machinery/door_control{ + id = "paramedic"; + name = "Garage Door Control"; + pixel_x = -1; + pixel_y = 24; + req_access_txt = "66" + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "ccc" = ( /obj/effect/decal/cleanable/fungus, /turf/simulated/wall, @@ -61288,6 +61887,13 @@ }, /turf/simulated/floor/engine/co2, /area/atmos) +"cck" = ( +/obj/structure/closet/secure_closet/paramedic, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "ccl" = ( /obj/effect/landmark{ name = "JoinLateGateway" @@ -61983,9 +62589,27 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "cdq" = ( -/obj/effect/decal/warning_stripes/southwest, -/turf/simulated/floor/plasteel, -/area/atmos) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6; + level = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "cdr" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -62316,8 +62940,29 @@ name = "Medbay Storage" }) "cdU" = ( -/turf/simulated/wall, -/area/security/checkpoint/medical) +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + level = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "cdV" = ( /obj/machinery/door/poddoor/multi_tile/four_tile_hor{ id_tag = "escapepodbay" @@ -62476,14 +63121,26 @@ name = "Aft Maintenance" }) "cel" = ( -/obj/effect/spawner/window/reinforced, +/obj/machinery/door/airlock/medical{ + name = "Paramedic" + }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + level = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/paramedic) "cem" = ( /obj/effect/decal/warning_stripes/east, /turf/simulated/floor/plating, @@ -62524,6 +63181,15 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/wall/r_wall, /area/tcommsat/server) +"ceq" = ( +/obj/machinery/door/airlock/medical{ + name = "Paramedic" + }, +/obj/machinery/door/firedoor, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/paramedic) "cer" = ( /obj/structure/window/reinforced{ dir = 8 @@ -62723,19 +63389,23 @@ }, /area/atmos) "ceL" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4; + level = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "ceM" = ( /obj/structure/spacepoddoor{ dir = 4; @@ -62810,29 +63480,17 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "ceS" = ( -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, +/obj/structure/bed/amb_trolley, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 10 }, -/obj/structure/table/reinforced, -/obj/machinery/camera{ - c_tag = "Security Post - Cargo"; - dir = 1; - network = list("SS13") +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, /turf/simulated/floor/plasteel{ - icon_state = "red" + icon_state = "white" }, -/area/security/checkpoint/supply{ - name = "Security Post - Cargo" - }) +/area/medical/paramedic) "ceT" = ( /obj/machinery/mech_bay_recharge_port, /obj/structure/cable/yellow{ @@ -63203,10 +63861,13 @@ name = "Research Division" }) "cfx" = ( -/turf/simulated/wall, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/obj/effect/landmark/start{ + name = "Paramedic" + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/paramedic) "cfy" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -63280,47 +63941,24 @@ }, /area/hydroponics) "cfE" = ( -/obj/machinery/door_control{ - id = "paramedic"; - name = "Garage Door Control"; - pixel_x = -1; - pixel_y = 24; - req_access_txt = "66" +/obj/machinery/constructable_frame, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) +"cfF" = ( +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + on = 1 }, -/obj/machinery/alarm{ - dir = 8; - pixel_x = 25 +/obj/structure/extinguisher_cabinet{ + pixel_x = -27 }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 10; + icon_state = "whiteblue" }, /area/medical/paramedic) -"cfF" = ( -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/obj/item/folder/red, -/obj/item/book/manual/security_space_law{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/machinery/newscaster/security_unit{ - pixel_y = 32 - }, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 5 - }, -/area/security/checkpoint/medical) "cfG" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -27 @@ -63666,18 +64304,18 @@ /turf/simulated/floor/wood, /area/ntrep) "cgr" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring medbay to ensure patient safety."; - dir = 1; - name = "Medbay Monitor"; - network = list("Medbay"); - pixel_x = -29 +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 }, +/obj/machinery/light, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + dir = 2; + icon_state = "whiteblue" }, -/area/security/checkpoint/medical) +/area/medical/paramedic) "cgs" = ( /obj/structure/table/wood, /obj/item/paper_bin{ @@ -63878,50 +64516,26 @@ name = "Port Maintenance" }) "cgI" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/light_switch{ - pixel_x = -27; - pixel_y = 6 - }, -/obj/machinery/newscaster/security_unit{ - pixel_y = 32 +/obj/structure/closet/paramedic, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 28; + pixel_y = 5 }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 9 + dir = 4; + icon_state = "whiteblue" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/paramedic) "cgJ" = ( -/obj/structure/table, -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_y = 30 - }, -/obj/machinery/door_control{ - id = "Biohazard"; - name = "Biohazard Shutter Control"; - pixel_y = 7; - req_access_txt = "47" - }, -/obj/machinery/door_control{ - desc = "A remote control switch for the medbay foyer."; - id = "ResearchFoyer"; - name = "Research Door Button"; - normaldoorcontrol = 1; - pixel_y = -2 - }, -/turf/simulated/floor/plasteel{ - icon_state = "red"; +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/medbay2{ + name = "Medbay Storage" }) "cgK" = ( /obj/structure/table, @@ -64536,8 +65150,19 @@ name = "Medbay Storage" }) "chL" = ( +/obj/machinery/hologram/holopad, +/obj/effect/landmark/start{ + name = "Medical Doctor" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 + dir = 9; + level = 1 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -64658,15 +65283,27 @@ name = "Medbay Storage" }) "chV" = ( -/obj/vehicle/ambulance, +/obj/machinery/hologram/holopad, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5; + level = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9; + level = 1 + }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "whiteblue" }, /area/medical/paramedic) "chW" = ( -/obj/machinery/computer/crew, +/obj/structure/chair/office/light{ + dir = 4 + }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "whiteblue" }, /area/medical/paramedic) "chX" = ( @@ -64695,21 +65332,16 @@ }, /area/atmos) "chZ" = ( -/obj/machinery/requests_console{ - department = "Security"; - departmentType = 5; - pixel_y = 30 - }, -/obj/machinery/camera{ - c_tag = "Security Post - Medbay"; - dir = 2; - network = list("SS13","Medbay") +/obj/machinery/alarm{ + dir = 8; + pixel_x = 25 }, +/obj/machinery/computer/crew, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 9 + dir = 6; + icon_state = "whiteblue" }, -/area/security/checkpoint/medical) +/area/medical/paramedic) "cia" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, @@ -64806,48 +65438,61 @@ /turf/simulated/floor/plating, /area/atmos) "cik" = ( -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + icon_state = "white" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" }) "cil" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - on = 1 - }, -/obj/structure/chair/office/dark{ - dir = 1 - }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) -"cim" = ( -/obj/machinery/computer/secure_data, -/obj/item/book/manual/security_space_law, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8; - name = "Research Monitor"; - network = list("RD"); - pixel_x = 28; - pixel_y = 2 + initialize_directions = 11 + }, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 + icon_state = "white" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" + }) +"cim" = ( +/obj/item/storage/firstaid/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/firstaid/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/firstaid/toxin, +/obj/item/storage/firstaid/toxin{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/glass, +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 8; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" }) "cin" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -65316,23 +65961,29 @@ }, /area/atmos) "ciX" = ( -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 30 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Security Post - Research Division"; - dir = 8; - network = list("SS13","RD") +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag, +/obj/item/reagent_containers/iv_bag, +/obj/item/reagent_containers/iv_bag, +/obj/machinery/light{ + dir = 1; + on = 1 }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 + dir = 9; + icon_state = "whiteblue" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" + }) +"ciY" = ( +/obj/machinery/iv_drip, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" }) "ciZ" = ( /obj/machinery/disposal{ @@ -65586,58 +66237,73 @@ name = "\improper Warehouse" }) "cjw" = ( -/obj/structure/disposalpipe/segment{ - dir = 8; - icon_state = "pipe-c" +/obj/machinery/alarm{ + pixel_y = 24 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/structure/bed/roller, /turf/simulated/floor/plasteel{ - dir = 4; + dir = 1; icon_state = "whiteblue" }, /area/medical/medbay2{ name = "Medbay Storage" }) "cjx" = ( -/obj/structure/bed/amb_trolley, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" +/obj/machinery/camera{ + c_tag = "Security Post - Medbay"; + dir = 2; + network = list("SS13","Medbay") }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) -"cjy" = ( -/obj/effect/landmark/start{ - name = "Paramedic" - }, -/obj/machinery/power/apc{ +/obj/machinery/atmospherics/unary/vent_pump{ dir = 8; - name = "west bump"; - pixel_x = -24; - shock_proof = 0 - }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 1; + icon_state = "whiteblue" }, -/area/medical/paramedic) +/area/medical/medbay2{ + name = "Medbay Storage" + }) +"cjy" = ( +/obj/machinery/door/firedoor, +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "cjz" = ( /turf/simulated/floor/plasteel{ icon_state = "white" }, /area/medical/paramedic) "cjA" = ( -/obj/structure/closet/secure_closet/security/med, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8" }, -/area/security/checkpoint/medical) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "cjB" = ( /obj/machinery/meter, /obj/structure/disposalpipe/segment{ @@ -65669,10 +66335,19 @@ }, /area/medical/reception) "cjD" = ( -/obj/effect/spawner/window/reinforced, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/security/checkpoint/medical) +/obj/structure/table/glass, +/obj/item/storage/toolbox/emergency, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -24 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "cjE" = ( /obj/structure/chair, /turf/simulated/floor/plasteel{ @@ -65817,74 +66492,62 @@ name = "Research Division" }) "cjO" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6; + level = 1 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whiteblue" }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) +"cjP" = ( /obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 1; + dir = 8; on = 1; + scrub_N2O = 0; scrub_Toxins = 0 }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "whiteblue" }, -/area/medical/research{ - name = "Research Division" - }) -"cjP" = ( -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" }) "cjQ" = ( /obj/effect/spawner/window/reinforced, /turf/simulated/floor/plating, /area/medical/chemistry) "cjR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, +/obj/structure/table/glass, +/obj/item/roller, +/obj/item/roller, +/obj/item/roller, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + dir = 6; + icon_state = "whiteblue" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" }) "cjS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 + dir = 4 }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whiteblue" + }, +/area/medical/reception) +"cjT" = ( +/obj/effect/spawner/window/reinforced, +/turf/simulated/floor/plating, +/area/medical/medbay2{ + name = "Medbay Storage" }) "cjU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -65914,26 +66577,18 @@ /turf/simulated/floor/plating, /area/maintenance/starboard) "cjY" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = -26; - pixel_y = 28 - }, -/obj/machinery/power/apc{ - dir = 8; - name = "Medical Security Checkpoint APC"; - pixel_x = -24 - }, /obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + icon_state = "white" }, -/area/security/checkpoint/medical) +/area/medical/reception) "cjZ" = ( /obj/machinery/alarm{ dir = 1; @@ -66138,6 +66793,17 @@ /area/medical/research{ name = "Research Division" }) +"ckt" = ( +/obj/machinery/camera{ + c_tag = "Medbay Break Room"; + dir = 1; + network = list("SS13","Medbay") + }, +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whiteblue" + }, +/area/medical/reception) "cku" = ( /obj/machinery/firealarm{ dir = 1; @@ -66293,25 +66959,19 @@ name = "Medbay Storage" }) "ckG" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 24 +/obj/machinery/door/airlock/medical/glass{ + id_tag = null; + name = "Medbay Storage"; + req_access_txt = "5" }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 5 + icon_state = "white" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" +/area/medical/medbay2{ + name = "Medbay Storage" }) "ckH" = ( /obj/structure/rack, @@ -66328,23 +66988,14 @@ name = "Aft Maintenance" }) "ckI" = ( -/obj/item/storage/firstaid/regular{ - pixel_x = 3; - pixel_y = -3 +/obj/machinery/door/airlock/medical/glass{ + id_tag = null; + name = "Medbay Storage"; + req_access_txt = "5" }, -/obj/item/storage/firstaid/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/firstaid/toxin, -/obj/item/storage/firstaid/toxin{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/glass, +/obj/machinery/door/firedoor, /turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whiteblue" + icon_state = "white" }, /area/medical/medbay2{ name = "Medbay Storage" @@ -66360,16 +67011,12 @@ name = "Aft Maintenance" }) "ckK" = ( -/obj/machinery/hologram/holopad, -/obj/effect/landmark/start{ - name = "Medical Doctor" - }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "white" }, -/area/medical/medbay2{ - name = "Medbay Storage" - }) +/area/medical/reception) "ckL" = ( /obj/item/storage/box/bodybags{ pixel_x = 3; @@ -66392,84 +67039,73 @@ name = "Medbay Storage" }) "ckM" = ( -/obj/machinery/hologram/holopad, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6; - level = 1 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 + dir = 4 + }, +/obj/machinery/power/apc{ + dir = 1; + name = "Medbay Central APC"; + pixel_y = 24 + }, +/obj/structure/cable/yellow{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whiteblue" + }, +/area/medical/reception) +"ckN" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/effect/landmark/start{ + name = "Medical Doctor" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 2; + initialize_directions = 11 + }, +/turf/simulated/floor/plasteel{ + icon_state = "white" + }, +/area/medical/reception) +"ckO" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, /obj/structure/cable/yellow{ d1 = 1; - d2 = 2; - icon_state = "1-2" + d2 = 4; + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, /turf/simulated/floor/plasteel{ icon_state = "white" }, -/area/medical/paramedic) -"ckN" = ( -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 4; - on = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) -"ckO" = ( -/obj/machinery/camera{ - c_tag = "Paramedic"; - dir = 8; - network = list("SS13","Medbay") - }, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 28; - pixel_y = 5 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) +/area/medical/reception) "ckP" = ( -/obj/machinery/computer/secure_data, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 6 - }, -/area/security/checkpoint/medical) +/obj/item/healthanalyzer, +/turf/simulated/floor/plating, +/area/maintenance/aft{ + name = "Aft Maintenance" + }) "ckQ" = ( -/obj/item/radio/intercom{ - dir = 0; - name = "Station Intercom (General)"; - pixel_x = -27; - pixel_y = -10 - }, -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 2; - on = 1 +/obj/structure/chair{ + dir = 4 }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + dir = 2; + icon_state = "whiteblue" }, -/area/security/checkpoint/medical) +/area/medical/medbay3) "ckR" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -66530,18 +67166,6 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/hallway/primary/aft) -"ckW" = ( -/obj/machinery/autolathe{ - icon_state = "autolathe"; - name = "public autolathe" - }, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whitepurple" - }, -/area/medical/research{ - name = "Research Division" - }) "ckX" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -66654,51 +67278,46 @@ }, /area/maintenance/incinerator) "clf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, +/obj/structure/table, +/obj/item/soap/nanotrasen, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 8 + dir = 2; + icon_state = "whiteblue" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/medbay3) "clg" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 8; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) -"clh" = ( -/obj/item/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 27 - }, -/obj/machinery/light{ - dir = 4 - }, /obj/structure/chair{ dir = 8 }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 + dir = 2; + icon_state = "whiteblue" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/medbay3) +"clh" = ( +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/bodybags, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/table/glass, +/obj/machinery/door_control{ + desc = "A remote control switch for the cloning door."; + id = "CloningDoor"; + name = "Cloning Exit Button"; + normaldoorcontrol = 1; + pixel_x = -23; + pixel_y = 8 + }, +/turf/simulated/floor/plasteel{ + dir = 10; + icon_state = "whiteblue" + }, +/area/medical/genetics_cloning) "cli" = ( /obj/structure/closet/crate/internals, /obj/effect/spawner/lootdrop/maintenance{ @@ -67016,24 +67635,16 @@ /turf/space, /area/space/nearstation) "clI" = ( -/obj/machinery/requests_console{ - announcementConsole = 0; - department = "Medbay"; - departmentType = 1; - name = "Medbay RC"; - pixel_y = 30; - pixel_z = 0 - }, -/obj/structure/table/glass, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light/small{ - dir = 1 +/obj/item/radio/intercom{ + dir = 8; + name = "station intercom (General)"; + pixel_x = -28 }, +/obj/machinery/optable, /turf/simulated/floor/plasteel{ - dir = 9; - icon_state = "whiteblue" + icon_state = "dark" }, -/area/medical/reception) +/area/medical/morgue) "clJ" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -67090,18 +67701,15 @@ name = "Aft Maintenance" }) "clQ" = ( -/obj/structure/girder, -/obj/structure/grille, -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 4; - icon_state = "2-4" +/obj/effect/landmark/start{ + name = "Coroner" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "clR" = ( /obj/structure/reagent_dispensers/watertank, /obj/item/storage/box/lights/mixed, @@ -67145,21 +67753,14 @@ name = "Aft Maintenance" }) "clV" = ( -/obj/machinery/alarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/window/reinforced{ + dir = 4 }, +/obj/structure/closet/wardrobe/coroner, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 10 + icon_state = "dark" }, -/area/security/checkpoint/medical) +/area/medical/morgue) "clW" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -67207,7 +67808,8 @@ }) "clZ" = ( /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 2; + icon_state = "whiteblue" }, /area/medical/medbay2{ name = "Medbay Storage" @@ -67224,43 +67826,72 @@ }, /area/medical/reception) "cmb" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) -"cmc" = ( -/obj/structure/closet/paramedic, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) -"cmd" = ( -/obj/structure/closet/secure_closet/paramedic, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/paramedic) -"cme" = ( -/obj/machinery/computer/crew, -/turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 - }, -/area/security/checkpoint/medical) -"cmf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "red"; +/obj/structure/morgue{ + tag = "icon-morgue1 (WEST)"; + icon_state = "morgue1"; dir = 8 }, -/area/security/checkpoint/medical) +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"cmc" = ( +/obj/machinery/atmospherics/unary/vent_scrubber{ + dir = 2; + on = 1; + scrub_N2O = 0; + scrub_Toxins = 0 + }, +/obj/structure/table, +/obj/item/autopsy_scanner, +/obj/item/camera{ + name = "Autopsy Camera"; + pixel_x = -2; + pixel_y = -2 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"cmd" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/filingcabinet/chestdrawer/autopsy, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"cme" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/morgue{ + tag = "icon-morgue1 (WEST)"; + icon_state = "morgue1"; + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"cmf" = ( +/obj/machinery/power/apc{ + dir = 4; + name = "Morgue APC"; + pixel_x = 26 + }, +/obj/structure/cable/yellow{ + d1 = 0; + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "cmg" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -67384,41 +68015,42 @@ /turf/simulated/wall, /area/medical/reception) "cmu" = ( -/obj/machinery/power/apc{ - dir = 8; - name = "Security Post - Research Division APC"; - pixel_x = -24 +/obj/machinery/atmospherics/unary/vent_pump, +/obj/machinery/door/window/eastright{ + name = "Coroner Office"; + req_access_txt = "5" }, -/obj/structure/cable/yellow, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 10 + icon_state = "dark" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/morgue) "cmv" = ( -/obj/structure/closet/secure_closet/security/science, -/turf/simulated/floor/plasteel{ - icon_state = "red" +/obj/machinery/door_control{ + id = "cmoprivacy"; + name = "Privacy Shutters Control"; + pixel_x = -26; + pixel_y = 4 }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) -"cmw" = ( -/obj/structure/filingcabinet, -/obj/machinery/alarm{ +/obj/machinery/keycard_auth{ + pixel_x = -26; + pixel_y = -7 + }, +/obj/structure/filingcabinet/filingcabinet, +/turf/simulated/floor/plasteel{ dir = 8; - icon_state = "alarm0"; - pixel_x = 24 + icon_state = "barber" + }, +/area/medical/cmo) +"cmw" = ( +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 6 + icon_state = "dark" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/morgue) "cmx" = ( /obj/structure/closet/crate, /obj/item/coin/silver, @@ -67735,59 +68367,43 @@ name = "Aft Maintenance" }) "cna" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/medbay2{ - name = "Medbay Storage" - }) -"cnb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Paramedic"; - req_access_txt = "66" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) +"cnb" = ( +/obj/machinery/light/small{ + dir = 4 + }, /obj/structure/cable/yellow{ d1 = 1; - d2 = 2; - icon_state = "1-2" + d2 = 8; + icon_state = "1-8" }, /turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whiteblue" + icon_state = "dark" }, -/area/medical/paramedic) +/area/medical/morgue) "cnc" = ( -/obj/structure/chair/office/light{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door_control{ - desc = "A remote control switch for the medbay foyer."; - id = "MedbayFoyer"; - name = "Medbay Doors Control"; - normaldoorcontrol = 1; - pixel_x = 24; - pixel_y = 24 - }, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/effect/landmark/start{ + name = "Coroner" }, +/obj/structure/chair/office/dark, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 4 + icon_state = "dark" }, -/area/security/checkpoint/medical) +/area/medical/morgue) "cnd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -67816,10 +68432,17 @@ }, /area/medical/reception) "cnf" = ( -/obj/machinery/door/firedoor, -/obj/effect/spawner/window/reinforced, -/turf/simulated/floor/plating, -/area/security/checkpoint/medical) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/morgue, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "cng" = ( /obj/structure/noticeboard{ desc = "A board for pinning important notices upon."; @@ -67843,6 +68466,12 @@ }, /obj/item/storage/box/donkpockets, /obj/structure/table/glass, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 4; + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 + }, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -68039,6 +68668,10 @@ pixel_y = 32 }, /obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 + }, /mob/living/simple_animal/pet/dog/corgi/borgi, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; @@ -68096,38 +68729,38 @@ }, /area/toxins/lab) "cnC" = ( -/turf/simulated/wall/r_wall, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) -"cnD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Research Division"; - req_access_txt = "63" +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/machinery/atmospherics/unary/vent_pump{ + dir = 8; + external_pressure_bound = 101.325; + on = 1; + pressure_checks = 1 }, /turf/simulated/floor/plasteel{ - icon_state = "redfull" + icon_state = "dark" }, -/area/security/checkpoint/science{ - name = "Security Post - Research Division" - }) +/area/medical/morgue) +"cnD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/morgue{ + tag = "icon-morgue1 (WEST)"; + icon_state = "morgue1"; + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "cnE" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/bodybags, +/turf/simulated/floor/plasteel{ + icon_state = "dark" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "0"; - req_one_access_txt = "12;47" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) +/area/medical/morgue) "cnF" = ( /obj/machinery/vending/cigarette, /obj/machinery/status_display{ @@ -68152,6 +68785,10 @@ pixel_y = 7 }, /obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1; + level = 1 + }, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -68173,7 +68810,8 @@ /area/maintenance/incinerator) "cnI" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = 1 + dir = 9; + level = 1 }, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; @@ -68274,6 +68912,18 @@ /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plating, /area/maintenance/starboard) +"cnS" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/item/pen, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "barber" + }, +/area/medical/cmo) "cnT" = ( /obj/machinery/chem_heater{ pixel_x = -4; @@ -68478,23 +69128,25 @@ icon_state = "whiteblue" }, /area/medical/exam_room) -"com" = ( -/obj/structure/cable/yellow{ - d1 = 2; - d2 = 8; - icon_state = "2-8" +"col" = ( +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/photocopier, /turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whiteblue" + icon_state = "dark" }, -/area/medical/medbay2{ - name = "Medbay Storage" - }) +/area/medical/morgue) +"com" = ( +/obj/machinery/light/small, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/morgue, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/medical/morgue) "con" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/poddoor{ @@ -68533,18 +69185,13 @@ name = "Medbay Storage" }) "coq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whiteblue" + icon_state = "dark" }, -/area/medical/reception) +/area/medical/morgue) "cor" = ( /obj/machinery/door_control{ id = "turbinevent"; @@ -68557,38 +69204,30 @@ }, /area/maintenance/incinerator) "cos" = ( -/obj/machinery/alarm{ - pixel_y = 24 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/table/glass, -/obj/item/roller{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/roller{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/roller, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/morgue{ + tag = "icon-morgue1 (WEST)"; + icon_state = "morgue1"; + dir = 8 }, /turf/simulated/floor/plasteel{ - dir = 5; - icon_state = "whiteblue" + icon_state = "dark" }, -/area/medical/reception) +/area/medical/morgue) "cot" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 +/obj/machinery/light_switch{ + pixel_x = 23 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 6 + icon_state = "dark" }, -/area/security/checkpoint/medical) +/area/medical/morgue) "cou" = ( /obj/machinery/ignition_switch{ id = "Turbine_igniter"; @@ -68752,18 +69391,11 @@ }, /area/medical/exam_room) "coG" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/machinery/light_switch{ + pixel_x = 23 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/warning_stripes/south, -/turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) +/turf/simulated/wall/r_wall, +/area/hallway/primary/aft) "coH" = ( /obj/structure/table, /obj/item/crowbar, @@ -68867,19 +69499,7 @@ /area/medical/reception) "coS" = ( /obj/structure/chair/stool, -/turf/simulated/floor/plasteel{ - tag = "icon-cafeteria (NORTHEAST)"; - icon_state = "cafeteria"; - dir = 5 - }, -/area/medical/research{ - name = "Research Division" - }) -"coT" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 2; - on = 1 - }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -68890,9 +69510,6 @@ }) "coU" = ( /obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - req_access_txt = 1 - }, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -69013,7 +69630,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -69030,7 +69647,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -69275,53 +69892,58 @@ name = "Medbay Storage" }) "cpF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/item/radio/intercom{ + dir = 1; + name = "Station Intercom (General)"; + pixel_y = -29 }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 8; + icon_state = "barber" }, -/area/medical/reception) +/area/medical/cmo) "cpG" = ( -/obj/structure/bed/roller, +/obj/structure/table/glass, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Chief Medical Officer's Desk"; + departmentType = 5; + name = "Chief Medical Officer RC"; + pixel_y = -32 + }, +/obj/machinery/computer/med_data/laptop, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "barber" + }, +/area/medical/cmo) +"cpH" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/camera{ + c_tag = "Chemistry"; + dir = 4; + network = list("SS13","Medbay") + }, +/obj/structure/filingcabinet/filingcabinet, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whiteblue" }, -/area/medical/reception) -"cpH" = ( -/obj/structure/bed/roller, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whiteblue" - }, -/area/medical/reception) -"cpI" = ( -/obj/effect/spawner/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plating, -/area/security/checkpoint/medical) +/area/medical/medbay3) "cpJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/security/glass{ - name = "Medbay Security Post"; - req_access_txt = "63" +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = -1 }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 }, +/obj/machinery/light/small, /turf/simulated/floor/plasteel{ - icon_state = "red"; - dir = 1 + icon_state = "dark" }, -/area/security/checkpoint/medical) +/area/medical/morgue) "cpK" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -69426,30 +70048,22 @@ }, /area/medical/reception) "cpR" = ( -/obj/machinery/power/apc{ - cell_type = 10000; - dir = 1; - name = "Research Division APC"; - pixel_y = 25 +/obj/machinery/optable{ + name = "Robotics Operating Table" }, -/obj/structure/cable/yellow{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 }, /obj/machinery/camera{ - c_tag = "Research Division - Airlock"; - dir = 2; + c_tag = "Robotics - Aft"; + dir = 1; network = list("SS13","RD") }, /turf/simulated/floor/plasteel{ - icon_state = "white" + dir = 1; + icon_state = "whitehall" }, -/area/medical/research{ - name = "Research Division" - }) +/area/assembly/robotics) "cpS" = ( /obj/machinery/slot_machine{ pixel_y = 2 @@ -69574,18 +70188,10 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) -"cqd" = ( -/obj/effect/decal/warning_stripes/yellow/hollow, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" - }) "cqe" = ( /obj/machinery/r_n_d/destructive_analyzer, /obj/effect/decal/warning_stripes/north, @@ -69652,7 +70258,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -69666,45 +70272,6 @@ icon_state = "neutralcorner" }, /area/hallway/primary/aft) -"cql" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8; - initialize_directions = 11 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" - }) -"cqm" = ( -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 4; - on = 1; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" - }) "cqn" = ( /obj/structure/table, /obj/item/stock_parts/manipulator, @@ -69794,18 +70361,6 @@ name = "Research Division" }) "cqt" = ( -/turf/simulated/floor/plasteel{ - tag = "icon-cafeteria (NORTHEAST)"; - icon_state = "cafeteria"; - dir = 5 - }, -/area/medical/research{ - name = "Research Division" - }) -"cqu" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -69841,44 +70396,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/engine, /area/toxins/explab) -"cqy" = ( -/obj/structure/sink{ - dir = 4; - icon_state = "sink"; - pixel_x = 11 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" - }) "cqz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/engine, /area/toxins/explab) -"cqA" = ( -/obj/effect/landmark{ - name = "blobstart" - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/effect/decal/warning_stripes/north, -/turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) "cqB" = ( /obj/machinery/light{ dir = 4; @@ -69905,18 +70426,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cqD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-cafeteria (NORTHEAST)"; - icon_state = "cafeteria"; - dir = 5 - }, -/area/medical/research{ - name = "Research Division" - }) "cqE" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -70006,7 +70515,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -70108,7 +70617,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -70276,50 +70785,6 @@ icon_state = "whiteblue" }, /area/medical/reception) -"crn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) -"cro" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whitebluecorner" - }, -/area/medical/reception) -"crp" = ( -/obj/machinery/power/apc{ - dir = 1; - name = "Medbay Central APC"; - pixel_y = 24 - }, -/obj/structure/cable/yellow{ - d2 = 2; - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Medbay Hallway Fore"; - dir = 2; - network = list("SS13","Medbay") - }, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whiteblue" - }, -/area/medical/reception) "crq" = ( /obj/machinery/camera{ c_tag = "Atmospherics Tank - Air"; @@ -70350,29 +70815,10 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) -"crt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - dir = 4; - icon_state = "whitebluecorner" - }, -/area/medical/reception) -"cru" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whiteblue" - }, -/area/medical/reception) "crv" = ( /obj/structure/closet/firecloset, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -70382,20 +70828,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"crw" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 2 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whiteblue" - }, -/area/medical/reception) "crx" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -70706,6 +71138,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -70718,7 +71151,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -70789,7 +71221,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -70813,7 +71245,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -70835,7 +71267,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -70924,7 +71356,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71048,7 +71480,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71068,7 +71500,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71104,7 +71536,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71142,7 +71574,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71225,7 +71657,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71243,7 +71675,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71261,7 +71693,7 @@ name = "containment blast door"; opacity = 0 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -71344,29 +71776,6 @@ icon_state = "white" }, /area/medical/reception) -"csR" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow, -/obj/structure/cable/yellow{ - d2 = 8; - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/visible, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Xenolab"; - name = "test chamber blast door"; - opacity = 0 - }, -/turf/simulated/floor/plating, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "csS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -71523,6 +71932,7 @@ req_one_access_txt = "47" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; @@ -71531,23 +71941,6 @@ /area/medical/research{ name = "Research Division" }) -"ctd" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Xenolab"; - name = "test chamber blast door"; - opacity = 0 - }, -/turf/simulated/floor/plating, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "cte" = ( /turf/simulated/wall, /area/toxins/explab) @@ -71579,23 +71972,6 @@ icon_state = "white" }, /area/medical/reception) -"cth" = ( -/obj/machinery/shower{ - tag = "icon-shower (WEST)"; - icon_state = "shower"; - dir = 8 - }, -/obj/item/radio/intercom{ - dir = 8; - name = "Station Intercom (General)"; - pixel_y = -28 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/research{ - name = "Research Division" - }) "cti" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -71627,28 +72003,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"ctk" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow{ - d2 = 8; - icon_state = "0-8" - }, -/obj/structure/cable/yellow{ - d2 = 4; - icon_state = "0-4" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Xenolab"; - name = "test chamber blast door"; - opacity = 0 - }, -/turf/simulated/floor/plating, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ctl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -71793,25 +72147,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"ctA" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 2; - initialize_directions = 11 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) "ctB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -71825,40 +72160,6 @@ icon_state = "white" }, /area/medical/reception) -"ctC" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) -"ctD" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/landmark/start{ - name = "Medical Doctor" - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) "ctE" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/atmospherics/unary/portables_connector{ @@ -71868,38 +72169,6 @@ /area/medical/research{ name = "Research Division" }) -"ctF" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 2; - initialize_directions = 11 - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) -"ctG" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/turf/simulated/floor/plasteel{ - icon_state = "white" - }, -/area/medical/reception) "ctH" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -71974,28 +72243,6 @@ icon_state = "whiteblue" }, /area/medical/reception) -"ctN" = ( -/obj/machinery/door/window/southleft{ - dir = 2; - name = "Maximum Security Test Chamber"; - req_access_txt = "55" - }, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Xenolab"; - name = "test chamber blast door"; - opacity = 0 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ctO" = ( /obj/structure/table, /obj/machinery/door/window/eastright{ @@ -72062,23 +72309,6 @@ icon_state = "white" }, /area/medical/surgery1) -"ctU" = ( -/obj/effect/spawner/window/reinforced, -/obj/structure/cable/yellow{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Xenolab"; - name = "test chamber blast door"; - opacity = 0 - }, -/turf/simulated/floor/plating, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ctV" = ( /obj/machinery/optable, /obj/machinery/atmospherics/unary/vent_pump{ @@ -72372,6 +72602,7 @@ "cuu" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" @@ -72380,7 +72611,6 @@ name = "Research Division" }) "cuv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurplecorner" @@ -73148,10 +73378,10 @@ icon_state = "pipe-j1"; tag = "icon-pipe-j1 (EAST)" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 2 + }, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -73167,8 +73397,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 2 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4; + level = 1 }, /turf/simulated/floor/plasteel{ icon_state = "white" @@ -73288,20 +73519,6 @@ icon_state = "whiteblue" }, /area/medical/reception) -"cvN" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5; - level = 1 - }, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/simulated/floor/plasteel{ - dir = 10; - icon_state = "whiteblue" - }, -/area/medical/reception) "cvO" = ( /obj/structure/table, /obj/item/radio/intercom/department/medbay{ @@ -75177,35 +75394,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cza" = ( -/obj/item/folder/white, -/obj/item/stamp/rd{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/structure/table/reinforced, -/turf/simulated/floor/plasteel{ - tag = "icon-cafeteria (NORTHEAST)"; - icon_state = "cafeteria"; - dir = 5 - }, -/area/crew_quarters/hor) -"czb" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/machinery/light_switch{ - pixel_x = -25; - pixel_y = -5 - }, -/obj/machinery/status_display{ - density = 0; - layer = 4; - pixel_y = 32 - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) "czc" = ( /obj/machinery/computer/aifixer, /obj/machinery/requests_console{ @@ -76845,13 +77033,6 @@ /obj/effect/decal/cleanable/fungus, /turf/simulated/floor/plating, /area/maintenance/starboard) -"cBH" = ( -/obj/structure/closet/wardrobe/atmospherics_yellow, -/obj/item/flashlight, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/atmos) "cBI" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/machinery/light_switch{ @@ -77103,44 +77284,6 @@ icon_state = "whitebluefull" }, /area/medical/medbay3) -"cCb" = ( -/obj/structure/table/glass, -/obj/item/folder/blue, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 6; - pixel_y = -30 - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = -30 - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) -"cCc" = ( -/obj/structure/table/glass, -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Chief Medical Officer's Desk"; - departmentType = 5; - name = "Chief Medical Officer RC"; - pixel_y = -32 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/pen, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) "cCd" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -77503,24 +77646,6 @@ icon_state = "barber" }, /area/medical/cmo) -"cCG" = ( -/obj/structure/table/glass, -/obj/machinery/computer/med_data/laptop, -/obj/machinery/door_control{ - id = "cmoprivacy"; - name = "Privacy Shutters Control"; - pixel_x = -26; - pixel_y = 4 - }, -/obj/machinery/keycard_auth{ - pixel_x = -26; - pixel_y = -7 - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) "cCH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/power/apc{ @@ -77659,13 +77784,6 @@ /area/toxins/misc_lab{ name = "\improper Research Testing Range" }) -"cCS" = ( -/obj/structure/table/glass, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) "cCT" = ( /obj/machinery/portable_atmospherics/canister/sleeping_agent, /obj/structure/extinguisher_cabinet{ @@ -78022,21 +78140,6 @@ icon_state = "whiteblue" }, /area/medical/medbay3) -"cDy" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/suit/space/hardsuit/medical, -/obj/item/clothing/mask/breath, -/obj/item/radio/intercom{ - dir = 1; - name = "Station Intercom (General)"; - pixel_y = -29 - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "barber" - }, -/area/medical/cmo) "cDz" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -78277,18 +78380,6 @@ /area/medical/medbay3{ name = "Medbay Aft" }) -"cDV" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/camera{ - c_tag = "Chemistry"; - dir = 4; - network = list("SS13","Medbay") - }, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "whiteblue" - }, -/area/medical/medbay3) "cDW" = ( /obj/effect/spawner/window/reinforced, /obj/machinery/door/firedoor, @@ -78395,31 +78486,6 @@ icon_state = "dark" }, /area/medical/genetics) -"cEf" = ( -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/table/reinforced, -/obj/item/cartridge/signal/toxins{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/cartridge/signal/toxins{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/paper/monitorkey, -/turf/simulated/floor/plasteel{ - tag = "icon-cafeteria (NORTHEAST)"; - icon_state = "cafeteria"; - dir = 5 - }, -/area/crew_quarters/hor) "cEg" = ( /obj/structure/cable/yellow{ d1 = 4; @@ -79265,18 +79331,6 @@ }) "cFH" = ( /turf/simulated/wall, -/area/toxins/mixing{ - name = "\improper Toxins Lab" - }) -"cFI" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/camera{ - c_tag = "Toxins - Launch Area"; - dir = 2; - network = list("SS13","RD") - }, -/obj/effect/decal/warning_stripes/yellow/hollow, -/turf/simulated/floor/plasteel, /area/toxins/mixing{ name = "\improper Toxins Lab" }) @@ -81000,12 +81054,6 @@ icon_state = "white" }, /area/medical/surgery2) -"cIs" = ( -/obj/machinery/vending/cigarette, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/hallway/primary/aft) "cIt" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/radio/intercom{ @@ -81429,12 +81477,6 @@ /area/toxins/mixing{ name = "\improper Toxins Lab" }) -"cJg" = ( -/obj/machinery/vending/cola, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/hallway/primary/aft) "cJh" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 @@ -81833,31 +81875,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cJS" = ( -/obj/item/storage/box/rxglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/glass, -/obj/machinery/door_control{ - desc = "A remote control switch for the cloning door."; - id = "CloningDoor"; - name = "Cloning Exit Button"; - normaldoorcontrol = 1; - pixel_x = -23; - pixel_y = 8 - }, -/turf/simulated/floor/plasteel{ - tag = "icon-vault"; - icon_state = "vault" - }, -/area/medical/genetics_cloning) "cJT" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -81988,29 +82005,6 @@ icon_state = "whiteblue" }, /area/medical/medbay3) -"cKg" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/requests_console{ - department = "Morgue"; - departmentType = 5; - name = "Morgue Requests Console"; - pixel_y = 30 - }, -/obj/item/storage/box/bodybags{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box/bodybags, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cKh" = ( /obj/structure/table, /obj/item/radio/intercom{ @@ -82571,19 +82565,6 @@ icon_state = "white" }, /area/medical/patient_b) -"cLf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "Morgue"; - opacity = 1; - req_access_txt = "6" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/genetics_cloning) "cLg" = ( /obj/machinery/alarm{ dir = 4; @@ -83154,30 +83135,6 @@ /area/toxins/mixing{ name = "\improper Toxins Lab" }) -"cMa" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/poddoor{ - density = 0; - icon_state = "open"; - id_tag = "Biohazard_medi"; - name = "Quarantine Lockdown"; - opacity = 0 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance"; - req_access_txt = "45" - }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/turf/simulated/floor/plating, -/area/medical/medbay3) "cMb" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/radio/intercom{ @@ -83229,29 +83186,6 @@ icon_state = "dark" }, /area/medical/morgue) -"cMe" = ( -/obj/structure/filingcabinet/chestdrawer/autopsy, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cMf" = ( -/obj/machinery/camera{ - c_tag = "Morgue"; - dir = 2; - network = list("SS13","Medbay") - }, -/obj/structure/morgue, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cMg" = ( -/obj/structure/closet, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/hallway/primary/aft) "cMh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ req_access_txt = 1 @@ -83450,37 +83384,6 @@ /area/toxins/mixing{ name = "\improper Toxins Lab" }) -"cMv" = ( -/obj/machinery/power/apc{ - dir = 4; - name = "Morgue APC"; - pixel_x = 26 - }, -/obj/structure/cable/yellow{ - d2 = 8; - icon_state = "0-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cMw" = ( -/obj/machinery/firealarm{ - dir = 2; - pixel_y = 24 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/morgue{ - tag = "icon-morgue1 (WEST)"; - icon_state = "morgue1"; - dir = 8 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cMx" = ( /obj/structure/closet/crate, /obj/item/clothing/mask/gas, @@ -83691,14 +83594,6 @@ icon_state = "whitegreenfull" }, /area/medical/virology) -"cML" = ( -/obj/machinery/alarm{ - pixel_y = 32 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cMM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -83848,9 +83743,6 @@ icon_state = "whitegreenfull" }, /area/medical/virology) -"cMS" = ( -/turf/simulated/wall, -/area/hallway/primary/aft) "cMT" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -84270,18 +84162,6 @@ icon_state = "whitegreen" }, /area/medical/virology) -"cNE" = ( -/obj/machinery/disposal, -/obj/machinery/light_switch{ - pixel_x = 23 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cNF" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -84603,14 +84483,6 @@ /area/toxins/mixing{ name = "\improper Toxins Lab" }) -"cOd" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/morgue, -/obj/effect/decal/warning_stripes/yellow/hollow, -/turf/simulated/floor/plasteel, -/area/assembly/robotics) "cOe" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ @@ -85116,12 +84988,6 @@ icon_state = "escape" }, /area/hallway/primary/aft) -"cOQ" = ( -/obj/structure/sign/directions/evac{ - pixel_y = 0 - }, -/turf/simulated/wall/r_wall, -/area/hallway/primary/aft) "cOR" = ( /obj/structure/table, /obj/item/circular_saw, @@ -85190,19 +85056,6 @@ /obj/effect/decal/warning_stripes/yellow, /turf/simulated/floor/plasteel, /area/assembly/robotics) -"cOY" = ( -/obj/effect/landmark/start{ - name = "Coroner" - }, -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cOZ" = ( /turf/simulated/floor/plasteel{ dir = 8; @@ -85344,33 +85197,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cPk" = ( -/obj/machinery/photocopier, -/obj/item/radio/intercom{ - dir = 8; - name = "station intercom (General)"; - pixel_x = -28 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cPl" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/paper_bin{ - pixel_y = -1 - }, -/obj/item/pen{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cPm" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 8 @@ -85453,22 +85279,6 @@ icon_state = "whitegreenfull" }, /area/medical/virology) -"cPu" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 4; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/obj/structure/morgue{ - tag = "icon-morgue1 (WEST)"; - icon_state = "morgue1"; - dir = 8 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cPv" = ( /obj/item/radio/intercom{ frequency = 1459; @@ -85479,15 +85289,6 @@ icon_state = "dark" }, /area/medical/morgue) -"cPw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/morgue, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cPx" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -86206,26 +86007,6 @@ icon_state = "dark" }, /area/medical/morgue) -"cQB" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cQC" = ( -/obj/structure/morgue, -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cQD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -87282,32 +87063,6 @@ }, /obj/effect/decal/warning_stripes/south, /turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) -"cSm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/effect/spawner/lootdrop{ - loot = list(/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/structure/grille,/obj/item/cigbutt,/obj/item/trash/cheesie,/obj/item/trash/candy,/obj/item/trash/chips,/obj/item/trash/pistachios,/obj/item/trash/plate,/obj/item/trash/popcorn,/obj/item/trash/raisins,/obj/item/trash/sosjerky,/obj/item/trash/syndi_cakes); - name = "maint grille or trash spawner" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 2 - }, -/obj/structure/cable/yellow{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/effect/decal/warning_stripes/north, -/turf/simulated/floor/plating, /area/maintenance/aft{ name = "Aft Maintenance" }) @@ -87426,25 +87181,6 @@ icon_state = "whiteblue" }, /area/medical/medbay3) -"cSw" = ( -/obj/machinery/optable{ - name = "Robotics Operating Table" - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/obj/machinery/camera{ - c_tag = "Robotics - Aft"; - dir = 1; - network = list("SS13","RD") - }, -/obj/item/tank/anesthetic, -/obj/item/clothing/mask/breath/medical, -/turf/simulated/floor/plasteel{ - dir = 1; - icon_state = "whitehall" - }, -/area/assembly/robotics) "cSx" = ( /obj/structure/table, /obj/item/mmi, @@ -87497,16 +87233,6 @@ icon_state = "dark" }, /area/medical/morgue) -"cSC" = ( -/obj/machinery/door/window/eastright{ - name = "Coroner Office"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cSD" = ( /obj/machinery/atmospherics/unary/tank/air{ dir = 1 @@ -87601,16 +87327,6 @@ icon_state = "grimy" }, /area/chapel/office) -"cSM" = ( -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cSN" = ( /obj/machinery/alarm{ dir = 4; @@ -87935,17 +87651,6 @@ /area/toxins/xenobiology{ name = "\improper Secure Lab" }) -"cTn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/yellow{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cTo" = ( /obj/structure/closet/crate, /obj/item/poster/random_official, @@ -88944,27 +88649,6 @@ icon_state = "dark" }, /area/chapel/office) -"cUU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "Morgue"; - opacity = 1; - req_access_txt = "6" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cUV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -88981,19 +88665,6 @@ icon_state = "whiteblue" }, /area/medical/medbay3) -"cUW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/effect/landmark/start{ - name = "Coroner" - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cUX" = ( /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -89219,18 +88890,6 @@ /area/hallway/secondary/exit{ name = "\improper Departure Lounge" }) -"cVt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4; - level = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cVu" = ( /obj/structure/disposalpipe/segment{ dir = 2; @@ -89329,18 +88988,6 @@ /area/hallway/secondary/exit{ name = "\improper Departure Lounge" }) -"cVE" = ( -/obj/machinery/atmospherics/unary/vent_pump{ - dir = 8; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cVF" = ( /obj/structure/sign/biohazard, /turf/simulated/wall/r_wall, @@ -89405,14 +89052,6 @@ /area/medical/research{ name = "Research Division" }) -"cVK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/hallway/primary/aft) "cVL" = ( /obj/structure/closet/coffin, /obj/machinery/light/small{ @@ -89658,20 +89297,6 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) -"cWk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "Morgue"; - opacity = 1; - req_access_txt = "6" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cWl" = ( /obj/structure/cable/yellow{ d1 = 1; @@ -90254,13 +89879,6 @@ icon_state = "dark" }, /area/chapel/main) -"cXl" = ( -/obj/machinery/iv_drip, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whiteblue" - }, -/area/medical/medbay3) "cXm" = ( /obj/item/flashlight/lantern{ pixel_y = 7 @@ -90430,16 +90048,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cXy" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/iv_bag, -/obj/item/reagent_containers/iv_bag, -/obj/item/reagent_containers/iv_bag, -/turf/simulated/floor/plasteel{ - dir = 2; - icon_state = "whiteblue" - }, -/area/medical/medbay3) "cXz" = ( /obj/machinery/smartfridge/secure/extract, /turf/simulated/floor/plasteel{ @@ -90901,26 +90509,6 @@ /area/maintenance/aft{ name = "Aft Maintenance" }) -"cYn" = ( -/obj/machinery/optable, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) -"cYo" = ( -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_y = 8 - }, -/obj/item/camera{ - name = "Autopsy Camera"; - pixel_x = -2; - pixel_y = -2 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cYp" = ( /obj/machinery/atmospherics/unary/vent_pump{ dir = 4; @@ -91018,15 +90606,6 @@ /area/crew_quarters/fitness{ name = "\improper Recreation Area" }) -"cYy" = ( -/obj/machinery/light/small, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cYz" = ( /obj/structure/cable/yellow{ d1 = 2; @@ -91180,19 +90759,6 @@ icon_state = "whitegreen" }, /area/medical/virology) -"cYN" = ( -/obj/structure/morgue{ - tag = "icon-morgue1 (WEST)"; - icon_state = "morgue1"; - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "cYO" = ( /turf/simulated/floor/plasteel{ dir = 1; @@ -91680,7 +91246,7 @@ dir = 4 }, /obj/structure/disposaloutlet, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -91688,7 +91254,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -91768,11 +91334,6 @@ }, /turf/simulated/floor/wood, /area/medical/psych) -"cZP" = ( -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "cZQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -92117,7 +91678,7 @@ /obj/structure/disposaloutlet{ dir = 1 }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -92841,7 +92402,7 @@ dir = 2; icon_state = "pipe-c" }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -92994,7 +92555,7 @@ /area/chapel/main) "dbM" = ( /obj/structure/disposalpipe/segment, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -93179,7 +92740,7 @@ dir = 1; icon_state = "pipe-c" }, -/turf/simulated/floor/plasteel, +/turf/simulated/floor/engine, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -93621,15 +93182,6 @@ "dcH" = ( /obj/structure/disposalpipe/segment, /turf/simulated/floor/plating, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"dcI" = ( -/obj/machinery/shieldwallgen{ - req_access = list(55) - }, -/obj/structure/cable/yellow, -/turf/simulated/floor/plating, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -93650,17 +93202,6 @@ /obj/effect/decal/warning_stripes/west, /turf/simulated/floor/plasteel, /area/medical/cryo) -"dcL" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 2; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "dcM" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -93773,20 +93314,6 @@ name = "HIGH VOLTAGE" }, /turf/simulated/wall/r_wall, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"dcY" = ( -/obj/machinery/atmospherics/pipe/simple/visible, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"dcZ" = ( -/obj/structure/disposaloutlet{ - dir = 2 - }, -/turf/simulated/floor/plasteel, /area/toxins/xenobiology{ name = "\improper Secure Lab" }) @@ -93835,16 +93362,6 @@ icon_state = "floorgrime" }, /area/shuttle/escape) -"ddh" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal{ - amount = 10 - }, -/obj/item/radio/electropack, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ddi" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -93903,44 +93420,6 @@ icon_state = "floorgrime" }, /area/shuttle/escape) -"ddr" = ( -/obj/machinery/sparker{ - id = "Xenobio"; - pixel_x = -25 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"dds" = ( -/obj/machinery/atmospherics/unary/outlet_injector/on{ - dir = 1 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"ddt" = ( -/obj/item/radio/beacon, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"ddu" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/item/multitool, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ddv" = ( /obj/docking_port/stationary{ dir = 2; @@ -93975,55 +93454,6 @@ dir = 2 }, /area/shuttle/escape) -"ddz" = ( -/obj/effect/decal/remains/xeno, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"ddA" = ( -/obj/machinery/light{ - dir = 2 - }, -/obj/machinery/camera{ - c_tag = "Secure Lab - Test Chamber"; - dir = 1; - network = list("SS13","RD") - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"ddB" = ( -/obj/item/radio/intercom{ - pixel_y = -25 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) -"ddC" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 5; - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -1 - }, -/turf/simulated/floor/plasteel, -/area/toxins/xenobiology{ - name = "\improper Secure Lab" - }) "ddD" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -94308,14 +93738,6 @@ icon_state = "barber" }, /area/civilian/barber) -"dee" = ( -/obj/structure/table, -/obj/machinery/computer/med_data/laptop, -/obj/machinery/atmospherics/unary/vent_pump, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "def" = ( /obj/structure/sign/redcross{ desc = "The Star of Life, a symbol of Medical Aid."; @@ -95198,14 +94620,6 @@ icon_state = "floorgrime" }, /area/shuttle/escape) -"dfF" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/medical/morgue) "dfG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ @@ -95276,19 +94690,6 @@ dir = 5 }, /area/engine/mechanic_workshop) -"dfL" = ( -/obj/machinery/atmospherics/unary/vent_scrubber{ - dir = 1; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/obj/machinery/alarm{ - dir = 1; - pixel_y = -22 - }, -/turf/simulated/floor/engine, -/area/engine/mechanic_workshop) "dfM" = ( /obj/structure/reagent_dispensers/watertank, /turf/simulated/shuttle/plating{ @@ -95833,10 +95234,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/starboard) -"dgF" = ( -/obj/structure/reagent_dispensers/oil, -/turf/simulated/floor/plasteel, -/area/assembly/robotics) "dgG" = ( /obj/structure/rack, /obj/item/stack/sheet/cardboard, @@ -95954,22 +95351,6 @@ /area/toxins/server{ name = "\improper Research Division Server Room" }) -"dgV" = ( -/obj/structure/rack, -/obj/item/tank/emergency_oxygen/double, -/obj/item/tank/jetpack/oxygen/captain, -/obj/item/clothing/suit/space/captain, -/obj/item/clothing/mask/gas, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/item/crowbar/red, -/obj/item/clothing/head/helmet/space/capspace, -/turf/simulated/floor/wood, -/area/crew_quarters/captain{ - name = "\improper Captain's Quarters" - }) "dgW" = ( /obj/machinery/computer/camera_advanced/xenobio, /turf/simulated/floor/plasteel{ @@ -96161,13 +95542,6 @@ }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plating, -/area/maintenance/aft{ - name = "Aft Maintenance" - }) -"dhs" = ( -/obj/item/cigbutt, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, /area/maintenance/aft{ name = "Aft Maintenance" }) @@ -96472,6 +95846,12 @@ }, /turf/space, /area/space/nearstation) +"kNJ" = ( +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "kSC" = ( /obj/machinery/atmospherics/unary/portables_connector{ dir = 4 @@ -96537,6 +95917,12 @@ /obj/effect/spawner/airlock/s_to_n, /turf/simulated/wall, /area/maintenance/starboard) +"ptc" = ( +/turf/simulated/floor/plasteel{ + dir = 2; + icon_state = "whiteblue" + }, +/area/medical/paramedic) "pMx" = ( /obj/effect/spawner/airlock/w_to_e, /turf/simulated/wall, @@ -96676,10 +96062,6 @@ /area/construction/hallway{ name = "\improper MiniSat Exterior" }) -"sJs" = ( -/obj/effect/spawner/window/reinforced, -/turf/space, -/area/engine/engineering) "sRB" = ( /obj/machinery/atmospherics/pipe/simple/visible{ dir = 10 @@ -96716,6 +96098,22 @@ }, /turf/simulated/shuttle/floor4/vox, /area/shuttle/vox) +"umT" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/iv_bag, +/obj/item/reagent_containers/iv_bag, +/obj/item/reagent_containers/iv_bag, +/obj/machinery/light{ + dir = 1; + on = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 5; + icon_state = "whiteblue" + }, +/area/medical/medbay2{ + name = "Medbay Storage" + }) "uJn" = ( /obj/effect/spawner/airlock/w_to_e, /turf/simulated/wall/r_wall, @@ -96751,6 +96149,16 @@ /obj/structure/cable, /turf/simulated/floor/plating, /area/maintenance/starboardsolar) +"wyX" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel{ + tag = "icon-cafeteria (NORTHEAST)"; + icon_state = "cafeteria"; + dir = 5 + }, +/area/medical/research{ + name = "Research Division" + }) "wJQ" = ( /obj/effect/decal/warning_stripes/north, /obj/machinery/atmospherics/pipe/simple/visible{ @@ -105886,7 +105294,7 @@ aaa aSq aTN aTN -bkj +aWG ayC aWD aUN @@ -105908,9 +105316,9 @@ aUN aUN aUN aaa -bGW +bls bKr -bMv +blw aaa aUN aUN @@ -106164,11 +105572,11 @@ aUN bBr bcy aUN -bGW +bls bIG bKs bMw -bMv +blw aUN bRz bcy @@ -106400,7 +105808,7 @@ aaa aSs aTN aTN -bly +aZz aYg aZj baJ @@ -111551,7 +110959,7 @@ bgX bix bkn cfg -blk +bjP brV brz bto @@ -112065,7 +111473,7 @@ bgX bmS bkp bmb -blk +bjP but brB bto @@ -113122,7 +112530,7 @@ cdJ ceO bZU chq -clQ +bxt bZU cmY bZU @@ -116424,11 +115832,11 @@ aLK aTW aVl aVl -aYn -aYn -baY -bcz -aYn +bfw +bfw +bcD +bbc +bfw bfw bkK biL @@ -116681,11 +116089,11 @@ aSI aTX aXt aWO -aYn +bfw +aUe +baY bbP -baZ -bcA -aYn +bfw bjf bhg biM @@ -116938,11 +116346,11 @@ aWh aTY aVn aWP -aYn -aZy -bba -ceS -aYn +bfw +aWj +baZ +bbT +bfw ceX bhh biN @@ -117195,11 +116603,11 @@ aSK aTZ aVo aWQ +bfw aYn -aZz -bbb -bgD -aYn +bba +bcz +bfw bfw bhi baz @@ -117245,10 +116653,10 @@ cmX cwk cxs csJ -czb +cbJ cBs -cCG -cCb +cmv +bQV csJ cFf cHd @@ -117257,7 +116665,7 @@ cIA cFd cLK cNM -cMa +bSD cLz cTF chy @@ -117452,11 +116860,11 @@ bZa aWt aXB aWR -aYn -bbT -bbc -bcD -aWj +bfw +aZy +bbb +bcA +bfw bjJ bkS blu @@ -117505,7 +116913,7 @@ cys czw cBr cCF -cDy +cpF csJ cDr cHc @@ -117761,8 +117169,8 @@ cxu csJ czg cBu -cCS -cCc +cnS +cpG csJ cFh cHg @@ -118775,7 +118183,7 @@ ccD cdT chU cgf -chL +cgJ cjt cjt cLT @@ -118790,7 +118198,7 @@ cxL czE cNG czE -cDV +cpH cCH cFP cHl @@ -119031,11 +118439,11 @@ bzP ccE cdT cfz -cgf -ckK -clZ -cna -com +cdq +chL +cik +cil +cjA cpD crj csQ @@ -119248,7 +118656,7 @@ avx aPZ aRw aSP -aUe +atJ bmK aWU aYs @@ -119288,10 +118696,10 @@ cby ccF cdT cff -cjw +cdU ckL ciT -ckI +cim cop cdT crm @@ -119545,12 +118953,12 @@ cbz ccG chM chM +cel chM chM -chM -chM -coo -coo +cdT +cdT +cdT coR ctg cnn @@ -119573,7 +118981,7 @@ cKZ cKZ cRE cUp -cXl +cXw dfO cZO cYC @@ -119771,7 +119179,7 @@ aOF bcL bek bfK -blh +bhq bhq bhq bhq @@ -119801,14 +119209,14 @@ cai bek ccI chM -chW -cjy -ckN -cmc +bTe +ceL +cfF chM -clI -cpG -cro +ciX +cjD +cdT +cjS ctB crP cvj @@ -119830,7 +119238,7 @@ cLb cKZ cwj cUp -cXl +ckQ cRU cOU daU @@ -120024,7 +119432,7 @@ aUg aUg aYv aZH -bdV +asL bcM bel bfK @@ -120058,15 +119466,15 @@ caL bek cdl chN +bUq +ceS chV -cjx -ckM -cmb -cnb -coq -cpF -crn -ctA +chM +ciY +clZ +cjT +clL +cjY cnn cjQ cnp @@ -120087,7 +119495,7 @@ cKU cQb cRM cUr -cXw +clf cRU dei daQ @@ -120281,7 +119689,7 @@ aRR aWW aYw bcd -bdV +axg bcN bem bfL @@ -120315,15 +119723,15 @@ caM bek cht chM -cfE +ccb cjz -ckO -cmd +cgr chM -cos -cpH -crt -ctD +cjw +cjO +ckG +ckK +ckN crW cmj cnq @@ -120511,7 +119919,7 @@ aoM apQ ari asq -atI +ajr azc amx auL @@ -120570,17 +119978,17 @@ bYR bZx caM bek -cdA -cdU -cdU -cdU -cdU -cdU -cdU -cdU -cdU -crp -ctC +ccG +ceq +kNJ +cjz +ptc +chM +cjx +cjP +ckI +clL +cjY cnn cjQ cwr @@ -120601,13 +120009,13 @@ cOL cQf cRM cUF -cXy +clg cRU dad daV dbN cRU -cSm +bTc bZU cSR cTK @@ -120816,7 +120224,7 @@ bHv bEx bJh bKQ -bNN +bxq bOS bRv bSi @@ -120827,18 +120235,18 @@ bYZ bZx caM bek -ccG -cdU -chZ -cgr -ckQ -cmf +cdA +chM +cca +cfx +chW +chM +ciY +clZ +cjT +clL cjY -clV -cpJ -crw -ctG -cnn +ckt cvj cui cpZ @@ -121002,7 +120410,7 @@ aaa acu acH acH -acY +abK adv adV aew @@ -121085,16 +120493,16 @@ bMS caD bek ccG -cdU -cfF -cjA -ckP -cme -cnc -cot -cpI -cru -ctF +chM +cck +cgI +chZ +chM +umT +cjR +cdT +ckM +ckO cnn cvj csX @@ -121114,7 +120522,7 @@ cIm cIm cIm cIm -cUU +bSY cIm cRU cRU @@ -121342,14 +120750,14 @@ bMS cam ben ccK -cdU -cdU -cjD -cjD -cdU -cnf -cnf -cdU +chM +chM +chM +chM +chM +cjy +cjy +cdT cpx ctI csx @@ -121364,15 +120772,15 @@ cBw cCN cGc cDZ -cJS +clh cGf cBv -cMe -cPk -dcL +bTa +clI +cmc cSB cVb -cYo +cnE cIm cNR cOM @@ -121516,7 +120924,7 @@ aaa acw acH acH -adg +acY djL adW abB @@ -121623,13 +121031,13 @@ cGb cIf cJh cKn -cLf +bRn cMd -cOY +clQ cMd cMd -cUW -cYn +cnc +cpJ cIm cmV bZU @@ -121881,12 +121289,12 @@ cIh cHs cGh cDg -cKg -cPl -dee -cSC +bRt +cIo +cIo +cmu cVm -dfF +col cIm cmV bZU @@ -122106,7 +121514,7 @@ bPo bRY bTj bVP -bWl +bPS bWE bZw bZA @@ -122138,9 +121546,9 @@ cIg cDg cDg cBv -cMf -cIn -cIn +bSE +clV +cmd cIo cVl cIn @@ -122319,7 +121727,7 @@ axK aNI aAd aBi -atJ +akD akD akD amx @@ -122381,7 +121789,7 @@ cpN crB ctM cuT -cvN +bHV coo cxH cyI @@ -122395,9 +121803,9 @@ dhy cHR cKo czC -cIo -cIo -cIo +cIn +cIn +cIn cSP cVu cYI @@ -122652,12 +122060,12 @@ dhx dhB cGj czC -cMw -cPu -cQA -cSM -cVt -cYy +bSX +bRr +cIo +cmw +cnf +com cIm cje bZU @@ -122909,12 +122317,12 @@ dhA dhD cGk czC -cIn -cPw -cQC -cTn -cVE -cYN +cQA +cmb +cme +cna +cnC +coq cIm cmY bZU @@ -123166,12 +122574,12 @@ dhz dhB cGl czC -cML -cPv -cQB -cMv -cVv -cNE +bTb +cIn +cIn +cmw +cnD +cos cIm cmY bZU @@ -123386,8 +122794,8 @@ bFL bkW bJp bKZ +bxo bNb -bOI bQo bSb bSa @@ -123423,12 +122831,12 @@ cDu cEh cIC czC -cIm -cIm -cIm -cIm -cWk -cIm +cIo +cPv +cmf +cnb +cVv +cot cIm cQi bZU @@ -123644,7 +123052,7 @@ bET bJn bLa bvl -bPs +bNf bQo bSa bSa @@ -123680,13 +123088,13 @@ cIl cbY czC czC -cMS -cIs -cJg -cMS -cVK -cMg -bZU +cIm +cIm +cIm +cIm +bSZ +cIm +cIm cNV czI bZU @@ -123901,7 +123309,7 @@ bGk bJn bLb bMZ -bPB +bOI bQp bSc bTL @@ -124716,7 +124124,7 @@ cIx cIx cIx cIx -cOQ +coG cIx cIx cRC @@ -124928,7 +124336,7 @@ bFR bkW bJs bLe -bNf +bxp bON bQt bSf @@ -124945,7 +124353,7 @@ cOm cgz cic cic -ckW +bXF cmo coH cqe @@ -124972,7 +124380,7 @@ cTw cIx cNQ cNf -cOd +bQa cOR cPQ cIx @@ -125149,7 +124557,7 @@ aBq aCL aDT aHN -aGz +apP aHQ aJn aKK @@ -125186,7 +124594,7 @@ bkW bJt bLf bCD -bPS +bPs bQs bSe bTN @@ -125231,7 +124639,7 @@ cOa cOa cQk cOS -cSw +cpR cIx cmY bZU @@ -125443,7 +124851,7 @@ bkW bMm bLg bNd -bQa +bPB bQu bSg bTO @@ -125771,8 +125179,8 @@ cVG cVG cVG cZG -cZP -cZP +bMu +bMu cVG cVG cVG @@ -125920,7 +125328,7 @@ aBt azz aDV aFo -azz +anx aHT aJq aOi @@ -125998,7 +125406,7 @@ cIx cJn cMj cLo -dgF +cLo cLo cQv cOX @@ -126020,16 +125428,16 @@ cnU cYK cZr cZG -cZP +bMu aOE cZr cZG -cZP +bMu aOE cZr cZH -cZP -cZP +bMu +bMu cVG dcs cVG @@ -126277,16 +125685,16 @@ cYp cnW cZr cZH -cZP -cZP +bMu +bMu cZr cZH -cZP -cZP +bMu +bMu cZr cZH -cZP -cZP +bMu +bMu cVG dct dcH @@ -126534,12 +125942,12 @@ cYq dcq cZr cZH -cZP -cZP +bMu +bMu cZr cZH -cZP -cZP +bMu +bMu cZr csB csF @@ -126743,7 +126151,7 @@ cei cOm cgG cii -cjO +bUy cld cks cmR @@ -126803,11 +126211,11 @@ dcx dcz dcB ddS -dcI +bGU cVG -cZP -ddr -ddz +bMu +bNH +bPk cVG ddK cVG @@ -126999,13 +126407,13 @@ ccR bZu cfw cgu -cii -cjP +bUx +bUz clc clm cnA -cqm -cql +bVj +bVC cti csZ cum @@ -127060,11 +126468,11 @@ dab dbS dcj dgB -ctd +bGW dcX -cZP -cZP -cZP +bMu +bMu +bMu cVG ddK cVG @@ -127254,16 +126662,16 @@ caM bek ccQ bbg -cfx -cfx -cel -ceL -cfx -cfx -cnC -cpR -cqy -cth +bZU +bZU +bZU +cyl +bZU +bZU +crU +bVk +cqB +crO cfw cun cvx @@ -127317,11 +126725,11 @@ dab dbT dci ddU -csR -dcY -dcY -dds -cZP +bHo +bMs +bMs +bNZ +bMu cVG ddL cNz @@ -127511,16 +126919,16 @@ caM bek ccQ bbi -cfx -cgI -cik -cjR -clf -cmu -cnD -cqd -cqB -crO +bZU +cfE +bVZ +bXC +bXE +bXG +crU +cmz +cmz +cmz cfw cuo cvy @@ -127574,11 +126982,11 @@ dbJ dbU dez dej -ctN -cZP -cZP -cZP -ddA +bMo +bMu +bMu +bMu +bPl cVG ddM ddN @@ -127692,7 +127100,7 @@ abq abq aaa agC -agZ +adg aib aja ajY @@ -127768,15 +127176,15 @@ caM bek ccQ bbi -cfx -cgJ -cil -cjS -clg -cmv -cnC -cmz -cmz +bZU +bVI +ckP +bXD +chy +bYq +bWl +bVl +bVG cmz cmz cup @@ -127831,11 +127239,11 @@ dab dbV cYR ddX -ctk -dcZ -cZP -ddt -cZP +bMp +bMv +bMu +bOc +bMu cVG dcD cNz @@ -127950,7 +127358,7 @@ abq aaa agC agC -ahH +agE aiA anJ ajz @@ -128025,15 +127433,15 @@ cbj bek ccS cej -cfx -ckG -cim -ciX -clh -cmw -cfx -cdN -cqo +bZU +bVX +bWa +chy +chy +bYQ +bZU +chy +chy crS cta cic @@ -128088,11 +127496,11 @@ dab dbW deB det -ctU +bMq dcX -cZP -cZP -ddB +bMu +bMu +bPI cVG dcD cVG @@ -128256,7 +127664,7 @@ bhw bnE ble bna -dgV +aWE bqs boI bui @@ -128282,14 +127690,14 @@ caB cbI cdE bZu -cfx -cfx -cfx -cfx -cfx -cfx -cfx -cjn +bZU +bZU +bWl +bUR +bWl +bWl +bZU +chy cqp crU cmz @@ -128297,9 +127705,9 @@ cvX cvB cwQ bYI -cza +bNN czR -cEf +bQW cBS cDK cxU @@ -128345,11 +127753,11 @@ dcy dcA ddR des -dcI +bGU cVG -ddh -ddu -ddC +bNG +bPj +bPK cVG dcD cVG @@ -128544,9 +127952,9 @@ dhd cin cjU dhq -coG -cnE -cqA +cBk +cOM +bVr cqq ctj ctb @@ -128589,12 +127997,12 @@ cXW cYu cYU cZr -cZP -cZP +bMu +bMu cZH cZr -cZP -cZP +bMu +bMu cZH cZr csD @@ -128801,8 +128209,8 @@ bZu bZu bZu clj -dhs -bZU +bZO +cqo crv csn ctE @@ -128846,12 +128254,12 @@ cXX cYv cYV cZr -cZP -cZP +bMu +bMu cZH cZr -cZP -cZP +bMu +bMu cZH cZr dbD @@ -128977,9 +128385,9 @@ abq aid adF adH -agE +adZ ahl -ajs +agZ afr akC akO @@ -129103,16 +128511,16 @@ cnT cnV cpe cZr -cZP -cZP +bMu +bMu dav cZr aOE -cZP +bMu dav cZr -cZP -cZP +bMu +bMu cZH cVG dcE @@ -129368,8 +128776,8 @@ cVG cVG cVG cVG -cZP -cZP +bMu +bMu dav cVG cVG @@ -129575,7 +128983,7 @@ clj cmz cnG coS -cqt +wyX crY ctc cuu @@ -129831,10 +129239,10 @@ bZv clj cmz cny -coT -cqu +cqt +cqt crZ -bQv +cOm cuv cvG cwU @@ -130089,7 +129497,7 @@ cmZ cmA cnI coU -cqD +cqt csa cfw cic @@ -130794,7 +130202,7 @@ aok avv akh aBr -aKM +aok aKM bAC aok @@ -132346,8 +131754,8 @@ avr aEm aFG aGO -aIm -aJE +aIp +aJF aLf aMv aNP @@ -132673,7 +132081,7 @@ chy bZU bZU bZU -cFI +bGQ cHS cJu cBN @@ -132860,10 +132268,10 @@ aCW aEo aFI aGQ -aIo aJF +aJE aLf -aMw +aMy aNQ aUf aQM @@ -133117,10 +132525,10 @@ aCX aEp aFJ aGR -aIp +aJG aJG aLh -aMx +aLm aNQ aPq aQN @@ -133372,12 +132780,12 @@ aAH aye aCY aEq -aIc +aGz aGS -aye +aJE +aJE aJH -aLi -aMy +aMw aNQ aPh aQN @@ -133624,20 +133032,20 @@ auP avv avv ayf -azl +avv avv aBP -azl +avv aEr avv -azl -aIq +aGU +avv +aIr +aJK avv -aLj -azl aNQ aPI -aQN +blh aSB aQX aSB @@ -133881,17 +133289,17 @@ auH avv axP ayg -azm +avv aBF aBQ -azm +avv aED avv -aIT -aIr +aGV +aIq avv -aLk -aQi +aLi +aMC aNQ aPz aQO @@ -133920,9 +133328,9 @@ bZJ aoG bEC bGn -bHV -bJO bLI +bJO +bTd bIN bPe bEG @@ -134144,11 +133552,11 @@ aBR avv aEu avv -aGU +aIc aIs avv -aLl -aMA +aLk +aMx aNQ aPi aQP @@ -134377,9 +133785,9 @@ aaa abq aaa afb -ajr +ahH agh -ajS +ajs afb ajb ajp @@ -134401,11 +133809,11 @@ aBS avv aEu avv -ayp +aIm aIt avv -aLm -aMB +aLj +aMA aNQ aPj aQQ @@ -134441,8 +133849,8 @@ bJN bPg bEG bTP +bUg bUm -bVC bXq bEG caI @@ -134658,11 +134066,11 @@ avv avv aEv avv +aIo +aIT avv -avv -avv -avv -avv +aLl +aMB aNQ aNQ aNQ @@ -134915,18 +134323,18 @@ aBT aoG aBW aoG -aGV -asJ -aub -asJ -aMC +aoG +aoG +aoG +aoG +aoG buC aPk awv -aSf +aQi asI aUI -asJ +aSf aZB aoG azy @@ -135467,11 +134875,11 @@ aoG aoG aoG axh -bQV -bQV -bQV -bQV -bQV +axh +axh +axh +brg +axh aoG aoG aoG @@ -135701,7 +135109,7 @@ aYE aZI aYV bam -bfr +bdE bdy beI bgu @@ -135722,13 +135130,13 @@ bGr bHZ bJQ bLO -bNG -bPj -bQW -bSD -bVr -bVG -bQV +bkj +bFh +axh +bxs +bnR +brR +axh bYG bVL aoG @@ -135942,7 +135350,7 @@ ayo aBX asJ axh -aGX +ajS aHa aIA aJL @@ -135963,7 +135371,7 @@ bdz beJ bgv bhS -bnL +aGX bam bnr bpf @@ -135979,13 +135387,13 @@ bGs bGs bJR bLP -bNH -bPk +bkU bTK -bSE +axh +bmG +bnS bUp -bVH -bQV +axh bUr bZH aoG @@ -136237,12 +135645,12 @@ bIa byU bLQ bNI -bPl -bQV -bUg -bUq -bVG -bQV +bGR +axh +bnL +bnU +bFl +axh asJ bZI aoG @@ -136456,7 +135864,7 @@ aoG aBW aDa axh -aIu +akP aHg aIx aJM @@ -136481,9 +135889,9 @@ bob bam bnt bnt -bls +bjL bbf -bqN +bjM bnt bnt bAJ @@ -136496,10 +135904,10 @@ bNK bNJ bPm bCM -bQV -bQV -bQV -bQV +axh +bqN +axh +axh asJ asJ aoG @@ -137531,7 +136939,7 @@ bXt asJ arr bCM -cca +biJ cdt ceF cfT @@ -137788,7 +137196,7 @@ bCM bCM bCM bCM -ccb +bjK cdu ceG cfN @@ -138026,7 +137434,7 @@ bpi bqS bsC bqS -bxa +bxm bjN bAO bCM @@ -138043,8 +137451,8 @@ bSJ bVN bVN bCM -cBH -cBH +bhY +bhY cDi cdv ceH @@ -138261,7 +137669,7 @@ aIF aJZ aCg aCg -aPL +alQ aCg aPL aCg @@ -138272,18 +137680,18 @@ ccH baA bat aFR -bdE -bdE -bdE -bdE -bdE -bdE -brR +aFR +aFR +aFR +aFR +aFR +aFR +aWw bpi bqS bsC bqS -bxb +bxn bjN bjN bCM @@ -138527,14 +137935,14 @@ aVi aZd ccH aQU +aqe +aqv +aFR +ayE +aAO +aHw baE -bck -bdE -biz -bjO -bhY -bjK -bkU +bhZ bnB dfz bqT @@ -138786,12 +138194,12 @@ bao bbC bcG bcp -bdE -biJ +aFR +azv +aAW +aIu +bck bgE -bhZ -bjL -blw bnC dfB dgM @@ -138812,10 +138220,10 @@ bRb bSM bCN bWU -bYq +bgL bWU bCN -cdq +biz ccf bGG bPw @@ -139043,17 +138451,17 @@ aZO baB bcC bft -bdE -biA -bjP -bmG -bjM -bkV +aFR +azJ +aHl +bfr +bjO +bhZ bnD dfA dgL bvt -bvk +blk bqU bCu bFE @@ -139300,17 +138708,17 @@ aLE aHi aCg aEn -bdE -bdE -bdE -bdE -bdE -bdE +aFR +aFR +aFR +aFR +aFR +aFR bli blj dgO bjN -bwv +bAP bAP bnt bAS @@ -139329,7 +138737,7 @@ bXJ bXJ bZG bCN -cbJ +biA ccf bGG bPw @@ -139567,7 +138975,7 @@ dfm bsZ dgN bnt -bwr +bxf bxf bnt bCL @@ -139824,7 +139232,7 @@ dft dfI dgP bvu -bwF +bly bxg byZ bAU @@ -140081,7 +139489,7 @@ dfq bta anq bsG -bwy +bza bxh bza bAV @@ -140338,7 +139746,7 @@ dfx dfK anq bvv -bwM +bvk bAt bCw bCY @@ -140595,7 +140003,7 @@ dfu dfJ anq bsI -bwL +bwr aWC bzc bAX @@ -140852,7 +140260,7 @@ dfy btc anq bsJ -bwU +bwv aaa aaa bsJ @@ -141106,10 +140514,10 @@ aCg asX dfk deZ -dfL +bkV anq bsJ -bwU +bwv aaa bqY bAY @@ -141366,7 +140774,7 @@ aoN dgK anq bsK -bwX +bwy bxj bzd bAZ @@ -141623,7 +141031,7 @@ dfl azD anq bsL -bwW +bwF bsN aaa abq @@ -141880,7 +141288,7 @@ abq abq anq abq -bwY +bwL abq abq abq @@ -142131,13 +141539,13 @@ aCg aCg kWU rzO -sJs +aDL aaa aaa aaa abq aaa -bwY +bwL aaa aaa abq @@ -142357,9 +141765,9 @@ aaa aaa aaa aoG -aWE +ajA bnG -aWG +atI axh azf dAH @@ -142394,7 +141802,7 @@ aaa aaa abq aaa -bwY +bwL aaa aaa abq @@ -142651,7 +142059,7 @@ aaa aaa abq abq -bxi +bwM abq abq abq @@ -142908,7 +142316,7 @@ fnC abq abq aaa -bxl +bwU aaa abq aaa @@ -143165,7 +142573,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq abq @@ -143422,7 +142830,7 @@ fBB fBB abq aaa -bwY +bwL aaa abq aaa @@ -143679,7 +143087,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq abq @@ -143936,7 +143344,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -144193,7 +143601,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq abq @@ -144450,7 +143858,7 @@ aaa aaa abq abq -bxi +bwM abq abq aaa @@ -144707,7 +144115,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq abq @@ -144964,7 +144372,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -145221,7 +144629,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -145478,7 +144886,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -145735,7 +145143,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -145992,7 +145400,7 @@ aaa aaa abq aaa -bwY +bwL aaa abq aaa @@ -146249,7 +145657,7 @@ aaa aaa abq abq -bxi +bwM abq abq aaa @@ -146506,7 +145914,7 @@ aaa abq abq aaa -bwY +bwL aaa abq abq @@ -146763,7 +146171,7 @@ abq bpr aaa aaa -bxl +bwU aaa aaa bpr @@ -147020,7 +146428,7 @@ aaa aaa abq buL -bxm +bwW bxk aaa aaa @@ -147277,7 +146685,7 @@ aaa aaa bsP bud -bxn +bwX bzt bxk aaa @@ -147534,7 +146942,7 @@ aaa aaa bsR buM -bxo +bwY bsL bBa aaa @@ -147791,7 +147199,7 @@ aef abq bsQ abq -bxo +bwY abq bFk abq @@ -148048,7 +147456,7 @@ blE eSt bsS buO -bxq +bxa bBb bGN aaa @@ -148305,7 +147713,7 @@ blE bsd brd buN -bxp +bxb bzu bGM aaa @@ -148562,7 +147970,7 @@ bnK boo cKI buQ -bxt +bxi bBd cKI abd @@ -148819,7 +148227,7 @@ blE sjF kBq buP -bxs +bxl bBc bse aXH diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index fe4c3a6e2e3..79367d5c073 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -1312,7 +1312,7 @@ }, /area/vox_station) "dA" = ( -/obj/vox/win_button, +/obj/machinery/vox_win_button, /turf/unsimulated/floor{ tag = "icon-light_on"; icon_state = "light_on" diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 987c1ee28b4..4950ddf2763 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -109,7 +109,7 @@ }, /area/holodeck/source_wildlife) "ay" = ( -/obj/vox/win_button, +/obj/machinery/vox_win_button, /turf/unsimulated/floor/vox{ icon_state = "light_on" }, diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index e8550626530..6198ecc530f 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -8,7 +8,6 @@ Pipelines and other atmospheric objects combine to form pipe_networks Pipes -> Pipelines Pipelines + Other Objects -> Pipe network */ -GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics anchored = 1 layer = GAS_PIPE_HIDDEN_LAYER //under wires @@ -51,6 +50,8 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics/proc/atmos_init() if(can_unwrench) stored = new(src, make_from = src) + // Updates all pipe overlays and underlays + update_underlays() /obj/machinery/atmospherics/Destroy() QDEL_NULL(stored) @@ -80,14 +81,11 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) pipe_image = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) //the 20 puts it above Byond's darkness (not its opacity view) pipe_image.plane = HUD_PLANE -/obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) - if(!istype(GLOB.pipe_icon_manager)) - if(!safety) //to prevent infinite loops - GLOB.pipe_icon_manager = new() - check_icon_cache(1) - return 0 +/obj/machinery/atmospherics/proc/check_icon_cache() + if(!istype(SSair.icon_manager)) + return FALSE - return 1 + return TRUE /obj/machinery/atmospherics/proc/color_cache_name(var/obj/machinery/atmospherics/node) //Don't use this for standard pipes @@ -99,14 +97,14 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) if(node) if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) - //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) + //underlays += SSair.icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else - //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + //underlays += SSair.icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - //underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) + //underlays += SSair.icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "exposed" + icon_connect_type) /obj/machinery/atmospherics/proc/update_underlays() if(check_icon_cache()) @@ -343,11 +341,11 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new()) /obj/machinery/atmospherics/proc/add_underlay_adapter(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) //modified from add_underlay, does not make exposed underlays if(node) if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "down" + icon_connect_type) else - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "intact" + icon_connect_type) else - underlays += GLOB.pipe_icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) + underlays += SSair.icon_manager.get_atmos_icon("underlay", direction, color_cache_name(node), "retracted" + icon_connect_type) /obj/machinery/atmospherics/singularity_pull(S, current_size) if(current_size >= STAGE_FIVE) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 80e5133ebe9..11e9897136f 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -93,7 +93,7 @@ else vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" - overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , vent_icon) + overlays += SSair.icon_manager.get_atmos_icon("device", , , vent_icon) /obj/machinery/atmospherics/binary/dp_vent_pump/update_underlays() if(..()) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm old mode 100755 new mode 100644 index 4c8d4bd1cbe..9fd4e00f299 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -20,7 +20,7 @@ /// The amount of pressure the filter wants to operate at. var/target_pressure = ONE_ATMOSPHERE /// The type of gas we want to filter. Valid values that go here are from the `FILTER` defines at the top of the file. - var/filter_type = FILTER_NOTHING + var/filter_type = FILTER_TOXINS /// A list of available filter options. Used with `tgui_data`. var/list/filter_list = list( "Nothing" = FILTER_NOTHING, diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 5735854d72d..0b603c482d4 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -102,7 +102,7 @@ else vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" - overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , vent_icon) + overlays += SSair.icon_manager.get_atmos_icon("device", , , vent_icon) update_pipe_image() diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 71157b393fd..b11efce27a9 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -117,7 +117,7 @@ if(welded) scrubber_icon = "scrubberweld" - overlays += GLOB.pipe_icon_manager.get_atmos_icon("device", , , scrubber_icon) + overlays += SSair.icon_manager.get_atmos_icon("device", , , scrubber_icon) update_pipe_image() /obj/machinery/atmospherics/unary/vent_scrubber/update_underlays() diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm index 15b53d83e9c..bc85edb7c44 100644 --- a/code/ATMOSPHERICS/pipes/cap.dm +++ b/code/ATMOSPHERICS/pipes/cap.dm @@ -55,14 +55,14 @@ /obj/machinery/atmospherics/pipe/cap/update_icon(var/safety = 0) ..() - + if(!check_icon_cache()) return alpha = 255 overlays.Cut() - overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type) /obj/machinery/atmospherics/pipe/cap/atmos_init() ..() diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 2eef5ad74c4..6c90bfd4fbd 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -123,8 +123,8 @@ alpha = 255 overlays.Cut() - overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) - overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type) underlays.Cut() var/turf/T = get_turf(src) diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 2b384b3684b..688f9564ac8 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -96,8 +96,8 @@ alpha = 255 overlays.Cut() - overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) - overlays += GLOB.pipe_icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type) underlays.Cut() var/turf/T = get_turf(src) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index 7e304170e54..3874e01c742 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -147,9 +147,9 @@ overlays.Cut() if(node1 && node2) - overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "intact" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "intact" + icon_connect_type) else - overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "exposed[node1?1:0][node2?1:0]" + icon_connect_type) + overlays += SSair.icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "exposed[node1?1:0][node2?1:0]" + icon_connect_type) // A check to make sure both nodes exist - self-delete if they aren't present /obj/machinery/atmospherics/pipe/simple/check_nodes_exist() diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm index e0bd78bc2de..0df4cd3fc64 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm @@ -29,14 +29,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) ..() - + if(!check_icon_cache()) return alpha = 255 overlays.Cut() - overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + overlays += SSair.icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() if(node1) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm index 410c992c74c..c2708be19eb 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm @@ -40,14 +40,14 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(var/safety = 0) ..() - + if(!check_icon_cache()) return alpha = 255 overlays.Cut() - overlays += GLOB.pipe_icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") + overlays += SSair.icon_manager.get_atmos_icon("pipe", , pipe_color, "universal") underlays.Cut() if(node1) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e04a95bcae2..4f9f1ae4408 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -429,10 +429,6 @@ // Filters #define FILTER_AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, color="#04080FAA") -#define FILTER_EYE_BLUR filter(type="blur", size=0) - -#define AMBIENT_OCCLUSION_FILTER_KEY "ambient occlusion" -#define EYE_BLUR_FILTER_KEY "eye blur" //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index cbc691e3c2a..faf94d8c177 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -72,8 +72,6 @@ to_chat(world, "pAI software module [P.name] has the same key as [O.name]!") continue GLOB.pai_software_by_key[P.id] = P - if(P.default) - GLOB.default_pai_software[P.id] = P // Setup loadout gear for(var/geartype in subtypesof(/datum/gear)) diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 3a0c58bffb3..d065f5fa7bc 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -55,6 +55,4 @@ GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) -GLOBAL_LIST(station_level_space_turfs) - #define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index f6c8880a485..9d00f216eac 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -99,6 +99,11 @@ /obj/screen/fullscreen/impaired icon_state = "impairedoverlay" +/obj/screen/fullscreen/blurry + icon = 'icons/mob/screen_gen.dmi' + screen_loc = "WEST,SOUTH to EAST,NORTH" + icon_state = "blurry" + /obj/screen/fullscreen/flash icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index e5cd410a27b..d372da7c681 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -5,7 +5,6 @@ blend_mode = BLEND_OVERLAY var/show_alpha = 255 var/hide_alpha = 0 - var/current_filters = list() /obj/screen/plane_master/proc/Show(override) alpha = override || show_alpha @@ -13,21 +12,14 @@ /obj/screen/plane_master/proc/Hide(override) alpha = override || hide_alpha -/obj/screen/plane_master/proc/add_filter(key, filter) - if(current_filters[key]) - filters -= current_filters[key] +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) - filters += filter - current_filters[key] = filters[filters.len] //assigning `filter` will not allow it to work later while animating removal +/obj/screen/plane_master/proc/shadow(_size, _border, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) -/obj/screen/plane_master/proc/remove_filter(key) - if(current_filters[key]) - animate(current_filters[key], size=0, time=5) //not all filters have a size param, but this is good enough for the general case - addtimer(CALLBACK(src, .proc/remove_callback, key), 5) - -/obj/screen/plane_master/proc/remove_callback(key) - filters -= current_filters[key] - current_filters -= key +/obj/screen/plane_master/proc/clear_filters() + filters = list() //Why do plane masters need a backdrop sometimes? Read http://www.byond.com/forum/?post=2141928 //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. @@ -46,8 +38,9 @@ blend_mode = BLEND_OVERLAY /obj/screen/plane_master/game_world/backdrop(mob/mymob) + clear_filters() if(istype(mymob) && mymob.client && mymob.client.prefs && (mymob.client.prefs.toggles & PREFTOGGLE_AMBIENT_OCCLUSION)) - add_filter(AMBIENT_OCCLUSION_FILTER_KEY, FILTER_AMBIENT_OCCLUSION) + filters += FILTER_AMBIENT_OCCLUSION /obj/screen/plane_master/lighting name = "lighting plane master" diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 80ce66d13ec..061c057c368 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -39,6 +39,9 @@ SUBSYSTEM_DEF(air) var/list/active_super_conductivity = list() var/list/high_pressure_delta = list() + /// Pipe overlay/underlay icon manager + var/datum/pipe_icon_manager/icon_manager + var/list/currentrun = list() var/currentpart = SSAIR_DEFERREDPIPENETS @@ -66,6 +69,7 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/Initialize(timeofday) setup_overlays() // Assign icons and such for gas-turf-overlays + icon_manager = new() // Sets up icon manager for pipes setup_allturfs() setup_atmos_machinery(GLOB.machines) setup_pipenets(GLOB.machines) diff --git a/code/controllers/subsystem/changelog.dm b/code/controllers/subsystem/changelog.dm index eef8ee6da62..0dc3bec8cd1 100644 --- a/code/controllers/subsystem/changelog.dm +++ b/code/controllers/subsystem/changelog.dm @@ -245,7 +245,7 @@ SUBSYSTEM_DEF(changelog) if(config.wikiurl) if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") return - usr.client.wiki("") // Blank arg is important here + usr.client.wiki() else to_chat(usr, "The Wiki URL is not set in the server configuration. Please inform the server host.") diff --git a/code/datums/action.dm b/code/datums/action.dm index 18c5c4f885e..bca714f9c73 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -16,8 +16,6 @@ var/icon_icon = 'icons/mob/actions/actions.dmi' var/button_icon_state = "default" var/mob/owner - /// Whether to darken the button or not if [/datum/action/proc/IsAvailable] return FALSE. - var/darken_when_unavailable = TRUE /datum/action/New(var/Target) target = Target @@ -99,17 +97,18 @@ // If the action isn't available, darken the button if(!IsAvailable()) - if(!darken_when_unavailable) - return - var/image/img = image('icons/mob/screen_white.dmi', icon_state = "template") - img.alpha = 200 - img.appearance_flags = RESET_COLOR | RESET_ALPHA - img.color = "#000000" - img.plane = FLOAT_PLANE + 1 - button.overlays += img + apply_unavailable_effect() else return TRUE +/datum/action/proc/apply_unavailable_effect() + var/image/img = image('icons/mob/screen_white.dmi', icon_state = "template") + img.alpha = 200 + img.appearance_flags = RESET_COLOR | RESET_ALPHA + img.color = "#000000" + img.plane = FLOAT_PLANE + 1 + button.add_overlay(img) + /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) current_button.cut_overlays() if(icon_icon && button_icon_state) @@ -117,7 +116,7 @@ img.appearance_flags = RESET_COLOR | RESET_ALPHA img.pixel_x = 0 img.pixel_y = 0 - current_button.overlays += img + current_button.add_overlay(img) //Presets for item actions /datum/action/item_action @@ -476,7 +475,6 @@ /datum/action/spell_action check_flags = 0 background_icon_state = "bg_spell" - darken_when_unavailable = FALSE var/recharge_text_color = "#FFFFFF" /datum/action/spell_action/New(Target) @@ -515,26 +513,28 @@ return spell.can_cast(owner) return FALSE -/datum/action/spell_action/UpdateButtonIcon() - if(button && !(. = ..())) - var/obj/effect/proc_holder/spell/S = target - if(!istype(S)) - return - var/progress = S.get_availability_percentage() - var/col_val_high = 72 * progress + 128 - var/col_val_low = 200 * progress - button.maptext = "
[round_down(progress * 100)]%
" - button.color = rgb(col_val_high, col_val_low, col_val_low, col_val_high) - else - button.maptext = null +/datum/action/spell_action/apply_unavailable_effect() + var/obj/effect/proc_holder/spell/S = target + if(!istype(S)) + return ..() + var/progress = S.get_availability_percentage() + if(progress == 1) + return ..() // This means that the spell is charged but unavailable due to something else + + var/alpha = 220 - 140 * progress + + var/image/img = image('icons/mob/screen_white.dmi', icon_state = "template") + img.alpha = alpha + img.appearance_flags = RESET_COLOR | RESET_ALPHA + img.color = "#000000" + img.plane = FLOAT_PLANE + 1 + button.add_overlay(img) + // Make a holder for the charge text + var/image/count_down_holder = image('icons/effects/effects.dmi', icon_state = "nothing") + count_down_holder.plane = FLOAT_PLANE + 1.1 + count_down_holder.maptext = "
[round_down(progress * 100)]%
" + button.add_overlay(count_down_holder) -/datum/action/spell_action/ApplyIcon(obj/screen/movable/action_button/current_button) - current_button.cut_overlays() - if(icon_icon && button_icon_state) - var/image/img = image(icon_icon, current_button, button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - current_button.overlays += img /* /datum/action/spell_action/alien diff --git a/code/datums/cache/air_alarm.dm b/code/datums/cache/air_alarm.dm index fd9e529d70a..91583fb4bdf 100644 --- a/code/datums/cache/air_alarm.dm +++ b/code/datums/cache/air_alarm.dm @@ -2,8 +2,8 @@ GLOBAL_DATUM_INIT(air_alarm_repository, /datum/repository/air_alarm, new()) -/datum/repository/air_alarm/proc/air_alarm_data(var/list/monitored_alarms, var/refresh = 0, var/obj/machinery/alarm/passed_alarm) - var/alarms[0] +/datum/repository/air_alarm/proc/air_alarm_data(list/monitored_alarms, refresh = FALSE, obj/machinery/alarm/passed_alarm) + var/list/alarms = list() var/datum/cache_entry/cache_entry = cache_data if(!cache_entry) @@ -16,20 +16,20 @@ GLOBAL_DATUM_INIT(air_alarm_repository, /datum/repository/air_alarm, new()) if(SSticker && SSticker.current_state < GAME_STATE_PLAYING && istype(passed_alarm)) // Generating the list for the first time as the game hasn't started - no need to run through the machines list everything every time alarms = cache_entry.data // Don't deleate the list if(is_station_contact(passed_alarm.z) && passed_alarm.remote_control) // Still need sanity checks - alarms[++alarms.len] = passed_alarm.get_nano_data_console() + alarms[++alarms.len] = passed_alarm.get_console_data() else for(var/obj/machinery/alarm/alarm in (monitored_alarms ? monitored_alarms : GLOB.air_alarms)) // Generating the whole list again is a bad habit but I can't be bothered to fix it right now if(!monitored_alarms && !is_station_contact(alarm.z)) continue if(!alarm.remote_control) continue - alarms[++alarms.len] = alarm.get_nano_data_console() + alarms[++alarms.len] = alarm.get_console_data() cache_entry.timestamp = world.time //+ 10 SECONDS cache_entry.data = alarms return alarms -/datum/repository/air_alarm/proc/update_cache(var/obj/machinery/alarm/alarm) +/datum/repository/air_alarm/proc/update_cache(obj/machinery/alarm/alarm) return air_alarm_data(refresh = 1, passed_alarm = alarm) #undef AIR_ALARM_DATA_CACHE_DURATION diff --git a/code/datums/spell.dm b/code/datums/spell.dm index abb9fdc37c9..3e77be7d6e2 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -322,6 +322,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) if("recharge") if(charge_counter == 0) return 0 + if(charge_max == 0) + return 1 return charge_counter / charge_max if("charges") if(charge_counter) diff --git a/code/datums/spells/mime.dm b/code/datums/spells/mime.dm index 11b0a75b275..7142448dbdf 100644 --- a/code/datums/spells/mime.dm +++ b/code/datums/spells/mime.dm @@ -38,7 +38,7 @@ include_user = 1 human_req = 1 - action_icon_state = "mime" + action_icon_state = "mime_silence" action_background_icon_state = "bg_mime" /obj/effect/proc_holder/spell/targeted/mime/speak/Click() @@ -77,7 +77,7 @@ range = -1 include_user = TRUE - action_icon_state = "mime" + action_icon_state = "mime_bigwall" action_background_icon_state = "bg_mime" large = TRUE diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 78b9e1c0413..e6b2e8d2008 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -219,13 +219,15 @@ owner.adjustBruteLoss(-25) owner.adjustFireLoss(-25) owner.remove_CC() - owner.bodytemperature = BODYTEMP_NORMAL if(ishuman(owner)) var/mob/living/carbon/human/H = owner + H.bodytemperature = H.dna.species.body_temperature for(var/thing in H.bodyparts) var/obj/item/organ/external/E = thing E.internal_bleeding = FALSE E.mend_fracture() + else + owner.bodytemperature = BODYTEMP_NORMAL return TRUE /datum/status_effect/regenerative_core/on_remove() diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 98272825e2f..6282fcef75a 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1802,6 +1802,16 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY ) containername = "bluespace artillery parts crate" + +/datum/supply_packs/misc/station_goal/bluespace_tap + name = "Bluespace Harvester Parts" + cost = 150 + contains = list( + /obj/item/circuitboard/machine/bluespace_tap, + /obj/item/paper/bluespace_tap + ) + containername = "bluespace harvester parts crate" + /datum/supply_packs/misc/station_goal/dna_vault name = "DNA Vault Parts" cost = 120 diff --git a/code/game/area/Dynamic areas.dm b/code/game/area/dynamic_areas.dm similarity index 100% rename from code/game/area/Dynamic areas.dm rename to code/game/area/dynamic_areas.dm diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/ss13_areas.dm similarity index 99% rename from code/game/area/Space Station 13 areas.dm rename to code/game/area/ss13_areas.dm index 9a333d268f3..8792e710f2b 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/ss13_areas.dm @@ -1238,7 +1238,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/medical/psych name = "\improper Psych Room" icon_state = "medbaypsych" - ambientsounds = list('sound/ambience/aurora_caelus_short.ogg') /area/medical/medbreak name = "\improper Break Room" diff --git a/code/game/gamemodes/devil/devil agent/devil_agent.dm b/code/game/gamemodes/devil/devil_agent/devil_agent.dm similarity index 100% rename from code/game/gamemodes/devil/devil agent/devil_agent.dm rename to code/game/gamemodes/devil/devil_agent/devil_agent.dm diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index f95702e7f28..ff4d1720de6 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -287,17 +287,17 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective. return ..() -/obj/vox/win_button +/obj/machinery/vox_win_button name = "shoal contact computer" desc = "Used to contact the Vox Shoal, generally to arrange for pickup." icon = 'icons/obj/computer.dmi' icon_state = "tcstation" -/obj/vox/win_button/New() +/obj/machinery/vox_win_button/New() . = ..() overlays += icon('icons/obj/computer.dmi', "syndie") -/obj/vox/win_button/attack_hand(mob/user) +/obj/machinery/vox_win_button/attack_hand(mob/user) if(!GAMEMODE_IS_HEIST || (world.time < 10 MINUTES)) //has to be heist, and at least ten minutes into the round to_chat(user, "\The [src] does not appear to have a connection.") return 0 diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 883b37f9d83..a3aa9919eb2 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -1,20 +1,21 @@ #define EMPOWERED_THRALL_LIMIT 5 /obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H) - if(!H || !istype(H)) return + if(!H || !istype(H)) + return if(H.incorporeal_move == 1) - to_chat(usr, "You can't use abilities affecting others while you are traversing between worlds!") + to_chat(H, "You can't use abilities affecting others while you are traversing between worlds!") return FALSE if(isshadowling(H) && is_shadow(H)) return 1 if(isshadowlinglesser(H) && is_thrall(H)) return 1 - if(!is_shadow_or_thrall(usr)) - to_chat(usr, "You can't wrap your head around how to do this.") - else if(is_thrall(usr)) - to_chat(usr, "You aren't powerful enough to do this.") - else if(is_shadow(usr)) - to_chat(usr, "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.") + if(!is_shadow_or_thrall(H)) + to_chat(H, "You can't wrap your head around how to do this.") + else if(is_thrall(H)) + to_chat(H, "You aren't powerful enough to do this.") + else if(is_shadow(H)) + to_chat(H, "Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.") return 0 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 48ddd28c5e3..bbeb35d6318 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -44,12 +44,6 @@ #define AALARM_PRESET_COLDROOM 3 // Kitchen coldroom #define AALARM_PRESET_SERVER 4 // Server coldroom -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 - #define AALARM_REPORT_TIMEOUT 100 #define RCON_NO 1 @@ -109,7 +103,6 @@ var/mode = AALARM_MODE_SCRUBBING var/preset = AALARM_PRESET_HUMAN - var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area var/danger_level = ATMOS_ALARM_NONE @@ -375,7 +368,7 @@ if(ATMOS_ALARM_DANGER) icon_state = "alarm1" -/obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) +/obj/machinery/alarm/proc/register_env_machine(m_id, device_type) var/new_name if(device_type=="AVP") new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" @@ -405,7 +398,7 @@ frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_TO_AIRALARM) -/obj/machinery/alarm/proc/send_signal(var/target, var/list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise +/obj/machinery/alarm/proc/send_signal(target, list/command)//sends signal 'command' to 'target'. Returns 0 if no radio connection, 1 otherwise if(!radio_connection) return 0 @@ -418,9 +411,7 @@ signal.data["sigtype"] = "command" radio_connection.post_signal(src, signal, RADIO_FROM_AIRALARM) -// to_chat(world, text("Signal [] Broadcasted to []", command, target)) - - return 1 + return TRUE /obj/machinery/alarm/proc/apply_mode() switch(mode) @@ -571,10 +562,13 @@ /////////////// /obj/machinery/alarm/attack_ai(mob/user) - src.add_hiddenprint(user) - return ui_interact(user) + if(buildstage != 2) + return -/obj/machinery/alarm/attack_ghost(user as mob) + add_hiddenprint(user) + return tgui_interact(user) + +/obj/machinery/alarm/attack_ghost(mob/user) return interact(user) /obj/machinery/alarm/attack_hand(mob/user) @@ -591,7 +585,7 @@ wires.Interact(user) if(!shorted) - ui_interact(user) + tgui_interact(user) /obj/machinery/alarm/proc/ui_air_status() var/turf/location = get_turf(src) @@ -600,7 +594,7 @@ var/datum/gas_mixture/environment = location.return_air() var/total = environment.oxygen + environment.nitrogen + environment.carbon_dioxide + environment.toxins - if(total==0) + if(total == 0) return null var/datum/tlv/cur_tlv @@ -633,12 +627,12 @@ cur_tlv = TLV["temperature"] var/temperature_dangerlevel = cur_tlv.get_danger_level(environment.temperature) - var/data[0] + var/list/data = list() data["pressure"] = environment_pressure data["temperature"] = environment.temperature data["temperature_c"] = round(environment.temperature - T0C, 0.1) - var/percentages[0] + var/list/percentages = list() percentages["oxygen"] = oxygen_percent percentages["nitrogen"] = nitrogen_percent percentages["co2"] = co2_percent @@ -646,7 +640,7 @@ percentages["other"] = other_moles data["contents"] = percentages - var/danger[0] + var/list/danger = list() danger["pressure"] = pressure_dangerlevel danger["temperature"] = temperature_dangerlevel danger["oxygen"] = oxygen_dangerlevel @@ -658,13 +652,12 @@ data["danger"] = danger return data -/obj/machinery/alarm/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] +/obj/machinery/alarm/proc/has_rcon_access(mob/user) + return user && (isAI(user) || allowed(user) || emagged || rcon_setting == RCON_YES) - var/list/href_list = state.href_list(user) - if(href_list) - data["remote_connection"] = href_list["remote_connection"] - data["remote_access"] = href_list["remote_access"] +// Intentional nulls here +/obj/machinery/alarm/tgui_data(mob/user) + var/list/data = list() data["name"] = sanitize(name) data["air"] = ui_air_status() @@ -674,70 +667,70 @@ // Locked when: // Not sent from atmos console AND // Not silicon AND locked. - data["locked"] = !is_authenticated(user, href_list) + var/datum/tgui/active_ui = SStgui.get_open_ui(user, src, "main") + data["locked"] = !is_authenticated(user, active_ui) data["rcon"] = rcon_setting data["target_temp"] = target_temperature - T0C data["atmos_alarm"] = alarm_area.atmosalm data["emagged"] = emagged data["modes"] = list( - AALARM_MODE_SCRUBBING = list("name"="Filtering", "desc"="Scrubs out contaminants"),\ - AALARM_MODE_VENTING = list("name"="Draught", "desc"="Siphons out air while replacing"),\ - AALARM_MODE_PANIC = list("name"="Panic Siphon","desc"="Siphons air out of the room quickly"),\ - AALARM_MODE_REPLACEMENT = list("name"="Cycle", "desc"="Siphons air before replacing"),\ - AALARM_MODE_SIPHON = list("name"="Siphon", "desc"="Siphons air out of the room"),\ - AALARM_MODE_CONTAMINATED= list("name"="Contaminated","desc"="Scrubs out all contaminants quickly"),\ - AALARM_MODE_REFILL = list("name"="Refill", "desc"="Triples vent output"),\ - AALARM_MODE_OFF = list("name"="Off", "desc"="Shuts off vents and scrubbers"),\ - AALARM_MODE_FLOOD = list("name"="Flood", "desc"="Shuts off scrubbers and opens vents", "emagonly" = 1) + AALARM_MODE_SCRUBBING = list("name"="Filtering", "desc"="Scrubs out contaminants", "id" = AALARM_MODE_SCRUBBING),\ + AALARM_MODE_VENTING = list("name"="Draught", "desc"="Siphons out air while replacing", "id" = AALARM_MODE_VENTING),\ + AALARM_MODE_PANIC = list("name"="Panic Siphon","desc"="Siphons air out of the room quickly", "id" = AALARM_MODE_PANIC),\ + AALARM_MODE_REPLACEMENT = list("name"="Cycle", "desc"="Siphons air before replacing", "id" = AALARM_MODE_REPLACEMENT),\ + AALARM_MODE_SIPHON = list("name"="Siphon", "desc"="Siphons air out of the room", "id" = AALARM_MODE_SIPHON),\ + AALARM_MODE_CONTAMINATED= list("name"="Contaminated","desc"="Scrubs out all contaminants quickly", "id" = AALARM_MODE_CONTAMINATED),\ + AALARM_MODE_REFILL = list("name"="Refill", "desc"="Triples vent output", "id" = AALARM_MODE_REFILL),\ + AALARM_MODE_OFF = list("name"="Off", "desc"="Shuts off vents and scrubbers", "id" = AALARM_MODE_OFF),\ + AALARM_MODE_FLOOD = list("name"="Flood", "desc"="Shuts off scrubbers and opens vents", "emagonly" = TRUE, "id" = AALARM_MODE_FLOOD) ) data["mode"] = mode data["presets"] = list( - AALARM_PRESET_HUMAN = list("name"="Human", "desc"="Checks for oxygen and nitrogen"),\ - AALARM_PRESET_VOX = list("name"="Vox", "desc"="Checks for nitrogen only"),\ - AALARM_PRESET_COLDROOM = list("name"="Coldroom", "desc"="For freezers"),\ - AALARM_PRESET_SERVER = list("name"="Server Room", "desc"="For server rooms") + AALARM_PRESET_HUMAN = list("name"="Human", "desc"="Checks for oxygen and nitrogen", "id" = AALARM_PRESET_HUMAN),\ + AALARM_PRESET_VOX = list("name"="Vox", "desc"="Checks for nitrogen only", "id" = AALARM_PRESET_VOX),\ + AALARM_PRESET_COLDROOM = list("name"="Coldroom", "desc"="For freezers", "id" = AALARM_PRESET_COLDROOM),\ + AALARM_PRESET_SERVER = list("name"="Server Room", "desc"="For server rooms", "id" = AALARM_PRESET_SERVER) ) data["preset"] = preset - data["screen"] = screen - var/list/vents=list() + var/list/vents = list() if(alarm_area.air_vent_names.len) for(var/id_tag in alarm_area.air_vent_names) - var/vent_info[0] + var/list/vent_info = list() var/long_name = alarm_area.air_vent_names[id_tag] var/list/vent_data = alarm_area.air_vent_info[id_tag] if(!vent_data) continue - vent_info["id_tag"]=id_tag - vent_info["name"]=sanitize(long_name) + vent_info["id_tag"] = id_tag + vent_info["name"] = sanitize(long_name) vent_info += vent_data - vents+=list(vent_info) - data["vents"]=vents + vents += list(vent_info) + data["vents"] = vents - var/list/scrubbers=list() + var/list/scrubbers = list() if(alarm_area.air_scrub_names.len) for(var/id_tag in alarm_area.air_scrub_names) var/long_name = alarm_area.air_scrub_names[id_tag] var/list/scrubber_data = alarm_area.air_scrub_info[id_tag] if(!scrubber_data) continue - scrubber_data["id_tag"]=id_tag - scrubber_data["name"]=sanitize(long_name) - scrubbers+=list(scrubber_data) - data["scrubbers"]=scrubbers + scrubber_data["id_tag"] = id_tag + scrubber_data["name"] = sanitize(long_name) + scrubbers += list(scrubber_data) + data["scrubbers"] = scrubbers return data -/obj/machinery/alarm/proc/get_nano_data_console(mob/user) - var/data[0] +/obj/machinery/alarm/proc/get_console_data(mob/user) + var/list/data = list() data["name"] = sanitize(name) data["ref"] = "\ref[src]" data["danger"] = max(danger_level, alarm_area.atmosalm) - var/area/Area = get_area(src) - data["area"] = sanitize(Area.name) - var/turf/pos = get_turf(src) - data["x"] = pos.x - data["y"] = pos.y - data["z"] = pos.z + var/area/A = get_area(src) + data["area"] = sanitize(A.name) + var/turf/T = get_turf(src) + data["x"] = T.x + data["y"] = T.y + data["z"] = T.z return data /obj/machinery/alarm/proc/generate_thresholds_menu() @@ -745,9 +738,9 @@ var/list/thresholds = list() var/list/gas_names = list( - "oxygen" = "O2", - "nitrogen" = "N2", - "carbon dioxide" = "CO2", + "oxygen" = "O2", + "nitrogen" = "N2", + "carbon dioxide" = "CO2", "plasma" = "Toxin", "other" = "Other") for(var/g in gas_names) @@ -774,28 +767,24 @@ return thresholds -/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = GLOB.default_state) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/alarm/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "air_alarm.tmpl", name, 570, 410, state = state) + ui = new(user, src, ui_key, "AirAlarm", name, 570, 410, master_ui, state) ui.open() - ui.set_auto_update(1) -/obj/machinery/alarm/proc/is_authenticated(var/mob/user, href_list) +/obj/machinery/alarm/proc/is_authenticated(mob/user, datum/tgui/ui=null) + // Return true if they are connecting with a remote console + if(istype(ui?.master_ui?.src_object.type, /datum/tgui_module/atmos_control)) + return TRUE if(user.can_admin_interact()) - return 1 - else if(isAI(user) || isrobot(user) || emagged || is_auth_rcon(href_list)) - return 1 + return TRUE + else if(isAI(user) || isrobot(user) || emagged) + return TRUE else return !locked -/obj/machinery/alarm/proc/is_auth_rcon(href_list) - if(href_list && href_list["remote_connection"] && href_list["remote_access"]) - return 1 - else - return 0 - -/obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list()) +/obj/machinery/alarm/tgui_status(mob/user, datum/tgui_state/state) if(buildstage != 2) return STATUS_CLOSE @@ -805,146 +794,138 @@ . = shorted ? STATUS_DISABLED : STATUS_INTERACTIVE - if(. == STATUS_INTERACTIVE) - var/extra_href = state.href_list(usr) - // Prevent remote users from altering RCON settings or activating atmos alarms unless they already have access - if((href_list["atmos_alarm"] || href_list["rcon"]) && extra_href["remote_connection"] && !extra_href["remote_access"]) - . = STATUS_UPDATE return min(..(), .) -/obj/machinery/alarm/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state) - if(..(href, href_list, nowindow, state)) - return 1 - - var/state_href = state.href_list(usr) - - if(href_list["rcon"]) - var/attempted_rcon_setting = text2num(href_list["rcon"]) - switch(attempted_rcon_setting) - if(RCON_NO) - rcon_setting = RCON_NO - if(RCON_AUTO) - rcon_setting = RCON_AUTO - if(RCON_YES) - rcon_setting = RCON_YES - return 1 +// TODO: Refactor these utter pieces of garbage +/obj/machinery/alarm/tgui_act(action, list/params) + if(..()) + return add_fingerprint(usr) - if(href_list["command"]) - if(!is_authenticated(usr, state_href)) - return + . = TRUE - var/device_id = href_list["id_tag"] - switch(href_list["command"]) - if( "power", - "adjust_external_pressure", - "set_external_pressure", - "checks", - "co2_scrub", - "tox_scrub", - "n2o_scrub", - "n2_scrub", - "o2_scrub", - "widenet", - "scrubbing", - "direction") - var/val - if(href_list["val"]) - val=text2num(href_list["val"]) - else - var/newval = input("Enter new value") as num|null - if(isnull(newval)) + // Used for rcon auth + var/datum/tgui/active_ui = SStgui.get_open_ui(usr, src, "main") + + switch(action) + if("set_rcon") + var/attempted_rcon_setting = text2num(params["rcon"]) + switch(attempted_rcon_setting) + if(RCON_NO) + rcon_setting = RCON_NO + if(RCON_AUTO) + rcon_setting = RCON_AUTO + if(RCON_YES) + rcon_setting = RCON_YES + + + if("command") + if(!is_authenticated(usr, active_ui)) + return + + var/device_id = params["id_tag"] + switch(params["cmd"]) + if ("power", + "adjust_external_pressure", + "set_external_pressure", + "checks", + "co2_scrub", + "tox_scrub", + "n2o_scrub", + "n2_scrub", + "o2_scrub", + "widenet", + "scrubbing", + "direction") + var/val + if(params["val"]) + val=text2num(params["val"]) + else + var/newval = input("Enter new value") as num|null + if(isnull(newval)) + return + if(params["cmd"] == "set_external_pressure") + if(newval > 1000 + ONE_ATMOSPHERE) + newval = 1000 + ONE_ATMOSPHERE + if(newval < 0) + newval = 0 + val = newval + + // For those who read this: This radio BS is what makes air alarms take 10 years to update in the UI + send_signal(device_id, list(params["cmd"] = val)) + waiting_on_device = device_id + + if("set_threshold") + var/env = params["env"] + var/varname = params["var"] + var/datum/tlv/tlv = TLV[env] + var/newval = input("Enter [varname] for [env]", "Alarm triggers", tlv.vars[varname]) as num|null + + if(isnull(newval) || ..()) // No setting if you walked away return - if(href_list["command"]=="set_external_pressure") - if(newval>1000+ONE_ATMOSPHERE) - newval = 1000+ONE_ATMOSPHERE - if(newval<0) - newval = 0 - val = newval + if(newval < 0) + tlv.vars[varname] = -1.0 + else if(env == "temperature" && newval > 5000) + tlv.vars[varname] = 5000 + else if(env == "pressure" && newval > 50 * ONE_ATMOSPHERE) + tlv.vars[varname] = 50 * ONE_ATMOSPHERE + else if(env != "temperature" && env != "pressure" && newval > 200) + tlv.vars[varname] = 200 + else + newval = round(newval, 0.01) + tlv.vars[varname] = newval - send_signal(device_id, list(href_list["command"] = val ) ) - waiting_on_device=device_id + if("atmos_alarm") + if(alarm_area.atmosalert(ATMOS_ALARM_DANGER, src)) + post_alert(ATMOS_ALARM_DANGER) + alarmActivated = TRUE + update_icon() - if("set_threshold") - var/env = href_list["env"] - var/varname = href_list["var"] - var/datum/tlv/tlv = TLV[env] - var/newval = input("Enter [varname] for [env]", "Alarm triggers", tlv.vars[varname]) as num|null + if("atmos_reset") + if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE)) + post_alert(ATMOS_ALARM_NONE) + alarmActivated = FALSE + update_icon() - if(isnull(newval) || ..(href, href_list, nowindow, state)) - return - if(newval<0) - tlv.vars[varname] = -1.0 - else if(env=="temperature" && newval>5000) - tlv.vars[varname] = 5000 - else if(env=="pressure" && newval>50*ONE_ATMOSPHERE) - tlv.vars[varname] = 50*ONE_ATMOSPHERE - else if(env!="temperature" && env!="pressure" && newval>200) - tlv.vars[varname] = 200 - else - newval = round(newval,0.01) - tlv.vars[varname] = newval + if("mode") + if(!is_authenticated(usr, active_ui)) + return - if(href_list["screen"]) - if(!is_authenticated(usr, state_href)) - return + mode = text2num(params["mode"]) + apply_mode() - screen = text2num(href_list["screen"]) - return 1 - if(href_list["atmos_alarm"]) - if(alarm_area.atmosalert(ATMOS_ALARM_DANGER, src)) - post_alert(ATMOS_ALARM_DANGER) - alarmActivated = 1 - update_icon() - return 1 + if("preset") + if(!is_authenticated(usr, active_ui)) + return - if(href_list["atmos_reset"]) - if(alarm_area.atmosalert(ATMOS_ALARM_NONE, src, TRUE)) - post_alert(ATMOS_ALARM_NONE) - alarmActivated = 0 - update_icon() - return 1 + preset = text2num(params["preset"]) + apply_preset() - if(href_list["mode"]) - if(!is_authenticated(usr, state_href)) - return - mode = text2num(href_list["mode"]) - apply_mode() - return 1 + if("temperature") + var/datum/tlv/selected = TLV["temperature"] + var/max_temperature = selected.max1 >= 0 ? min(selected.max1, MAX_TEMPERATURE) : max(selected.max1, MAX_TEMPERATURE) + var/min_temperature = max(selected.min1, MIN_TEMPERATURE) + var/max_temperature_c = max_temperature - T0C + var/min_temperature_c = min_temperature - T0C + var/input_temperature = input("What temperature would you like the system to maintain? (Capped between [min_temperature_c]C and [max_temperature_c]C)", "Thermostat Controls") as num|null + if(isnull(input_temperature) || ..()) // No temp setting if you walked away + return + input_temperature = input_temperature + T0C + if(input_temperature > max_temperature || input_temperature < min_temperature) + to_chat(usr, "Temperature must be between [min_temperature_c]C and [max_temperature_c]C") + else + target_temperature = input_temperature - if(href_list["preset"]) - if(!is_authenticated(usr, state_href)) - return - - preset = text2num(href_list["preset"]) - apply_preset() - return 1 - - if(href_list["temperature"]) - var/datum/tlv/selected = TLV["temperature"] - var/max_temperature = selected.max1 >= 0 ? min(selected.max1, MAX_TEMPERATURE) : max(selected.max1, MAX_TEMPERATURE) - var/min_temperature = max(selected.min1, MIN_TEMPERATURE) - var/max_temperature_c = max_temperature - T0C - var/min_temperature_c = min_temperature - T0C - var/input_temperature = input("What temperature would you like the system to maintain? (Capped between [min_temperature_c]C and [max_temperature_c]C)", "Thermostat Controls") as num|null - if(isnull(input_temperature) || ..(href, href_list, nowindow, state)) - return - input_temperature = input_temperature + T0C - if(input_temperature > max_temperature || input_temperature < min_temperature) - to_chat(usr, "Temperature must be between [min_temperature_c]C and [max_temperature_c]C") - else - target_temperature = input_temperature - return 1 /obj/machinery/alarm/emag_act(mob/user) if(!emagged) - src.emagged = 1 + emagged = TRUE if(user) user.visible_message("Sparks fly out of the [src]!", "You emag the [src], disabling its safeties.") - playsound(src.loc, 'sound/effects/sparks4.ogg', 50, 1) + playsound(src.loc, 'sound/effects/sparks4.ogg', 50, TRUE) return /obj/machinery/alarm/attackby(obj/item/I, mob/user, params) @@ -960,7 +941,7 @@ if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the Air Alarm interface.") - updateUsrDialog() + SStgui.update_uis(src) else to_chat(user, "Access denied.") return diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3fffc598334..96c8ccff074 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -30,6 +30,7 @@ var/list/being_built = list() var/datum/research/files + var/list/imported = list() // /datum/design.id -> boolean var/list/datum/design/matching_designs var/temp_search var/selected_category @@ -108,12 +109,19 @@ var/maxmult = 1 if(ispath(D.build_path, /obj/item/stack)) maxmult = D.maxstack + + var/list/default_categories = D.category + var/list/categories = istype(default_categories) ? default_categories.Copy() : list() + + if(imported[D.id]) + categories |= "Imported" + recipes.Add(list(list( "name" = D.name, - "category" = D.category, + "category" = categories, "uid" = D.UID(), "requirements" = matreq, - "hacked" = ("hacked" in D.category) ? TRUE : FALSE, + "hacked" = ("hacked" in categories) ? TRUE : FALSE, "max_multiplier" = maxmult, "image" = "[icon2base64(icon(initial(I.icon), initial(I.icon_state), SOUTH, 1))]" ))) @@ -162,8 +170,8 @@ if(!istype(design_last_ordered)) to_chat(usr, "Invalid design") return - if(!(design_last_ordered.build_type & AUTOLATHE)) - to_chat(usr, "Invalid design (not buildable in autolathe, report this error.)") + if(!(design_last_ordered.id in files.known_designs)) + to_chat(usr, "Invalid design (not in autolathe's known designs, report this error.)") return var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(design_last_ordered.materials["$metal"] > materials.amount(MAT_METAL)) @@ -243,7 +251,13 @@ if(istype(O, /obj/item/disk/design_disk)) var/obj/item/disk/design_disk/D = O if(D.blueprint) - if(!(D.blueprint.build_type & AUTOLATHE)) // otherwise, would silently fail in AddDesign2Known + var/datum/design/design = D.blueprint // READ ONLY!! + + if(design.id in files.known_designs) + to_chat(user, "This design has already been loaded into the autolathe.") + return 1 + + if(!files.CanAddDesign2Known(design)) to_chat(user, "This design is not compatible with the autolathe.") return 1 user.visible_message("[user] begins to load \the [O] in \the [src]...", @@ -252,9 +266,8 @@ playsound(get_turf(src), 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) busy = TRUE if(do_after(user, 14.4, target = src)) - if(!("Imported" in D.blueprint.category)) // R&D should always ensure this is set on design disks, but it doesn't. - D.blueprint.category += "Imported" // now it will actually show up in the list. - files.AddDesign2Known(D.blueprint) + imported[design.id] = TRUE + files.AddDesign2Known(design) recipiecache = list() SStgui.close_uis(src) // forces all connected users to re-open the TGUI. Imported entries won't show otherwise due to static_data busy = FALSE diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 7b07cda3bbb..8014cea95a2 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -1,39 +1,30 @@ /obj/machinery/computer/atmoscontrol - name = "\improper Central Atmospherics Computer" + name = "\improper central atmospherics computer" icon = 'icons/obj/computer.dmi' icon_keyboard = "atmos_key" icon_screen = "tank" - light_color = LIGHT_COLOR_GREEN - density = 1 - anchored = 1.0 + light_color = LIGHT_COLOR_CYAN circuit = /obj/item/circuitboard/atmoscontrol req_access = list(ACCESS_ATMOSPHERICS) - var/list/monitored_alarm_ids = null - var/datum/nano_module/atmos_control/atmos_control + var/datum/tgui_module/atmos_control/atmos_control + +/obj/machinery/computer/atmoscontrol/Initialize() + . = ..() + atmos_control = new(src) /obj/machinery/computer/atmoscontrol/laptop name = "atmospherics laptop" desc = "Cheap Nanotrasen laptop." icon_state = "medlaptop" - density = 0 + density = FALSE -/obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob) - ui_interact(user) +/obj/machinery/computer/atmoscontrol/attack_ai(mob/user) + tgui_interact(user) /obj/machinery/computer/atmoscontrol/attack_hand(mob/user) if(..()) - return 1 - ui_interact(user) + return + tgui_interact(user) -/obj/machinery/computer/atmoscontrol/emag_act(mob/user) - if(!emagged) - user.visible_message("\The [user] does something \the [src], causing the screen to flash!",\ - "You cause the screen to flash as you gain full control.",\ - "You hear an electronic warble.") - atmos_control.emagged = 1 - return 1 - -/obj/machinery/computer/atmoscontrol/ui_interact(var/mob/user) - if(!atmos_control) - atmos_control = new(src, req_access, req_one_access, monitored_alarm_ids) - atmos_control.ui_interact(user) +/obj/machinery/computer/atmoscontrol/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + atmos_control.tgui_interact(user, ui_key, ui, force_open) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index cb7e1b2d20b..6d49f4740f0 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -121,8 +121,8 @@ var/list/visible_turfs = list() for(var/turf/T in (C.isXRay() \ - ? range(C.view_range, C) \ - : view(C.view_range, C))) + ? range(C.view_range, get_turf(C)) \ + : view(C.view_range, get_turf(C)))) visible_turfs += T var/list/bbox = get_bbox_of_atoms(visible_turfs) @@ -163,8 +163,11 @@ tgui_interact(user) /obj/machinery/computer/security/attack_ai(mob/user) - to_chat(user, "You realise its kind of stupid to access a camera console when you have the entire camera network at your metaphorical fingertips") - return + if(isAI(user)) + to_chat(user, "You realise its kind of stupid to access a camera console when you have the entire camera network at your metaphorical fingertips") + return + + tgui_interact(user) /obj/machinery/computer/security/proc/show_camera_static() diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 32924690d97..925b5e883d1 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -16,61 +16,6 @@ ..() program = new/datum/computer/file/embedded_program/airlock(src) -//Advanced airlock controller for when you want a more versatile airlock controller - useful for turning simple access control rooms into airlocks -/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller - name = "Advanced Airlock Controller" - -/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290) - ui.open() - ui.set_auto_update(1) - -/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - - data = list( - "chamber_pressure" = round(program.memory["chamber_sensor_pressure"]), - "external_pressure" = round(program.memory["external_sensor_pressure"]), - "internal_pressure" = round(program.memory["internal_sensor_pressure"]), - "processing" = program.memory["processing"], - "purge" = program.memory["purge"], - "secure" = program.memory["secure"] - ) - - return data - -/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/Topic(href, href_list) - if(..()) - return 1 - - usr.set_machine(src) - src.add_fingerprint(usr) - - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks - if("cycle_ext") - clean = 1 - if("cycle_int") - clean = 1 - if("force_ext") - clean = 1 - if("force_int") - clean = 1 - if("abort") - clean = 1 - if("purge") - clean = 1 - if("secure") - clean = 1 - - if(clean) - program.receive_user_command(href_list["command"]) - - return 1 - - //Airlock controller for airlock control - most airlocks on the station use this /obj/machinery/embedded_controller/radio/airlock/airlock_controller name = "Airlock Controller" @@ -91,49 +36,34 @@ tag_chamber_sensor = given_tag_chamber_sensor ..() -/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/embedded_controller/radio/airlock/airlock_controller/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290) + ui = new(user, src, ui_key, "ExternalAirlockController", name, 470, 290, master_ui, state) ui.open() - ui.set_auto_update(1) -/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] +/obj/machinery/embedded_controller/radio/airlock/airlock_controller/tgui_data(mob/user) + var/list/data = list() - data = list( - "chamber_pressure" = round(program.memory["chamber_sensor_pressure"]), - "exterior_status" = program.memory["exterior_status"], - "interior_status" = program.memory["interior_status"], - "processing" = program.memory["processing"], - ) + data["chamber_pressure"] = round(program.memory["chamber_sensor_pressure"]) + data["exterior_status"] = program.memory["exterior_status"] + data["interior_status"] = program.memory["interior_status"] + data["processing"] = program.memory["processing"] return data -/obj/machinery/embedded_controller/radio/airlock/airlock_controller/Topic(href, href_list) + +/obj/machinery/embedded_controller/radio/airlock/airlock_controller/tgui_act(action, params) if(..()) return - usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks - if("cycle_ext") - clean = 1 - if("cycle_int") - clean = 1 - if("force_ext") - clean = 1 - if("force_int") - clean = 1 - if("abort") - clean = 1 + var/list/allowed_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort") + if(action in allowed_actions) //anti-HTML-hacking checks + program.receive_user_command(action) - if(clean) - program.receive_user_command(href_list["command"]) - - return 1 + return TRUE //Access controller for door control - used in virology and the like @@ -153,45 +83,46 @@ else icon_state = "access_control_off" -/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/embedded_controller/radio/airlock/access_controller/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220) + ui = new(user, src, ui_key, "AirlockAccessController", name, 470, 290, master_ui, state) ui.open() - ui.set_auto_update(1) -/obj/machinery/embedded_controller/radio/airlock/access_controller/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] +/obj/machinery/embedded_controller/radio/airlock/access_controller/tgui_data(mob/user) + var/list/data = list() - data = list( - "exterior_status" = program.memory["exterior_status"], - "interior_status" = program.memory["interior_status"], - "processing" = program.memory["processing"] - ) + data["exterior_status"] = program.memory["exterior_status"] + data["interior_status"] = program.memory["interior_status"] + data["processing"] = program.memory["processing"] return data -/obj/machinery/embedded_controller/radio/airlock/access_controller/Topic(href, href_list) +/obj/machinery/embedded_controller/radio/airlock/access_controller/tgui_act(action, params) if(..()) return - usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) - var/clean = 0 - switch(href_list["command"]) //anti-HTML-hacking checks + var/clean = FALSE + + // Repeat the frontend check to make sure only allowed command are sent. You are only allowed to lock or cycle exterior if exterior is open + // Vice versa for internal + + switch(action) if("cycle_ext_door") - clean = 1 + clean = TRUE if("cycle_int_door") - clean = 1 - if("force_ext") - if(program.memory["interior_status"]["state"] == "closed") - clean = 1 - if("force_int") - if(program.memory["exterior_status"]["state"] == "closed") - clean = 1 + clean = TRUE + if("force_ext") // Cannot force exterior if interior open + if(program.memory["interior_status"]["state"] == "closed" && program.memory["exterior_status"]["state"] == "open") + clean = TRUE + if("force_int") // Cannot force interior if exterior open + if(program.memory["exterior_status"]["state"] == "closed" && program.memory["interior_status"]["state"] == "open") + clean = TRUE if(clean) - program.receive_user_command(href_list["command"]) + program.receive_user_command(action) + + return TRUE - return 1 diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index f3230ba05a8..47ff67c0935 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -27,18 +27,15 @@ src.updateDialog() /obj/machinery/embedded_controller/attack_ghost(mob/user as mob) - src.ui_interact(user) + tgui_interact(user) /obj/machinery/embedded_controller/attack_ai(mob/user as mob) - src.ui_interact(user) + tgui_interact(user) /obj/machinery/embedded_controller/attack_hand(mob/user as mob) if(!user.IsAdvancedToolUser()) - return 0 - src.ui_interact(user) - -/obj/machinery/embedded_controller/ui_interact() - return + return FALSE + tgui_interact(user) /obj/machinery/embedded_controller/radio icon = 'icons/obj/airlock_machines.dmi' diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 9dabea08319..92bb26924e3 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -188,6 +188,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ ..() recipes = GLOB.diamond_recipes +/obj/item/stack/sheet/mineral/diamond/fifty + amount = 50 + /obj/item/stack/sheet/mineral/uranium name = "uranium" icon_state = "sheet-uranium" @@ -216,6 +219,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ ..() recipes = GLOB.plasma_recipes +/obj/item/stack/sheet/mineral/plasma/fifty + amount = 50 + /obj/item/stack/sheet/mineral/plasma/welder_act(mob/user, obj/item/I) if(I.use_tool(src, user, volume = I.tool_volume)) log_and_set_aflame(user, I) @@ -275,6 +281,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ materials = list(MAT_BANANIUM=MINERAL_MATERIAL_AMOUNT) point_value = 50 +/obj/item/stack/sheet/mineral/bananium/fifty + amount = 50 + /obj/item/stack/sheet/mineral/bananium/New(loc, amount=null) ..() recipes = GLOB.bananium_recipes @@ -289,6 +298,9 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ wall_allowed = FALSE //no tranquilite walls in code point_value = 50 +/obj/item/stack/sheet/mineral/tranquillite/fifty + amount = 50 + /obj/item/stack/sheet/mineral/tranquillite/New(loc, amount=null) ..() recipes = GLOB.tranquillite_recipes @@ -367,6 +379,9 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list( origin_tech = "materials=6;abductor=1" sheettype = "abductor" +/obj/item/stack/sheet/mineral/abductor/fifty + amount = 50 + /obj/item/stack/sheet/mineral/abductor/New(loc, amount=null) recipes = GLOB.abductor_recipes ..() diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index 2a2e91ef599..51970297281 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -24,27 +24,27 @@ src.on_floor = on_floor src.window_checks = window_checks -/datum/stack_recipe/proc/post_build(var/obj/item/stack/S, var/obj/result) +/datum/stack_recipe/proc/post_build(obj/item/stack/S, obj/result) return /* Special Recipes */ /datum/stack_recipe/cable_restraints -/datum/stack_recipe/cable_restraints/post_build(var/obj/item/stack/S, var/obj/result) +/datum/stack_recipe/cable_restraints/post_build(obj/item/stack/S, obj/result) if(istype(result, /obj/item/restraints/handcuffs/cable)) result.color = S.color ..() /datum/stack_recipe/dangerous -/datum/stack_recipe/dangerous/post_build(/obj/item/stack/S, /obj/result) +/datum/stack_recipe/dangerous/post_build(obj/item/stack/S, obj/result) var/turf/targ = get_turf(usr) message_admins("[title] made by [key_name_admin(usr)](?) in [get_area(usr)] [ADMIN_COORDJMP(targ)]!",0,1) log_game("[title] made by [key_name_admin(usr)] at [get_area(usr)] [targ.x], [targ.y], [targ.z].") ..() /datum/stack_recipe/rods -/datum/stack_recipe/rods/post_build(var/obj/item/stack/S, var/obj/result) +/datum/stack_recipe/rods/post_build(obj/item/stack/S, obj/result) if(istype(result, /obj/item/stack/rods)) var/obj/item/stack/rods/R = result R.update_icon() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 850b452a529..007be9d3535 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -72,11 +72,17 @@ turf_type = /turf/simulated/floor/carpet resistance_flags = FLAMMABLE +/obj/item/stack/tile/carpet/twenty + amount = 20 + /obj/item/stack/tile/carpet/black name = "black carpet" icon_state = "tile-carpet-black" turf_type = /turf/simulated/floor/carpet/black +/obj/item/stack/tile/carpet/black/twenty + amount = 20 + //Plasteel /obj/item/stack/tile/plasteel name = "floor tiles" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index f8f9a48102a..cf299cb6580 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -1,42 +1,20 @@ -/* -CONTAINS: -RCD // no fucking shit sherlock -*/ -#define RCD_PAGE_MAIN 1 -#define RCD_PAGE_AIRLOCK 2 -#define RCD_MODE_TURF "Turf" -#define RCD_MODE_AIRLOCK "Airlock" -#define RCD_MODE_DECON "Deconstruct" -#define RCD_MODE_WINDOW "Windows" +#define MATTER_100 100 +#define MATTER_500 500 -GLOBAL_LIST_INIT(rcd_door_types, list( - /obj/machinery/door/airlock = "Standard", /obj/machinery/door/airlock/glass = "Standard (Glass)", - /obj/machinery/door/airlock/command = "Command", /obj/machinery/door/airlock/command/glass = "Command (Glass)", - /obj/machinery/door/airlock/security = "Security", /obj/machinery/door/airlock/security/glass = "Security (Glass)", - /obj/machinery/door/airlock/engineering = "Engineering", /obj/machinery/door/airlock/engineering/glass = "Engineering (Glass)", - /obj/machinery/door/airlock/medical = "Medical", /obj/machinery/door/airlock/medical/glass = "Medical (Glass)", - /obj/machinery/door/airlock/maintenance = "Maintenance", /obj/machinery/door/airlock/maintenance/glass = "Maintenance (Glass)", - /obj/machinery/door/airlock/external = "External", /obj/machinery/door/airlock/external/glass = "External (Glass)", - /obj/machinery/door/airlock/maintenance/external = "External Maintenance", - /obj/machinery/door/airlock/maintenance/external/glass = "External Maintenance (Glass)", - /obj/machinery/door/airlock/freezer = "Freezer", - /obj/machinery/door/airlock/mining = "Mining", /obj/machinery/door/airlock/mining/glass = "Mining (Glass)", - /obj/machinery/door/airlock/research = "Research", /obj/machinery/door/airlock/research/glass = "Research (Glass)", - /obj/machinery/door/airlock/atmos = "Atmospherics", /obj/machinery/door/airlock/atmos/glass = "Atmospherics (Glass)", - /obj/machinery/door/airlock/science = "Science", /obj/machinery/door/airlock/science/glass = "Science (Glass)", - /obj/machinery/door/airlock/hatch = "Airtight Hatch", - /obj/machinery/door/airlock/maintenance_hatch = "Maintenance Hatch" -)) +#define TAB_AIRLOCK_TYPE 1 +#define TAB_AIRLOCK_ACCESS 2 + +#define MODE_TURF "Floors and Walls" +#define MODE_AIRLOCK "Airlocks" +#define MODE_WINDOW "Windows" +#define MODE_DECON "Deconstruction" /obj/item/rcd name = "rapid-construction-device (RCD)" desc = "A device used to rapidly build and deconstruct walls, floors and airlocks." icon = 'icons/obj/tools.dmi' icon_state = "rcd" - opacity = 0 - density = 0 - anchored = 0 flags = CONDUCT | NOBLUDGEON force = 0 throwforce = 10 @@ -51,24 +29,36 @@ GLOBAL_LIST_INIT(rcd_door_types, list( req_access = list(ACCESS_ENGINE) armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF - // Important shit + /// The spark system used to create sparks when the user interacts with the RCD. var/datum/effect_system/spark_spread/spark_system - var/matter = 0 - var/max_matter = 100 - var/mode = RCD_MODE_TURF - var/canRwall = 0 - - // UI shit - var/menu = RCD_PAGE_MAIN + /// The current amount of matter stored. + var/matter = NONE + /// The max amount of matter that can be stored. + var/max_matter = MATTER_100 + /// The RCD's current build mode. + var/mode = MODE_TURF + /// If the RCD can deconstruct reinforced walls. + var/canRwall = FALSE + /// Is the RCD's airlock access selection menu locked? var/locked = TRUE + /// The current airlock type that will be build. var/door_type = /obj/machinery/door/airlock + /// The name that newly build airlocks will receive. var/door_name = "Airlock" - var/list/door_accesses = list() - var/list/door_accesses_list = list() - var/one_access - - // Stupid shit - var/static/allowed_targets = list(/turf, /obj/structure/grille, /obj/structure/window, /obj/structure/lattice, /obj/machinery/door/airlock) + /// If this is TRUE, any airlocks that gets built will require only ONE of the checked accesses. If FALSE, it will require ALL of them. + var/one_access = TRUE + /// Which airlock tab the UI is currently set to display. + var/ui_tab = TAB_AIRLOCK_TYPE + /// A list of access numbers which have been checked off by the user in the UI. + var/list/selected_accesses = list() + /// A list of valid atoms that RCDs can target. Clicking on an atom with an RCD which is not in this list, will do nothing. + var/static/list/allowed_targets = list(/turf, /obj/structure/grille, /obj/structure/window, /obj/structure/lattice, /obj/machinery/door/airlock) + /// An associative list of airlock type paths as keys, and their names as values. + var/static/list/rcd_door_types = list() + /// An associative list containing an airlock's name, type path, and image. For use with the UI. + var/static/list/door_types_ui_list = list() + /// An associative list containing all station accesses. Includes their name and access number. For use with the UI. + var/static/list/door_accesses_list = list() /obj/item/rcd/Initialize() . = ..() @@ -77,9 +67,49 @@ GLOBAL_LIST_INIT(rcd_door_types, list( spark_system.attach(src) GLOB.rcd_list += src - door_accesses_list = list() - for(var/access in get_all_accesses()) - door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses)) + if(!length(rcd_door_types)) + rcd_door_types = list( + /obj/machinery/door/airlock = "Standard", + /obj/machinery/door/airlock/glass = "Standard (Glass)", + /obj/machinery/door/airlock/command = "Command", + /obj/machinery/door/airlock/command/glass = "Command (Glass)", + /obj/machinery/door/airlock/security = "Security", + /obj/machinery/door/airlock/security/glass = "Security (Glass)", + /obj/machinery/door/airlock/engineering = "Engineering", + /obj/machinery/door/airlock/engineering/glass = "Engineering (Glass)", + /obj/machinery/door/airlock/atmos = "Atmospherics", + /obj/machinery/door/airlock/atmos/glass = "Atmospherics (Glass)", + /obj/machinery/door/airlock/mining = "Mining", + /obj/machinery/door/airlock/mining/glass = "Mining (Glass)", + /obj/machinery/door/airlock/medical = "Medical", + /obj/machinery/door/airlock/medical/glass = "Medical (Glass)", + /obj/machinery/door/airlock/research = "Research", + /obj/machinery/door/airlock/research/glass = "Research (Glass)", + /obj/machinery/door/airlock/science = "Science", + /obj/machinery/door/airlock/science/glass = "Science (Glass)", + /obj/machinery/door/airlock/maintenance = "Maintenance", + /obj/machinery/door/airlock/maintenance/glass = "Maintenance (Glass)", + /obj/machinery/door/airlock/maintenance/external = "External Maintenance", + /obj/machinery/door/airlock/maintenance/external/glass = "External Maint. (Glass)", + /obj/machinery/door/airlock/external = "External", + /obj/machinery/door/airlock/external/glass = "External (Glass)", + /obj/machinery/door/airlock/hatch = "Airtight Hatch", + /obj/machinery/door/airlock/maintenance_hatch = "Maintenance Hatch", + /obj/machinery/door/airlock/freezer = "Freezer" + ) + if(!length(door_types_ui_list)) + for(var/type in rcd_door_types) + door_types_ui_list += list(list( + "name" = rcd_door_types[type], + "type" = type, + "image" = get_airlock_image(type) + )) + if(!length(door_accesses_list)) + for(var/access in get_all_accesses()) + door_accesses_list += list(list( + "name" = get_access_desc(access), + "id" = access + )) /obj/item/rcd/examine(mob/user) . = ..() @@ -91,15 +121,29 @@ GLOBAL_LIST_INIT(rcd_door_types, list( GLOB.rcd_list -= src return ..() +/** + * Creates and returns a base64 icon of the given `airlock_type`. + * + * This is used for airlock icon previews in the UI. + * + * Arugments: + * * airlock_type - an airlock typepath. + */ /obj/item/rcd/proc/get_airlock_image(airlock_type) - var/obj/machinery/door/airlock/proto = airlock_type - var/ic = initial(proto.icon) - var/mutable_appearance/MA = mutable_appearance(ic, "closed") - if(!initial(proto.glass)) - MA.overlays += "fill_closed" - // Not scaling these down to button size because they look horrible then, instead just bumping up radius. - return MA + var/obj/machinery/door/airlock/proto = new airlock_type(null) + proto.icon_state = "closed" + if(!proto.glass) + proto.add_overlay("fill_closed") + var/icon/I = getFlatIcon(proto) + qdel(proto) + return "[icon2base64(I)]" +/** + * Runs a series of pre-checks before opening the radial menu to the user. + * + * Arguments: + * * user - the mob trying to open the radial menu. + */ /obj/item/rcd/proc/check_menu(mob/living/user) if(!istype(user)) return FALSE @@ -108,33 +152,41 @@ GLOBAL_LIST_INIT(rcd_door_types, list( return TRUE /obj/item/rcd/attackby(obj/item/W, mob/user, params) - ..() + if(!istype(W, /obj/item/rcd_ammo)) + return ..() - if(istype(W, /obj/item/rcd_ammo)) - var/obj/item/rcd_ammo/R = W - if((matter + R.ammoamt) > max_matter) - to_chat(user, "The RCD can't hold any more matter-units.") - return - matter += R.ammoamt - if(!user.unEquip(R)) - to_chat(user, "[R] is stuck to your hand!") - return - qdel(R) - playsound(loc, 'sound/machines/click.ogg', 50, 1) - to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") - SSnanoui.update_uis(src) + var/obj/item/rcd_ammo/R = W + if((matter + R.ammoamt) > max_matter) + to_chat(user, "The RCD can't hold any more matter-units.") + return + if(!user.unEquip(R)) + to_chat(user, "[R] is stuck to your hand!") + return + + matter += R.ammoamt + qdel(R) + playsound(loc, 'sound/machines/click.ogg', 50, 1) + to_chat(user, "The RCD now holds [matter]/[max_matter] matter-units.") + SStgui.update_uis(src) + +/** + * Creates and displays a radial menu to a user when they trigger the `attack_self` of the RCD. + * + * Arguments: + * * user - the mob trying to open the RCD radial. + */ /obj/item/rcd/proc/radial_menu(mob/user) if(!check_menu(user)) return var/list/choices = list( - RCD_MODE_AIRLOCK = image(icon = 'icons/obj/interface.dmi', icon_state = "airlock"), - RCD_MODE_DECON = image(icon = 'icons/obj/interface.dmi', icon_state = "delete"), - RCD_MODE_WINDOW = image(icon = 'icons/obj/interface.dmi', icon_state = "grillewindow"), - RCD_MODE_TURF = image(icon = 'icons/obj/interface.dmi', icon_state = "wallfloor"), + MODE_AIRLOCK = image(icon = 'icons/obj/interface.dmi', icon_state = "airlock"), + MODE_DECON = image(icon = 'icons/obj/interface.dmi', icon_state = "delete"), + MODE_WINDOW = image(icon = 'icons/obj/interface.dmi', icon_state = "grillewindow"), + MODE_TURF = image(icon = 'icons/obj/interface.dmi', icon_state = "wallfloor"), "UI" = image(icon = 'icons/obj/interface.dmi', icon_state = "ui_interact") ) - if(mode == RCD_MODE_AIRLOCK) + if(mode == MODE_AIRLOCK) choices += list( "Change Access" = image(icon = 'icons/obj/interface.dmi', icon_state = "access"), "Change Airlock Type" = image(icon = 'icons/obj/interface.dmi', icon_state = "airlocktype") @@ -144,15 +196,18 @@ GLOBAL_LIST_INIT(rcd_door_types, list( if(!check_menu(user)) return switch(choice) - if(RCD_MODE_AIRLOCK, RCD_MODE_DECON, RCD_MODE_WINDOW, RCD_MODE_TURF) + if(MODE_AIRLOCK, MODE_DECON, MODE_WINDOW, MODE_TURF) mode = choice if("UI") - menu = RCD_PAGE_MAIN - ui_interact(user) + tgui_interact(user) return - if("Change Access", "Change Airlock Type") - menu = RCD_PAGE_AIRLOCK - ui_interact(user) + if("Change Access") + ui_tab = TAB_AIRLOCK_ACCESS + tgui_interact(user) + return + if("Change Airlock Type") + ui_tab = TAB_AIRLOCK_TYPE + tgui_interact(user) return else return @@ -167,87 +222,131 @@ GLOBAL_LIST_INIT(rcd_door_types, list( /obj/item/rcd/attack_self_tk(mob/user) radial_menu(user) -/obj/item/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = GLOB.inventory_state) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/item/rcd/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_inventory_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "rcd.tmpl", "[name]", 450, 400, state = state) + ui = new(user, src, ui_key, "RCD", "Rapid Construction Device", 471, 673, master_ui, state) ui.open() - ui.set_auto_update(1) - -/obj/item/rcd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.inventory_state) - var/data[0] - data["mode"] = mode - data["door_type"] = door_type - data["door_name"] = door_name - data["menu"] = menu - data["matter"] = matter - data["max_matter"] = max_matter - data["one_access"] = one_access - data["locked"] = locked - - if(menu == RCD_PAGE_AIRLOCK) - var/list/door_types_list = list() - for(var/type in GLOB.rcd_door_types) - door_types_list[++door_types_list.len] = list("name" = GLOB.rcd_door_types[type], "type" = type) - data["allowed_door_types"] = door_types_list - - data["door_accesses"] = door_accesses_list +/obj/item/rcd/tgui_data(mob/user) + var/list/data = list( + "tab" = ui_tab, + "mode" = mode, + "locked" = locked, + "matter" = matter, + "door_type" = door_type, + "door_name" = door_name, + "one_access" = one_access, + "selected_accesses" = selected_accesses, + "modal" = tgui_modal_data(src) + ) return data -/obj/item/rcd/Topic(href, href_list, nowindow, state) +/obj/item/rcd/tgui_static_data(mob/user) + var/list/data = list( + "max_matter" = max_matter, + "regions" = get_accesslist_static_data(REGION_GENERAL, REGION_COMMAND), + "door_accesses_list" = door_accesses_list, + "door_types_ui_list" = door_types_ui_list + ) + return data + +/obj/item/rcd/tgui_act(action, list/params) if(..()) - return 1 + return if(prob(20)) spark_system.start() - if(href_list["mode"]) - mode = href_list["mode"] - . = 1 + if(tgui_act_modal(action, params)) + return TRUE - if(href_list["door_type"]) - var/new_door_type = text2path(href_list["door_type"]) - if(!(new_door_type in GLOB.rcd_door_types)) - message_admins("RCD Door HREF exploit attempted by [key_name(usr)]!") - return - door_type = new_door_type - . = 1 + . = TRUE + switch(action) + if("set_tab") + var/tab = text2num(params["tab"]) + if(!(tab in list(TAB_AIRLOCK_TYPE, TAB_AIRLOCK_ACCESS))) + return FALSE + ui_tab = tab - if(href_list["menu"]) - menu = text2num(href_list["menu"]) - . = 1 + if("mode") + var/new_mode = params["mode"] + if(!(new_mode in list(MODE_TURF, MODE_AIRLOCK, MODE_DECON, MODE_WINDOW))) + return FALSE + mode = new_mode - if(href_list["login"]) - if(allowed(usr)) - locked = FALSE - . = 1 + if("door_type") + var/new_door_type = text2path(params["door_type"]) + if(!(new_door_type in rcd_door_types)) + message_admins("RCD Door HREF exploit attempted by [key_name(usr)]!") + return FALSE + door_type = new_door_type - if(href_list["logout"]) - locked = TRUE - . = 1 + if("set_lock") + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return FALSE + locked = params["new_lock"] == "lock" ? TRUE : FALSE - if(!locked) - if(href_list["toggle_one_access"]) - one_access = !one_access - . = 1 + if("set_one_access") + one_access = params["access"] == "one" ? TRUE : FALSE - if(href_list["toggle_access"]) - var/href_access = text2num(href_list["toggle_access"]) - if(href_access in door_accesses) - door_accesses -= href_access + if("set") + var/access = text2num(params["access"]) + if(isnull(access)) + return + if(access in selected_accesses) + selected_accesses -= access else - door_accesses += href_access - door_accesses_list = list() - for(var/access in get_all_accesses()) - door_accesses_list[++door_accesses_list.len] = list("name" = get_access_desc(access), "id" = access, "enabled" = (access in door_accesses)) - . = 1 + selected_accesses |= access - if(href_list["choice"]) - var/temp_t = sanitize(copytext(input("Enter a custom Airlock Name.", "Airlock Name"), 1, MAX_MESSAGE_LEN)) - if(temp_t) - door_name = temp_t + if("grant_region") + var/region = text2num(params["region"]) + if(isnull(region) || region < REGION_GENERAL || region > REGION_COMMAND) + return + selected_accesses |= get_region_accesses(region) + if("deny_region") + var/region = text2num(params["region"]) + if(isnull(region) || region < REGION_GENERAL || region > REGION_COMMAND) + return + selected_accesses -= get_region_accesses(region) + + if("clear_all") + selected_accesses = list() + + if("grant_all") + selected_accesses = get_all_accesses() + +/** + * Called in tgui_act() to process modal actions + * + * Arguments: + * * action - The action passed by tgui + * * params - The params passed by tgui + */ +/obj/item/rcd/proc/tgui_act_modal(action, list/params) + . = TRUE + switch(tgui_modal_act(src, action, params)) + if(TGUI_MODAL_OPEN) + tgui_modal_input(src, "renameAirlock", "Enter a new name:", value = door_name, max_length = TGUI_MODAL_INPUT_MAX_LENGTH_NAME) + if(TGUI_MODAL_ANSWER) + var/answer = params["answer"] + if(!answer) + return + door_name = sanitize(copytext(answer, 1, TGUI_MODAL_INPUT_MAX_LENGTH_NAME)) + else + return FALSE + +/** + * Called in `afterattack()` if `mode` is set to `MODE_TURF`. + * + * Creates either a plating, or a wall, depending on the turf that already exists at the location. + * + * Arguments: + * * A - the location we're trying to build at. + * * user - the mob using the RCD. + */ /obj/item/rcd/proc/mode_turf(atom/A, mob/user) if(isspaceturf(A) || istype(A, /obj/structure/lattice)) if(useResource(1, user)) @@ -279,6 +378,15 @@ GLOBAL_LIST_INIT(rcd_door_types, list( playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE +/** + * Called in `afterattack()` if `mode` is set to `MODE_AIRLOCK`. + * + * Creates an `door_type` airlock at the given location `A`, and assigns it accesses from `selected_accesses`. + * + * Arguments: + * * A - the location we're trying to build at. + * * user - the mob using the RCD. + */ /obj/item/rcd/proc/mode_airlock(atom/A, mob/user) if(isfloorturf(A)) if(checkResource(10, user)) @@ -294,9 +402,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list( T.name = door_name T.autoclose = TRUE if(one_access) - T.req_one_access = door_accesses.Copy() + T.req_one_access = selected_accesses.Copy() else - T.req_access = door_accesses.Copy() + T.req_access = selected_accesses.Copy() return FALSE return FALSE to_chat(user, "ERROR! Not enough matter in unit to construct this airlock!") @@ -306,6 +414,16 @@ GLOBAL_LIST_INIT(rcd_door_types, list( playsound(loc, 'sound/machines/click.ogg', 50, 1) return FALSE +/** + * Called in `afterattack()` if `mode` is set to `MODE_DECON`. + * + * Deconstrcts the target atom `A`. + * Valid atoms are: basic walls, reinforced walls (if `canRwall` is `TRUE`), airlocks, and windows. + * + * Arguments: + * * A - the location we're trying to build at. + * * user - the mob using the RCD. + */ /obj/item/rcd/proc/mode_decon(atom/A, mob/user) if(iswallturf(A)) if(istype(A, /turf/simulated/wall/r_wall) && !canRwall) @@ -362,13 +480,13 @@ GLOBAL_LIST_INIT(rcd_door_types, list( if(!checkResource(2, user)) to_chat(user, "ERROR! Not enough matter in unit to deconstruct this window!") playsound(loc, 'sound/machines/click.ogg', 50, 1) - return 0 + return FALSE to_chat(user, "Deconstructing window...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(!do_after(user, 20 * toolspeed, target = A)) - return 0 + return FALSE if(!useResource(2, user)) - return 0 + return FALSE playsound(loc, usesound, 50, 1) var/turf/T1 = get_turf(A) QDEL_NULL(A) @@ -388,22 +506,31 @@ GLOBAL_LIST_INIT(rcd_door_types, list( return TRUE return FALSE +/** + * Called in `afterattack()` if `mode` is set to `MODE_WINDOW`. + * + * Constructs a grille and 4 reinforced window panes at the given location `A`. + * + * Arguments: + * * A - the location we're trying to build at. + * * user - the mob using the RCD. + */ /obj/item/rcd/proc/mode_window(atom/A, mob/user) if(isfloorturf(A)) if(locate(/obj/structure/grille) in A) - return 0 // We already have window + return FALSE // We already have window if(!checkResource(2, user)) to_chat(user, "ERROR! Not enough matter in unit to construct this window!") playsound(loc, 'sound/machines/click.ogg', 50, 1) - return 0 + return FALSE to_chat(user, "Constructing window...") playsound(loc, 'sound/machines/click.ogg', 50, 1) if(!do_after(user, 20 * toolspeed, target = A)) - return 0 + return FALSE if(locate(/obj/structure/grille) in A) - return 0 // We already have window + return FALSE // We already have window if(!useResource(2, user)) - return 0 + return FALSE playsound(loc, usesound, 50, 1) new /obj/structure/grille(A) for(var/obj/structure/window/W in A) @@ -419,10 +546,10 @@ GLOBAL_LIST_INIT(rcd_door_types, list( W.dir = cdir var/turf/AT = A AT.ChangeTurf(/turf/simulated/floor/plating) // Platings go under windows. - return 1 + return TRUE to_chat(user, "ERROR! Location unsuitable for window construction!") playsound(loc, 'sound/machines/click.ogg', 50, 1) - return 0 + return FALSE /obj/item/rcd/afterattack(atom/A, mob/user, proximity) if(!proximity) @@ -433,54 +560,77 @@ GLOBAL_LIST_INIT(rcd_door_types, list( return FALSE switch(mode) - if(RCD_MODE_TURF) + if(MODE_TURF) . = mode_turf(A, user) - if(RCD_MODE_AIRLOCK) + if(MODE_AIRLOCK) . = mode_airlock(A, user) - if(RCD_MODE_DECON) + if(MODE_DECON) . = mode_decon(A, user) - if(RCD_MODE_WINDOW) + if(MODE_WINDOW) . = mode_window(A, user) else to_chat(user, "ERROR: RCD in MODE: [mode] attempted use by [user]. Send this text #coderbus or an admin.") . = 0 - SSnanoui.update_uis(src) + SStgui.update_uis(src) +/** + * Called in each of the four build modes after an object is successfully built. + * + * Subtracts the amount of matter used from `matter`. + * + * Arguments: + * * amount - the amount of matter that was used. + */ /obj/item/rcd/proc/useResource(amount, mob/user) if(matter < amount) - return 0 + return FALSE matter -= amount - SSnanoui.update_uis(src) - return 1 + SStgui.update_uis(src) + return TRUE +/** + * Called in each of the four build modes before an object gets build. Makes sure there is enough matter to build the object. + * + * Arguments: + * * amount - an amount of matter to check for + */ /obj/item/rcd/proc/checkResource(amount, mob/user) return matter >= amount /obj/item/rcd/borg - canRwall = 1 - var/use_multiplier = 160 + canRwall = TRUE + /// A multipler which is applied to matter amount checks. A higher number means more power usage per RCD usage. + var/power_use_multiplier = 160 /obj/item/rcd/borg/syndicate - use_multiplier = 80 + power_use_multiplier = 80 /obj/item/rcd/borg/useResource(amount, mob/user) if(!isrobot(user)) - return 0 + return FALSE var/mob/living/silicon/robot/R = user - return R.cell.use(amount * use_multiplier) + return R.cell.use(amount * power_use_multiplier) /obj/item/rcd/borg/checkResource(amount, mob/user) if(!isrobot(user)) - return 0 + return FALSE var/mob/living/silicon/robot/R = user - return R.cell.charge >= (amount * use_multiplier) + return R.cell.charge >= (amount * power_use_multiplier) +/** + * Called from malf AI's "detonate RCD" ability. + * + * Creates a delayed explosion centered around the RCD. + */ /obj/item/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and buzz loudly!", "[src] begins vibrating violently!") // 5 seconds to get rid of it addtimer(CALLBACK(src, .proc/detonate_pulse_explode), 50) +/** + * Called in `/obj/item/rcd/proc/detonate_pulse()` via callback. + */ /obj/item/rcd/proc/detonate_pulse_explode() explosion(src, 0, 0, 3, 1, flame_range = 1) qdel(src) @@ -490,9 +640,9 @@ GLOBAL_LIST_INIT(rcd_door_types, list( /obj/item/rcd/combat name = "combat RCD" - max_matter = 500 - matter = 500 - canRwall = 1 + max_matter = MATTER_500 + matter = MATTER_500 + canRwall = TRUE /obj/item/rcd_ammo name = "compressed matter cartridge" @@ -500,12 +650,15 @@ GLOBAL_LIST_INIT(rcd_door_types, list( icon = 'icons/obj/ammo.dmi' icon_state = "rcd" item_state = "rcdammo" - opacity = 0 - density = 0 - anchored = 0.0 + opacity = FALSE + density = FALSE + anchored = FALSE origin_tech = "materials=3" materials = list(MAT_METAL=16000, MAT_GLASS=8000) var/ammoamt = 20 /obj/item/rcd_ammo/large ammoamt = 100 + +#undef MATTER_100 +#undef MATTER_500 diff --git a/code/game/objects/items/weapons/fireworks.dm b/code/game/objects/items/weapons/fireworks.dm deleted file mode 100644 index 906c4f3fef7..00000000000 --- a/code/game/objects/items/weapons/fireworks.dm +++ /dev/null @@ -1,67 +0,0 @@ -/obj/item/firework - name = "fireworks" - icon = 'icons/obj/fireworks.dmi' - icon_state = "rocket_0" - var/litzor = 0 - var/datum/effect_system/sparkle_spread/S - -/obj/item/firework/attackby(obj/item/W,mob/user, params) - if(litzor) - return - if(is_hot(W)) - for(var/mob/M in viewers(user)) - to_chat(M, "[user] lits \the [src]") - litzor = 1 - icon_state = "rocket_1" - S = new() - S.set_up(5,0,src.loc) - sleep(30) - if(ismob(src.loc) || isobj(src.loc)) - S.attach(src.loc) - S.start() - qdel(src) - -/obj/item/sparkler - name = "sparkler" - icon = 'icons/obj/fireworks.dmi' - icon_state = "sparkler_0" - var/litzor = 0 - -/obj/item/sparkler/attackby(obj/item/W,mob/user, params) - if(litzor) - return - if(is_hot(W)) - for(var/mob/M in viewers(user)) - to_chat(M, "[user] lits \the [src]") - litzor = 1 - icon_state = "sparkler_1" - var/b = rand(5,9) - for(var/xy, xy<=b, xy++) - do_sparks(1, 0, loc) - sleep(10) - qdel(src) - -// TODO: Refactor this into a proper locker or something -// Or just axe the system. This code is 7 years old -/obj/crate/fireworks - name = "Fireworks!" - -/obj/crate/fireworks/New() - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/sparkler(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) - new /obj/item/firework(src) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 13f9dd8f49d..06ec9cded0c 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -17,6 +17,10 @@ do_sparks(rand(5, 9), FALSE, src) playsound(T, 'sound/effects/bang.ogg', 100, TRUE) new /obj/effect/dummy/lighting_obj(T, light_color, range + 2, light_power, light_time) + // Blob damage + for(var/obj/structure/blob/B in hear(range + 1, T)) + var/damage = round(30 / (get_dist(B, T) + 1)) + B.take_damage(damage, BURN, "melee", FALSE) // Stunning & damaging mechanic bang(T, src, range) @@ -25,7 +29,6 @@ /** * Creates a flashing effect that blinds and deafens mobs within range * - * Also damages blobs * Arguments: * * T - The turf to flash * * A - The flashing atom @@ -34,10 +37,6 @@ * * bang - Whether to bang (deafen) */ /proc/bang(turf/T, atom/A, range = 7, flash = TRUE, bang = TRUE) - // Blob damage - for(var/obj/structure/blob/B in hear(range + 1, T)) - var/damage = round(30 / (get_dist(B, T) + 1)) - B.take_damage(damage, BURN, "melee", FALSE) // Flashing mechanic var/source_turf = get_turf(A) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 52b70590ee4..715c3754fc6 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -1,3 +1,4 @@ +// TODO: Refactor these into spawners /obj/random name = "Random Object" desc = "This item type is used to spawn random objects at round-start" diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index 47731fd48d3..8fa6e0d7dd1 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -5,7 +5,7 @@ icon_state = "spirit_board" density = 1 anchored = 0 - var/virgin = 1 + var/used = FALSE var/cooldown = 0 var/planchette = "A" var/lastuser = null @@ -28,8 +28,8 @@ if(!spirit_board_checks(M)) return 0 - if(virgin) - virgin = 0 + if(!used) + used = TRUE notify_ghosts("Someone has begun playing with a [src.name] in [get_area(src)]!", source = src) planchette = input("Choose the letter.", "Seance!") in list("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z") diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/db_ban/functions.dm similarity index 100% rename from code/modules/admin/DB ban/functions.dm rename to code/modules/admin/db_ban/functions.dm diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index d2c05ff4f6c..3069398f738 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -145,7 +145,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) GLOB.LastAdminCalledTargetUID = target.UID() GLOB.AdminProcCaller = ckey //if this runtimes, too bad for you ++GLOB.AdminProcCallCount - . = world.WrapAdminProcCall(target, procname, arguments) + try + . = world.WrapAdminProcCall(target, procname, arguments) + catch + to_chat(usr, "Your proc call failed to execute, likely from runtimes. You should be out of safety mode. If not, god help you.") + if(--GLOB.AdminProcCallCount == 0) GLOB.AdminProcCaller = null diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm index 048939a7c6d..c474cf785e2 100644 --- a/code/modules/admin/verbs/vox_raiders.dm +++ b/code/modules/admin/verbs/vox_raiders.dm @@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(vox_tick, 1) equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(src), slot_glasses) // REPLACE WITH CODED VOX ALTERNATIVE. equip_to_slot_or_del(new /obj/item/chameleon(src), slot_l_store) - var/obj/item/gun/projectile/automatic/spikethrower/W = new(src) + var/obj/item/gun/energy/spikethrower/W = new(src) equip_to_slot_or_del(W, slot_r_hand) diff --git a/code/modules/arcade/mob_hunt/mob_datums.dm b/code/modules/arcade/mob_hunt/mob_datums.dm index 25a4569ede9..56a88d589ad 100644 --- a/code/modules/arcade/mob_hunt/mob_datums.dm +++ b/code/modules/arcade/mob_hunt/mob_datums.dm @@ -88,8 +88,9 @@ return 0 while(possible_areas.len) //randomly select an area from our possible_areas list to try spawning in, then remove it from possible_areas so it won't get picked over and over forever. - var/area/spawn_area = locate(pickweight(possible_areas)) - possible_areas -= spawn_area + var/spawn_area_path = pickweight(possible_areas) + var/area/spawn_area = locate(spawn_area_path) + possible_areas -= spawn_area_path if(!spawn_area) break //clear and generate a fresh list of turfs in the selected area, weighted based on white/black lists diff --git a/code/modules/client/client defines.dm b/code/modules/client/client_defines.dm similarity index 100% rename from code/modules/client/client defines.dm rename to code/modules/client/client_defines.dm diff --git a/code/modules/client/client procs.dm b/code/modules/client/client_procs.dm similarity index 100% rename from code/modules/client/client procs.dm rename to code/modules/client/client_procs.dm diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 5c70fc9f87b..2ec3b792d1e 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -2104,9 +2104,9 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts toggles ^= PREFTOGGLE_AMBIENT_OCCLUSION if(parent && parent.screen && parent.screen.len) var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen - PM.remove_filter(AMBIENT_OCCLUSION_FILTER_KEY) + PM.filters -= FILTER_AMBIENT_OCCLUSION if(toggles & PREFTOGGLE_AMBIENT_OCCLUSION) - PM.add_filter(AMBIENT_OCCLUSION_FILTER_KEY, FILTER_AMBIENT_OCCLUSION) + PM.filters += FILTER_AMBIENT_OCCLUSION if("parallax") var/parallax_styles = list( diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 67e001987d2..e52f5c303be 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -200,13 +200,24 @@ /obj/item/clothing/glasses/hud/skills name = "Skills HUD" desc = "A heads-up display capable of showing the employment history records of NT crew members." - icon_state = "material" + icon_state = "skill" item_state = "glasses" + sprite_sheets = list( + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) /obj/item/clothing/glasses/hud/skills/sunglasses name = "Skills HUD Sunglasses" desc = "Sunglasses with a build-in skills HUD, showing the employment history of nearby NT crew members." + icon_state = "sunhudskill" see_in_dark = 1 // None of these three can be converted to booleans. Do not try it. flash_protect = 1 tint = 1 prescription_upgradable = TRUE + sprite_sheets = list( + "Drask" = 'icons/mob/species/drask/eyes.dmi', + "Grey" = 'icons/mob/species/grey/eyes.dmi', + "Vox" = 'icons/mob/species/vox/eyes.dmi' + ) diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm deleted file mode 100644 index 60b774a2a3d..00000000000 --- a/code/modules/economy/POS.dm +++ /dev/null @@ -1,537 +0,0 @@ -/************************ -* Point Of Sale -* -* Takes cash or credit. -*************************/ - -/line_item - parent_type = /datum - - var/name = "" - var/price = 0 // Per unit - var/units = 0 - -GLOBAL_VAR_INIT(current_pos_id, 1) -GLOBAL_VAR_INIT(pos_sales, 0) - -#define RECEIPT_HEADER {" - - - - -"} -#define POS_HEADER {" - - - - -"} - -#define POS_TAX_RATE 0.10 // 10% - -#define POS_SCREEN_LOGIN 0 -#define POS_SCREEN_ORDER 1 -#define POS_SCREEN_FINALIZE 2 -#define POS_SCREEN_PRODUCTS 3 -#define POS_SCREEN_IMPORT 4 -#define POS_SCREEN_EXPORT 5 -#define POS_SCREEN_SETTINGS 6 -/obj/machinery/pos - icon = 'icons/obj/machines/pos.dmi' - icon_state = "pos" - density = 0 - name = "point of sale" - desc = "Also known as a cash register, or, more commonly, \"robbery magnet\"." - - var/id = 0 - var/sales = 0 - var/department - var/mob/logged_in - var/datum/money_account/linked_account - - var/credits_held = 0 - var/credits_needed = 0 - - var/list/products = list() // name = /line_item - var/list/line_items = list() // # = /line_item - - var/screen=POS_SCREEN_LOGIN - -/obj/machinery/pos/New() - ..() - id = GLOB.current_pos_id++ - if(department) - linked_account = GLOB.department_accounts[department] - else - linked_account = GLOB.station_account - update_icon() - -/obj/machinery/pos/proc/AddToOrder(var/name, var/units) - if(!(name in products)) - return 0 - var/line_item/LI = products[name] - var/line_item/LIC = new - LIC.name=LI.name - LIC.price=LI.price - LIC.units=units - line_items.Add(LIC) - -/obj/machinery/pos/proc/RemoveFromOrder(var/order_id) - line_items.Cut(order_id,order_id+1) - -/obj/machinery/pos/proc/NewOrder() - line_items.Cut() - -/obj/machinery/pos/proc/PrintReceipt(var/order_id) - var/receipt = {"[RECEIPT_HEADER]
POINT OF SALE #[id]
- Paying to: [linked_account.owner_name]
- Cashier: [logged_in]
"} - if(myArea) - receipt += myArea.name - receipt += "
" - receipt += {"
-
[station_time_timestamp()], [GLOB.current_date_string]
- - - - - - - "} - var/subtotal=0 - for(var/i=1;i<=line_items.len;i++) - var/line_item/LI = line_items[i] - var/linetotal=LI.units*LI.price - receipt += "" - subtotal += linetotal - var/taxes = POS_TAX_RATE*subtotal - receipt += {" - - - - - - "} - receipt += {" - - "} - receipt += "
ItemAmountUnit PriceLine Total
[LI.name][LI.units]$[num2septext(LI.price)]$[num2septext(linetotal)]
SUBTOTAL$[num2septext(subtotal)]
TAXES$[num2septext(taxes)]
TOTAL$[num2septext(taxes+subtotal)] -
" - - playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) - var/obj/item/paper/P = new(loc) - P.name="Receipt #[id]-[++sales]" - P.info=receipt - - P = new(loc) - P.name="Receipt #[id]-[sales] (Cashier Copy)" - P.info=receipt - - -/obj/machinery/pos/proc/LoginScreen() - return "
Please swipe ID to log in.
" - -/obj/machinery/pos/proc/OrderScreen() - var/receipt = {"
- POS Info - POINT OF SALE #[id]
- Paying to: [linked_account.owner_name]
- Cashier: [logged_in]
"} - if(myArea) - receipt += myArea.name - receipt += "
" - receipt += {"
Order Data -
- - - - - - - - - "} - var/subtotal=0 - if(line_items.len>0) - for(var/i=1;i<=line_items.len;i++) - var/line_item/LI = line_items[i] - var/linetotal=LI.units*LI.price - receipt += {" - - - - - - "} - subtotal += linetotal - var/taxes = POS_TAX_RATE*subtotal - var/presets = "(No presets available)" - if(products.len>0) - presets = {"" - receipt += {" - - - - - - - - - - - "} - receipt += {" - - "} - receipt += {"
ItemAmountUnit PriceLine Total...
[LI.name][LI.units]$[num2septext(LI.price)]$[num2septext(linetotal)]×
[presets] units
SUBTOTAL$[num2septext(subtotal)]
TAXES$[num2septext(taxes)]
TOTAL$[num2septext(taxes+subtotal)] -
- - -
-
"} - return receipt - -/obj/machinery/pos/proc/ProductsScreen() - var/dat={"
Product List -
- - - - - - - - "} - for(var/i in products) - var/line_item/LI = products[i] - dat += {" - - - - - "} - dat += {"
ItemUnit Price# Sold...
[LI.name]$[num2septext(LI.price)][LI.units]×
- New Product:
-
- $
-
- Import | Export -
-
"} - return dat - -/obj/machinery/pos/proc/ExportScreen() - var/dat={"
Export Products as CSV - - OK -
"} - return dat - -/obj/machinery/pos/proc/ImportScreen() - var/dat={"
- Import Products as CSV -
- - -

Data must be in the form of a CSV, with no headers or quotation marks.

-

First column must be product names, second must be prices as an unformatted number (####.##)

-

Deviations from this format will result in your import being rejected.

- -
-
"} - return dat - -/obj/machinery/pos/proc/FinalizeScreen() - return "
Waiting for Credit
Cancel
" - -/obj/machinery/pos/proc/SettingsScreen() - var/dat={"
- -
- Account Settings -
- Payable Account: -
-
-
- Locality Settings -
- Tax Rate: % (LOCKED) -
-
- -
"} - return dat - -/obj/machinery/pos/update_icon() - overlays = 0 - if(stat & (NOPOWER|BROKEN)) return - if(logged_in) - overlays += "pos-working" - else - overlays += "pos-standby" - -/obj/machinery/pos/attack_hand(var/mob/user) - user.set_machine(src) - var/logindata="" - if(logged_in) - logindata={"[logged_in.name]"} - var/dat = POS_HEADER + {" - "} - switch(screen) - if(POS_SCREEN_LOGIN) dat += LoginScreen() - if(POS_SCREEN_ORDER) dat += OrderScreen() - if(POS_SCREEN_FINALIZE) dat += FinalizeScreen() - if(POS_SCREEN_PRODUCTS) dat += ProductsScreen() - if(POS_SCREEN_EXPORT) dat += ExportScreen() - if(POS_SCREEN_IMPORT) dat += ImportScreen() - if(POS_SCREEN_SETTINGS) dat += SettingsScreen() - - dat += "" - // END AUTOFIX - user << browse(dat, "window=pos") - onclose(user, "pos") - return - -/obj/machinery/pos/proc/say(var/text) - src.visible_message("[bicon(src)] [name] states, \"[text]\"") - -/obj/machinery/pos/Topic(var/href, var/list/href_list) - if(..(href,href_list)) return - if("logout" in href_list) - if(alert(src, "You sure you want to log out?", "Confirm", "Yes", "No")!="Yes") return - logged_in=null - screen=POS_SCREEN_LOGIN - update_icon() - src.attack_hand(usr) - return - if(usr != logged_in) - to_chat(usr, "[logged_in.name] is already logged in. You cannot use this machine until they log out.") - return - if("act" in href_list) - switch(href_list["act"]) - if("Reset") - NewOrder() - screen=POS_SCREEN_ORDER - if("Finalize Sale") - var/subtotal=0 - if(line_items.len>0) - for(var/i=1;i<=line_items.len;i++) - var/line_item/LI = line_items[i] - subtotal += LI.units*LI.price - var/taxes = POS_TAX_RATE*subtotal - credits_needed=taxes+subtotal - say("Your total is $[num2septext(credits_needed)]. Please insert credit chips or swipe your ID.") - screen=POS_SCREEN_FINALIZE - if("Add Product") - var/line_item/LI = new - LI.name=sanitize(href_list["name"]) - LI.price=text2num(href_list["price"]) - products["[products.len+1]"]=LI - if("Add to Order") - AddToOrder(href_list["preset"],text2num(href_list["units"])) - if("Add Products") - for(var/list/line in splittext(href_list["csv"],"\n")) - var/list/cells = splittext(line,",") - if(cells.len<2) - to_chat(usr, "The CSV must have at least two columns: Product Name, followed by Price (as a number).") - src.attack_hand(usr) - return - var/line_item/LI = new - LI.name=sanitize(cells[1]) - LI.price=text2num(cells[2]) - products["[products.len+1]"]=LI - if("Export Products") - screen=POS_SCREEN_EXPORT - if("Import Products") - screen=POS_SCREEN_IMPORT - if("Save Settings") - var/datum/money_account/new_linked_account = get_money_account(text2num(href_list["payableto"]),z) - if(!new_linked_account) - to_chat(usr, "Unable to link new account.") - else - linked_account = new_linked_account - screen=POS_SCREEN_SETTINGS - else if("screen" in href_list) - screen=text2num(href_list["screen"]) - else if("rmproduct" in href_list) - products.Remove(href_list["rmproduct"]) - else if("removefromorder" in href_list) - RemoveFromOrder(text2num(href_list["removefromorder"])) - else if("setunits" in href_list) - var/lid = text2num(href_list["setunits"]) - var/newunits = input(usr,"Enter the units sold.") as num - if(!newunits) return - var/line_item/LI = line_items[lid] - LI.units = newunits - line_items[lid]=LI - else if("setpname" in href_list) - var/newtext = sanitize(input(usr,"Enter the product's name.")) - if(!newtext) return - var/pid = href_list["setpname"] - var/line_item/LI = products[pid] - LI.name = newtext - products[pid]=LI - else if("setprice" in href_list) - var/newprice = input(usr,"Enter the product's price.") as num - if(!newprice) return - var/pid = href_list["setprice"] - var/line_item/LI = products[pid] - LI.price = newprice - products[pid]=LI - src.attack_hand(usr) - -/obj/machinery/pos/attackby(var/atom/movable/A, var/mob/user, params) - if(istype(A,/obj/item/card/id)) - var/obj/item/card/id/I = A - if(!logged_in) - user.visible_message("The machine beeps, and logs you in","You hear a beep.") - logged_in = user - screen=POS_SCREEN_ORDER - update_icon() - src.attack_hand(user) //why'd you use usr nexis, why - return - else - if(!linked_account) - visible_message("The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen.","You hear a buzz.") - flick(src,"pos-error") - return - if(screen!=POS_SCREEN_FINALIZE) - visible_message("The machine buzzes.","You hear a buzz.") - flick(src,"pos-error") - return - var/datum/money_account/acct = get_card_account(I) - if(!acct) - visible_message("The machine buzzes, and flashes \"NO ACCOUNT\" on the screen.","You hear a buzz.") - flick(src,"pos-error") - return - if(credits_needed > acct.money) - visible_message("The machine buzzes, and flashes \"NOT ENOUGH FUNDS\" on the screen.","You hear a buzz.") - flick(src,"pos-error") - return - visible_message("The machine beeps, and begins printing a receipt","You hear a beep.") - PrintReceipt() - NewOrder() - acct.charge(credits_needed,linked_account,"Purchase at POS #[id].") - credits_needed=0 - screen=POS_SCREEN_ORDER - else if(istype(A, /obj/item/stack/spacecash)) - if(!linked_account) - visible_message("The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen.","You hear a buzz.") - flick(src,"pos-error") - return - if(!logged_in || screen!=POS_SCREEN_FINALIZE) - visible_message("The machine buzzes.","You hear a buzz.") - flick(src,"pos-error") - return - var/obj/item/stack/spacecash/C = A - credits_held += C.amount - if(credits_held >= credits_needed) - visible_message("The machine beeps, and begins printing a receipt","You hear a beep and the sound of paper being shredded.") - PrintReceipt() - NewOrder() - credits_held -= credits_needed - credits_needed=0 - screen=POS_SCREEN_ORDER - if(credits_held) - new /obj/item/stack/spacecash(loc, credits_held) - credits_held=0 - return - return ..() diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm deleted file mode 100644 index acd10288d71..00000000000 --- a/code/modules/events/aurora_caelus.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/event/aurora_caelus - announceWhen = 5 - startWhen = 1 - endWhen = 50 - var/list/aurora_colors = list("#A2FF80", "#A2FF8B", "#A2FF96", "#A2FFA5", "#A2FFB6", "#A2FFC7", "#A2FFDE") - var/aurora_progress = 0 //this cycles from 1 to 7, slowly changing colors from gentle green to gentle blue - -/datum/event/aurora_caelus/announce() - GLOB.event_announcement.Announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. \ -Nanotrasen has approved a short break for all employees to relax and observe this very rare event. \ -During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. \ -Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. \ -We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division") - for(var/V in GLOB.player_list) - var/mob/M = V - if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z)) - M.playsound_local(null, 'sound/ambience/aurora_caelus.ogg', 20, FALSE, pressure_affected = FALSE) - -/datum/event/aurora_caelus/start() - for(var/area in GLOB.all_areas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/space/S in A) - S.set_light(S.light_range * 3, S.light_power * 0.5) - -/datum/event/aurora_caelus/tick() - if(aurora_progress >= aurora_colors.len) - return - if(activeFor % 5 == 0) - aurora_progress++ - var/aurora_color = aurora_colors[aurora_progress] - for(var/area in GLOB.all_areas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/space/S in A) - S.set_light(l_color = aurora_color) - -/datum/event/aurora_caelus/end() - for(var/area in GLOB.all_areas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/space/S in A) - fade_to_black(S) - GLOB.event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \ -When this has concluded, please return to your workplace and continue work as normal. \ -Have a pleasant shift, [station_name()], and thank you for watching with us.", -"Harmless ions dissipating", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division") - -/datum/event/aurora_caelus/proc/fade_to_black(turf/space/S) - set waitfor = FALSE - var/new_light = config.starlight - while(S.light_range > new_light) - S.set_light(S.light_range - 0.2) - sleep(30) - S.set_light(new_light, 1, l_color = "") // we should be able to use `, null` as the last arg but BYOND is a piece of FUCKING SHIT AND SET_LIGHT DOESN'T WORK THAT WAY DESPITE EVERY FUCKING THING ABOUT IT INDICATING THAT IT GODDAMN WELL SHOULD AAAAAAAAAAAAAAAAA diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index ae7094f73ec..7b165f34213 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -139,7 +139,6 @@ GLOBAL_LIST_EMPTY(event_last_fired) new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)), - new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE), new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/carp_migration/koi, 80,) ) diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 06ba1fc7a66..96475111ce3 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -1,3 +1,5 @@ + + // Cannabis /obj/item/seeds/cannabis name = "pack of cannabis seeds" @@ -14,9 +16,7 @@ icon_dead = "cannabis-dead" // Same for the dead icon genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/cannabis/rainbow, - /obj/item/seeds/cannabis/death, - /obj/item/seeds/cannabis/white, - /obj/item/seeds/cannabis/ultimate) + /obj/item/seeds/cannabis/white) reagents_add = list("thc" = 0.15, "cbd" = 0.15) @@ -27,7 +27,8 @@ species = "megacannabis" plantname = "Rainbow Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/rainbow - mutatelist = list() + mutatelist = list(/obj/item/seeds/cannabis/death, + /obj/item/seeds/cannabis/ultimate) reagents_add = list("lsd" = 0.15, "thc" = 0.15, "cbd" = 0.15) rarity = 40 @@ -49,7 +50,8 @@ species = "whitecannabis" plantname = "Lifeweed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/white - mutatelist = list() + mutatelist = list(/obj/item/seeds/cannabis/death, + /obj/item/seeds/cannabis/ultimate) reagents_add = list("omnizine" = 0.35, "thc" = 0.15, "cbd" = 0.15) rarity = 40 @@ -62,25 +64,24 @@ plantname = "Omega Weed" product = /obj/item/reagent_containers/food/snacks/grown/cannabis/ultimate mutatelist = list() - reagents_add = list("lsd" = 0.15, - "suicider" = 0.15, - "space_drugs" = 0.15, - "mercury" = 0.15, - "lithium" = 0.15, - "atropine" = 0.15, - "ephedrine" = 0.15, - "haloperidol" = 0.15, - "methamphetamine" = 0.15, - "thc" = 0.15, - "cbd" = 0.15, - "psilocybin" = 0.15, - "hairgrownium" = 0.15, - "ectoplasm" = 0.15, - "bath_salts" = 0.15, - "itching_powder" = 0.15, - "crank" = 0.15, - "krokodil" = 0.15, - "histamine" = 0.15) + reagents_add = list("lsd" = 0.05, + "suicider" = 0.05, + "space_drugs" = 0.05, + "mercury" = 0.05, + "lithium" = 0.05, + "ephedrine" = 0.05, + "haloperidol" = 0.05, + "methamphetamine" = 0.05, + "thc" = 0.05, + "cbd" = 0.05, + "psilocybin" = 0.05, + "hairgrownium" = 0.05, + "ectoplasm" = 0.05, + "bath_salts" = 0.05, + "itching_powder" = 0.05, + "crank" = 0.05, + "krokodil" = 0.05, + "histamine" = 0.05) rarity = 69 @@ -124,5 +125,4 @@ name = "omega cannibas leaf" desc = "You feel dizzy looking at it. What the fuck?" icon_state = "ocannabis" - volume = 420 wine_power = 0.9 diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index dbaa24fef34..889f2012d1e 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -336,6 +336,8 @@ M.move_to_delay = initial(M.move_to_delay) + base_speed_add if(M.stored_gun) M.stored_gun.overheat_time += base_cooldown_add + if(M.mind) + M.mind.offstation_role = TRUE /**********************Mining drone cube**********************/ diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 957b0828725..3a2b646e510 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -9,7 +9,7 @@ /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) if(client) - var/virgin = 1 //has the text been modified yet? + var/modified = FALSE //has the text been modified yet? var/temp = winget(client, "input", "text") if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //case sensitive means @@ -17,11 +17,11 @@ if(findtext(trim_left(temp), ":", 6, 7)) //dept radio temp = copytext(trim_left(temp), 8) - virgin = 0 + modified = TRUE - if(virgin) + if(!modified) temp = copytext(trim_left(temp), 6) //normal speech - virgin = 0 + modified = TRUE while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary) temp = copytext(trim_left(temp), 3) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 321362217a1..5520afe0cea 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -7,12 +7,12 @@ silence_time = null to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") - if(cable) - if(get_dist(src, cable) > 1) - var/turf/T = get_turf_or_move(loc) - for(var/mob/M in viewers(T)) - M.show_message("The data cable rapidly retracts back into its spool.", 3, "You hear a click and the sound of wire spooling rapidly.", 2) - QDEL_NULL(cable) + if(installed_software["doorjack"]) + var/datum/pai_software/door_jack/DJ = installed_software["doorjack"] + if(DJ.cable) + if(get_dist(src, DJ.cable) > 1) + visible_message("The data cable connected to [src] rapidly retracts back into its spool!") + QDEL_NULL(DJ.cable) /mob/living/silicon/pai/updatehealth(reason = "none given") if(status_flags & GODMODE) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 0a4e4cee898..a0edbc01c07 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -9,11 +9,8 @@ pass_flags = PASSTABLE density = 0 holder_type = /obj/item/holder/pai - var/network = "SS13" - var/obj/machinery/camera/current = null var/ram = 100 // Used as currency to purchase different abilities - var/list/software = list() var/userDNA // The DNA string of our assigned user var/obj/item/paicard/card // The card we inhabit var/obj/item/radio/radio // Our primary radio @@ -42,9 +39,6 @@ ) - - var/obj/item/pai_cable/cable // The cable we produce and use when door or camera jacking - var/master // Name of the one who commands us var/master_dna // DNA string for owner verification // Keeping this separate from the laws var, it should be much more difficult to modify @@ -64,17 +58,11 @@ var/secHUD = 0 // Toggles whether the Security HUD is active or not var/medHUD = 0 // Toggles whether the Medical HUD is active or not - var/medical_cannotfind = 0 - var/datum/data/record/medicalActive1 // Datacore record declarations for record software - var/datum/data/record/medicalActive2 + /// Currently active software + var/datum/pai_software/active_software - var/security_cannotfind = 0 - var/datum/data/record/securityActive1 // Could probably just combine all these into one - var/datum/data/record/securityActive2 - - var/obj/machinery/door/hackdoor // The airlock being hacked - var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check - var/hack_aborted = 0 + /// List of all installed software + var/list/datum/pai_software/installed_software = list() var/obj/item/integrated_radio/signal/sradio // AI's signaller @@ -109,20 +97,20 @@ //PDA pda = new(src) - spawn(5) - pda.ownjob = "Personal Assistant" - pda.owner = text("[]", src) - pda.name = pda.owner + " (" + pda.ownjob + ")" - var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger) - M.toff = 1 - ..() + pda.ownjob = "Personal Assistant" + pda.owner = "[src]" + pda.name = "[pda.owner] ([pda.ownjob])" + var/datum/data/pda/app/messenger/M = pda.find_program(/datum/data/pda/app/messenger) + M.toff = TRUE -/mob/living/silicon/pai/Destroy() - medicalActive1 = null - medicalActive2 = null - securityActive1 = null - securityActive2 = null - return ..() + // Software modules. No these var names have nothing to do with photoshop + for(var/PS in subtypesof(/datum/pai_software)) + var/datum/pai_software/PSD = new PS(src) + if(PSD.default) + installed_software[PSD.id] = PSD + + active_software = installed_software["mainmenu"] // Default us to the main menu + ..() /mob/living/silicon/pai/can_unbuckle() return FALSE @@ -159,12 +147,6 @@ for(var/obj/effect/proc_holder/P in proc_holder_list) statpanel("[P.panel]","",P) -/mob/living/silicon/pai/check_eye(var/mob/user as mob) - if(!current) - return null - user.reset_perspective(current) - return 1 - /mob/living/silicon/pai/blob_act() if(stat != DEAD) adjustBruteLoss(60) @@ -229,7 +211,7 @@ return -// See software.dm for Topic() +// See software.dm for tgui_act() /mob/living/silicon/pai/attack_animal(mob/living/simple_animal/M) . = ..() @@ -238,78 +220,6 @@ add_attack_logs(M, src, "Animal attacked for [damage] damage") adjustBruteLoss(damage) -/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) - usr:cameraFollow = null - if(!C) - unset_machine() - reset_perspective(null) - return 0 - if(stat == 2 || !C.status || !(network in C.network)) return 0 - - // ok, we're alive, camera is good and in our network... - - set_machine(src) - src:current = C - reset_perspective(C) - return 1 - -/mob/living/silicon/pai/verb/reset_record_view() - set category = "pAI Commands" - set name = "Reset Records Software" - - securityActive1 = null - securityActive2 = null - security_cannotfind = 0 - medicalActive1 = null - medicalActive2 = null - medical_cannotfind = 0 - SSnanoui.update_uis(src) - to_chat(usr, "You reset your record-viewing software.") - -/mob/living/silicon/pai/cancel_camera() - set category = "pAI Commands" - set name = "Cancel Camera View" - reset_perspective(null) - unset_machine() - src:cameraFollow = null - -//Addition by Mord_Sith to define AI's network change ability -/* -/mob/living/silicon/pai/proc/pai_network_change() - set category = "pAI Commands" - set name = "Change Camera Network" - reset_perspective(null) - unset_machine() - src:cameraFollow = null - var/cameralist[0] - - if(usr.stat == 2) - to_chat(usr, "You can't change your camera network because you are dead!") - return - - for(var/obj/machinery/camera/C in Cameras) - if(!C.status) - continue - else - if(C.network != "CREED" && C.network != "thunder" && C.network != "RD" && C.network != "toxins" && C.network != "Prison") COMPILE ERROR! This will have to be updated as camera.network is no longer a string, but a list instead - cameralist[C.network] = C.network - - network = input(usr, "Which network would you like to view?") as null|anything in cameralist - to_chat(src, "Switched to [network] camera network.") -//End of code by Mord_Sith -*/ - - -/* -// Debug command - Maybe should be added to admin verbs later -/mob/verb/makePAI(var/turf/t in view()) - var/obj/item/paicard/card = new(t) - var/mob/living/silicon/pai/pai = new(card) - pai.key = key - card.setPersonality(pai) - -*/ - // Procs/code after this point is used to convert the stationary pai item into a // mobile pai mob. This also includes handling some of the general shit that can occur // to it. Really this deserves its own file, but for the moment it can sit here. ~ Z diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 574dcda3230..ecc177a641c 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -10,113 +10,41 @@ GLOBAL_LIST_INIT(pai_emotions, list( "What" = 9 )) - GLOBAL_LIST_EMPTY(pai_software_by_key) -GLOBAL_LIST_EMPTY(default_pai_software) - -/mob/living/silicon/pai/New() - ..() - software = GLOB.default_pai_software.Copy() /mob/living/silicon/pai/verb/paiInterface() set category = "pAI Commands" set name = "Software Interface" - ui_interact(src) + tgui_interact(src) -/mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/topic_state/state = GLOB.self_state) - if(ui_key != "main") - var/datum/pai_software/S = software[ui_key] - if(S && !S.toggle) - ui = SSnanoui.try_update_ui(user, src, S.id, ui, force_open) - if(!ui) - ui = new(user, src, S.id, S.template_file, S.ui_title, S.ui_width, S.ui_height, state = state) - ui.open() - if(S.autoupdate) - ui.set_auto_update(1) - else - if(ui) - ui.set_status(STATUS_CLOSE, 0) - return - - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/mob/living/silicon/pai/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_self_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600, state = state) + ui = new(user, src, ui_key, "PAI", name, 600, 650, master_ui, state) ui.open() - ui.set_auto_update(1) -/mob/living/silicon/pai/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.self_state) - var/data[0] - - if(ui_key != "main") - var/datum/pai_software/S = software[ui_key] - if(S && !S.toggle) - return S.on_ui_data(user, state) - log_runtime(EXCEPTION("Unrecognized/invalid pAI UI state '[ui_key]'"), src) - return - // Software we have bought - var/bought_software[0] - // Software we have not bought - var/not_bought_software[0] - - for(var/key in GLOB.pai_software_by_key) - var/datum/pai_software/S = GLOB.pai_software_by_key[key] - var/software_data[0] - software_data["name"] = S.name - software_data["id"] = S.id - if(key in software) - software_data["on"] = S.is_active(src) - bought_software[++bought_software.len] = software_data - else - software_data["ram"] = S.ram_cost - not_bought_software[++not_bought_software.len] = software_data - - data["bought"] = bought_software - data["not_bought"] = not_bought_software - data["available_ram"] = ram - - // Emotions - var/emotions[0] - for(var/name in GLOB.pai_emotions) - var/emote[0] - emote["name"] = name - emote["id"] = GLOB.pai_emotions[name] - emotions[++emotions.len] = emote - - data["emotions"] = emotions - data["current_emotion"] = card.current_emotion +/mob/living/silicon/pai/tgui_data(mob/user) + var/list/data = list() + data["app_template"] = active_software.template_file + data["app_icon"] = active_software.ui_icon + data["app_title"] = active_software.name + data["app_data"] = active_software.get_app_data(user) return data -/mob/living/silicon/pai/Topic(href, href_list) +// Yes the stupid amount of args here is important, so we can proxy stuff to child UIs +/mob/living/silicon/pai/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) - return 1 + return - if(href_list["software"]) - var/soft = href_list["software"] - var/datum/pai_software/S = software[soft] - if(S.toggle) - S.toggle(src) + . = TRUE + + switch(action) + // This call is global to all templates, hence the prefix + if("MASTER_back") + active_software = installed_software["mainmenu"] + // Bail early + return else - ui_interact(src, ui_key = soft) - return 1 - - else if(href_list["stopic"]) - var/soft = href_list["stopic"] - var/datum/pai_software/S = software[soft] - if(S) - return S.Topic(href, href_list) - - else if(href_list["purchase"]) - var/soft = href_list["purchase"] - var/datum/pai_software/S = GLOB.pai_software_by_key[soft] - if(S && (ram >= S.ram_cost)) - ram -= S.ram_cost - software[S.id] = S - return 1 - - else if(href_list["image"]) - var/img = text2num(href_list["image"]) - if(1 <= img && img <= 9) - card.setEmotion(img) - return 1 + active_software.tgui_act(action, params, ui, state) diff --git a/code/modules/mob/living/silicon/pai/software/_base.dm b/code/modules/mob/living/silicon/pai/software/_base.dm new file mode 100644 index 00000000000..c761e900f46 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/software/_base.dm @@ -0,0 +1,115 @@ +/** + * # pAI Software + * + * Datum module for pAI software + * + * Very similar to the PDA app datum, this determines what UI sub-template to use, + * as well as the RAM cost, and if it is toggle software (not a UI app) + * + */ +/datum/pai_software + /// Name for the software. This is used as the button text when buying or opening/toggling the software + var/name = "pAI software module" + /// RAM cost; pAIs start with 100 RAM, spending it on programs + var/ram_cost = 0 + /// ID for the software. This must be unique + var/id + // Toggled software should override toggle() and is_active() + // Non-toggled software should override get_app_data() and Topic() + /// Whether this software is a toggle or not + var/toggle_software = FALSE + /// Do we have this software installed by default + var/default = FALSE + /// Template for the TGUI file + var/template_file = "oops" + /// Icon for inside the UI + var/ui_icon = "file-code" + /// pAI which holds this software + var/mob/living/silicon/pai/pai_holder + +/** + * New handler + * + * Ensures that the pai_holder var is set to the pAI itself + * Arguments: + * * user - The pAI that this softawre is held by + */ +/datum/pai_software/New(mob/living/silicon/pai/user) + pai_holder = user + ..() + +/** + * Handler for the app's UI data + * + * This returns the list of the current app's data for the UI + * This will then be injected as a variable on the TGUI data called "app_data" + * + * Arguments: + * * user - The pAI that is using this app + */ +/datum/pai_software/proc/get_app_data(mob/living/silicon/pai/user) + return list() + +/** + * Handler for toggling toggle apps on and off + * + * This is invoked whenever you toggle a toggleable function + * Put your toggleable work in here + * + * Arguments: + * * user - The pAI that is using this toggle + */ +/datum/pai_software/proc/toggle(mob/living/silicon/pai/user) + return + +/** + * Helper for checking if a toggle is enabled or not + * + * Returns TRUE if the toggle software is active, FALSE if not + * + * Its like this instead of a simple `is_toggled` var because some toggles override eachother and this is easier + * + * Arguments: + * * user - The pAI that is using this app + */ +/datum/pai_software/proc/is_active(mob/living/silicon/pai/user) + return FALSE + +/** + * Helper proc so that pAIs can get the mob holding them + * + * This needs to exist because pAIs have many different locs + * (Held card, mob itself, in pocket, etc) + * + * Arguments: + * * inform - Boolean, should we inform the pAI if they fail to find a carrier + */ +/datum/pai_software/proc/get_holding_mob(inform = FALSE) + var/mob/living/M = pai_holder.loc + var/count = 0 + + // Find the carrier + while(!istype(M, /mob/living)) + if(!M || !M.loc || count > 6) + //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) + if(inform) + to_chat(usr, "You are not being carried by anyone!") + return null + M = M.loc + count++ + + return M + +/** + * tgui_act sanity check helper + * + * Basically checks the existing href exploit stuff, as well as making sure the user using the UI is the pAI itself + */ +/datum/pai_software/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return TRUE + + if(usr != pai_holder) + return TRUE + + return FALSE diff --git a/code/modules/mob/living/silicon/pai/software/pai_apps.dm b/code/modules/mob/living/silicon/pai/software/pai_apps.dm new file mode 100644 index 00000000000..e5c7b7ac725 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/software/pai_apps.dm @@ -0,0 +1,388 @@ +// Main Menu // +/datum/pai_software/main_menu + name = "Main Menu" + id = "mainmenu" + default = TRUE + template_file = "pai_main_menu" + ui_icon = "home" + +/datum/pai_software/main_menu/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + data["available_ram"] = user.ram + + // Emotions + var/list/emotions = list() + for(var/name in GLOB.pai_emotions) + var/list/emote = list() + emote["name"] = name + emote["id"] = GLOB.pai_emotions[name] + emotions[++emotions.len] = emote + + data["emotions"] = emotions + data["current_emotion"] = user.card.current_emotion + + var/list/available_s = list() + for(var/s in GLOB.pai_software_by_key) + var/datum/pai_software/PS = GLOB.pai_software_by_key[s] + available_s += list(list("name" = PS.name, "key" = PS.id, "icon" = PS.ui_icon, "cost" = PS.ram_cost)) + + // Split to installed software and toggles for the UI + var/list/installed_s = list() + var/list/installed_t = list() + for(var/s in pai_holder.installed_software) + var/datum/pai_software/PS = pai_holder.installed_software[s] + if(PS.toggle_software) + installed_t += list(list("name" = PS.name, "key" = PS.id, "icon" = PS.ui_icon, "active" = PS.is_active(user))) + else + installed_s += list(list("name" = PS.name, "key" = PS.id, "icon" = PS.ui_icon)) + + data["available_software"] = available_s + data["installed_software"] = installed_s + data["installed_toggles"] = installed_t + + return data + +/datum/pai_software/main_menu/tgui_act(action, list/params) + if(..()) + return + + switch(action) + if("purchaseSoftware") + var/datum/pai_software/S = GLOB.pai_software_by_key[params["key"]] + if(S && (pai_holder.ram >= S.ram_cost)) + var/datum/pai_software/newPS = new S.type(pai_holder) + pai_holder.ram -= newPS.ram_cost + pai_holder.installed_software[newPS.id] = newPS + if("setEmotion") + var/emotion = clamp(text2num(params["emotion"]), 1, 9) + pai_holder.card.setEmotion(emotion) + if("startSoftware") + var/software_key = params["software_key"] + if(pai_holder.installed_software[software_key]) + pai_holder.active_software = pai_holder.installed_software[software_key] + if("setToggle") + var/toggle_key = params["toggle_key"] + if(pai_holder.installed_software[toggle_key]) + pai_holder.installed_software[toggle_key].toggle(pai_holder) + +// Directives // +/datum/pai_software/directives + name = "Directives" + id = "directives" + default = TRUE + template_file = "pai_directives" + ui_icon = "clipboard-list" + +/datum/pai_software/directives/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + data["master"] = user.master + data["dna"] = user.master_dna + data["prime"] = user.pai_law0 + data["supplemental"] = user.pai_laws + + return data + +/datum/pai_software/directives/tgui_act(action, list/params) + if(..()) + return + + . = TRUE + + switch(action) + if("getdna") + var/mob/living/M = get_holding_mob() + if(!istype(M)) + return + + // Check the carrier + var/answer = alert(M, "[pai_holder] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[pai_holder] Check DNA", "Yes", "No") + if(answer == "Yes") + M.visible_message("[M] presses [M.p_their()] thumb against [pai_holder].", "You press your thumb against [pai_holder].") + var/datum/dna/dna = M.dna + to_chat(usr, "[M]'s UE string: [dna.unique_enzymes]") + if(dna.unique_enzymes == pai_holder.master_dna) + to_chat(usr, "DNA is a match to stored Master DNA.") + else + to_chat(usr, "DNA does not match stored Master DNA.") + else + to_chat(usr, "[M] does not seem like [M.p_they()] [M.p_are()] going to provide a DNA sample willingly.") + +// Crew Manifest // +/datum/pai_software/crew_manifest + name = "Crew Manifest" + ram_cost = 5 + id = "manifest" + template_file = "pai_manifest" + ui_icon = "users" + +/datum/pai_software/crew_manifest/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + GLOB.data_core.get_manifest_json() + data["manifest"] = GLOB.PDA_Manifest + + return data + +// Med Records // +/datum/pai_software/med_records + name = "Medical Records" + ram_cost = 15 + id = "med_records" + template_file = "pai_medrecords" + ui_icon = "heartbeat" + /// Integrated medical records module to reduce duplicated code + var/datum/data/pda/app/crew_records/medical/integrated_records = new + +/datum/pai_software/med_records/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + // Just grab the stuff internally + integrated_records.update_ui(user, data) + return data + +/datum/pai_software/med_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + // Double proxy here + integrated_records.tgui_act(action, params, ui, state) + +// Sec Records // +/datum/pai_software/sec_records + name = "Security Records" + ram_cost = 15 + id = "sec_records" + template_file = "pai_secrecords" + ui_icon = "id-badge" + /// Integrated security records module to reduce duplicated code + var/datum/data/pda/app/crew_records/security/integrated_records = new + +/datum/pai_software/sec_records/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + // Just grab the stuff internally + integrated_records.update_ui(user, data) + return data + +/datum/pai_software/sec_records/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + // Double proxy here + integrated_records.tgui_act(action, params, ui, state) + +// Atmos Scan // +/datum/pai_software/atmosphere_sensor + name = "Atmosphere Sensor" + ram_cost = 5 + id = "atmos_sense" + template_file = "pai_atmosphere" + ui_icon = "fire" + /// Integrated PDA atmos scan module to reduce duplicated code + var/datum/data/pda/app/atmos_scanner/scanner = new + +/datum/pai_software/atmosphere_sensor/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + // Just grab the stuff internally + scanner.update_ui(user, data) + return data + +// Messenger // +/datum/pai_software/messenger + name = "Digital Messenger" + ram_cost = 5 + id = "messenger" + template_file = "pai_messenger" + ui_icon = "envelope" + +/datum/pai_software/messenger/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + // Some safety checks + if(!user.pda) + CRASH("pAI found without PDA.") + + var/datum/data/pda/app/messenger/PM = user.pda.find_program(/datum/data/pda/app/messenger) + if(!PM) + CRASH("pAI PDA lacks a messenger program") + + // Grab the internal data + PM.update_ui(user, data) + + return data + +/datum/pai_software/messenger/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + + // Grab their messenger + var/datum/data/pda/app/messenger/PM = pai_holder.pda.find_program(/datum/data/pda/app/messenger) + // Double proxy here + PM.tgui_act(action, params, ui, state) + +// Radio +/datum/pai_software/radio_config + name = "Radio Configuration" + id = "radio" + default = TRUE + template_file = "pai_radio" + ui_icon = "broadcast-tower" + +/datum/pai_software/radio_config/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + data["frequency"] = user.radio.frequency + data["minFrequency"] = PUBLIC_LOW_FREQ + data["maxFrequency"] = PUBLIC_HIGH_FREQ + data["broadcasting"] = user.radio.broadcasting + return data + +/datum/pai_software/radio_config/tgui_act(action, list/params) + if(..()) + return + + switch(action) + if("toggleBroadcast") + // Just toggle it + pai_holder.radio.broadcasting = !pai_holder.radio.broadcasting + + if("freq") + var/new_frequency = sanitize_frequency(text2num(params["freq"]) * 10) + pai_holder.radio.set_frequency(new_frequency) + +// Signaler // +/datum/pai_software/signaler + name = "Remote Signaler" + ram_cost = 5 + id = "signaler" + template_file = "pai_signaler" + ui_icon = "rss" + +/datum/pai_software/signaler/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + data["frequency"] = user.sradio.frequency + data["code"] = user.sradio.code + data["minFrequency"] = PUBLIC_LOW_FREQ + data["maxFrequency"] = PUBLIC_HIGH_FREQ + + return data + +/datum/pai_software/signaler/tgui_act(action, list/params) + if(..()) + return + + switch(action) + if("signal") + pai_holder.sradio.send_signal("ACTIVATE") + + if("freq") + var/new_frequency = sanitize_frequency(text2num(params["freq"]) * 10) + pai_holder.sradio.set_frequency(new_frequency) + + if("code") + pai_holder.sradio.code = clamp(text2num(params["code"]), 1, 100) + +// Door Jack // +/datum/pai_software/door_jack + name = "Door Jack" + ram_cost = 30 + id = "door_jack" + template_file = "pai_doorjack" + ui_icon = "door-open" + /// Progress on hacking the door + var/progress = 0 + /// Are we hacking? + var/hacking = FALSE + /// The cable being plugged into a door + var/obj/item/pai_cable/cable + /// The door being hacked + var/obj/machinery/door/hackdoor + +/datum/pai_software/door_jack/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + data["cable"] = (cable != null) + data["machine"] = (cable?.machine != null) + data["inprogress"] = (hackdoor != null) + data["progress"] = progress + + return data + +/datum/pai_software/door_jack/tgui_act(action, list/params) + if(..()) + return + + switch(action) + if("jack") + if(cable && cable.machine) + hackdoor = cable.machine + if(hacking) + to_chat(usr, "You are already hacking that door!") + else + hacking = TRUE + INVOKE_ASYNC(src, /datum/pai_software/door_jack/.proc/hackloop) + if("cancel") + hackdoor = null + if("cable") + if(cable) + to_chat(usr, "You already have a cable deployed!") + return + var/turf/T = get_turf(pai_holder) + cable = new /obj/item/pai_cable(T) + pai_holder.visible_message("A port on [pai_holder] opens to reveal [cable], which promptly falls to the floor.") + +/** + * Door jack hack loop + * + * Self-contained proc for handling the hacking of a door. + * Invoked asyncly, but will only allow one instance at a time + */ +/datum/pai_software/door_jack/proc/hackloop() + var/obj/machinery/door/D = cable.machine + if(!istype(D)) + cleanup_hack() + return + while(progress < 100) + if(cable && cable.machine == D && cable.machine == hackdoor && get_dist(pai_holder, hackdoor) <= 1) + progress = min(progress + rand(1, 20), 100) + else + cleanup_hack() + return + if(progress >= 100) + D.open() + cleanup_hack() + return + sleep(1 SECONDS) // Update every second + +/** + * Door jack cleanup proc + * + * Self-contained proc for cleaning up failed hack attempts + */ +/datum/pai_software/door_jack/proc/cleanup_hack() + progress = 0 + hackdoor = null + cable.machine = null + QDEL_NULL(cable) + hacking = FALSE + +// Host Bioscan // +/datum/pai_software/host_scan + name = "Host Bioscan" + ram_cost = 5 + id = "bioscan" + template_file = "pai_bioscan" + ui_icon = "heartbeat" + +/datum/pai_software/host_scan/get_app_data(mob/living/silicon/pai/user) + var/list/data = list() + + var/mob/living/held = get_holding_mob(FALSE) + + if(isliving(held)) + data["holder"] = held.name + data["dead"] = (held.stat > UNCONSCIOUS) + data["health"] = held.health + data["brute"] = held.getBruteLoss() + data["oxy"] = held.getOxyLoss() + data["tox"] = held.getToxLoss() + data["burn"] = held.getFireLoss() + + return data diff --git a/code/modules/mob/living/silicon/pai/software/pai_toggles.dm b/code/modules/mob/living/silicon/pai/software/pai_toggles.dm new file mode 100644 index 00000000000..138fb06d710 --- /dev/null +++ b/code/modules/mob/living/silicon/pai/software/pai_toggles.dm @@ -0,0 +1,95 @@ +// Security Hud // +/datum/pai_software/sec_hud + name = "Security HUD" + ram_cost = 20 + id = "sec_hud" + ui_icon = "exclamation-triangle" + toggle_software = TRUE + +/datum/pai_software/sec_hud/toggle(mob/living/silicon/pai/user) + user.secHUD = !user.secHUD + user.remove_med_sec_hud() + if(user.secHUD) + user.add_sec_hud() + +/datum/pai_software/sec_hud/is_active(mob/living/silicon/pai/user) + return user.secHUD + +// Medical Hud // +/datum/pai_software/med_hud + name = "Medical HUD" + ram_cost = 20 + id = "med_hud" + ui_icon = "first-aid" + toggle_software = TRUE + +/datum/pai_software/med_hud/toggle(mob/living/silicon/pai/user) + user.medHUD = !user.medHUD + user.remove_med_sec_hud() + if(user.medHUD) + user.add_med_hud() + +/datum/pai_software/med_hud/is_active(mob/living/silicon/pai/user) + return user.medHUD + +// Universal Translator // +/datum/pai_software/translator + name = "Universal Translator" + ram_cost = 35 + id = "translator" + ui_icon = "language" + toggle_software = TRUE + +/datum/pai_software/translator/toggle(mob/living/silicon/pai/user) + // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages + user.translator_on = !user.translator_on + if(user.translator_on) + user.add_language("Sinta'unathi") + user.add_language("Siik'tajr") + user.add_language("Canilunzt") + user.add_language("Skrellian") + user.add_language("Vox-pidgin") + user.add_language("Rootspeak") + user.add_language("Chittin") + user.add_language("Bubblish") + user.add_language("Orluum") + user.add_language("Clownish") + user.add_language("Neo-Russkiya") + else + user.remove_language("Sinta'unathi") + user.remove_language("Siik'tajr") + user.remove_language("Canilunzt") + user.remove_language("Skrellian") + user.remove_language("Vox-pidgin") + user.remove_language("Rootspeak") + user.remove_language("Chittin") + user.remove_language("Bubblish") + user.remove_language("Orluum") + user.remove_language("Clownish") + user.remove_language("Neo-Russkiya") + +/datum/pai_software/translator/is_active(mob/living/silicon/pai/user) + return user.translator_on + +// FLashlight // +/datum/pai_software/flashlight + name = "Flashlight" + ram_cost = 5 + id = "flashlight" + ui_icon = "lightbulb" + toggle_software = TRUE + +/datum/pai_software/flashlight/toggle(mob/living/silicon/pai/user) + var/atom/movable/actual_location = istype(user.loc, /obj/item/paicard) ? user.loc : user + if(!user.flashlight_on) + actual_location.set_light(2) + user.card.set_light(2) + else + actual_location.set_light(0) + user.card.set_light(0) + + user.flashlight_on = !user.flashlight_on + +/datum/pai_software/flashlight/is_active(mob/living/silicon/pai/user) + return user.flashlight_on + diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm deleted file mode 100644 index 7161919df7f..00000000000 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ /dev/null @@ -1,624 +0,0 @@ -/datum/pai_software - // Name for the software. This is used as the button text when buying or opening/toggling the software - var/name = "pAI software module" - // RAM cost; pAIs start with 100 RAM, spending it on programs - var/ram_cost = 0 - // ID for the software. This must be unique - var/id = "" - // Whether this software is a toggle or not - // Toggled software should override toggle() and is_active() - // Non-toggled software should override on_ui_data() and Topic() - var/toggle = 1 - // Whether pAIs should automatically receive this module at no cost - var/default = 0 - - // Vars for pAI nanoUI handling - var/autoupdate = 0 - var/template_file = "oops" - var/ui_title = "somebody forgot to set this" - var/ui_width = 450 - var/ui_height = 600 - -/datum/pai_software/proc/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - return list() - -/datum/pai_software/proc/toggle(mob/living/silicon/pai/user) - return - -/datum/pai_software/proc/is_active(mob/living/silicon/pai/user) - return 0 - -/datum/pai_software/directives - name = "Directives" - ram_cost = 0 - id = "directives" - toggle = 0 - default = 1 - - template_file = "pai_directives.tmpl" - ui_title = "pAI Directives" - autoupdate = 1 - -/datum/pai_software/directives/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - data["master"] = user.master - data["dna"] = user.master_dna - data["prime"] = user.pai_law0 - data["supplemental"] = user.pai_laws - - return data - -/datum/pai_software/directives/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(href_list["getdna"]) - var/mob/living/M = P.loc - var/count = 0 - - // Find the carrier - while(!istype(M, /mob/living)) - if(!M || !M.loc || count > 6) - //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - to_chat(P, "You are not being carried by anyone!") - return 0 - M = M.loc - count++ - - // Check the carrier - var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No") - if(answer == "Yes") - var/turf/T = get_turf_or_move(P.loc) - for(var/mob/v in viewers(T)) - v.show_message("[M] presses [M.p_their()] thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) - var/datum/dna/dna = M.dna - to_chat(P, "

[M]'s UE string : [dna.unique_enzymes]

") - if(dna.unique_enzymes == P.master_dna) - to_chat(P, "DNA is a match to stored Master DNA.") - else - to_chat(P, "DNA does not match stored Master DNA.") - else - to_chat(P, "[M] does not seem like [M.p_they()] [M.p_are()] going to provide a DNA sample willingly.") - return 1 - -/datum/pai_software/radio_config - name = "Radio Configuration" - ram_cost = 0 - id = "radio" - toggle = 0 - default = 1 - - template_file = "pai_radio.tmpl" - ui_title = "Radio Configuration" - ui_width = 300 - ui_height = 150 - -/datum/pai_software/radio_config/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - data["listening"] = user.radio.broadcasting - data["frequency"] = format_frequency(user.radio.frequency) - var/channels[0] - for(var/ch_name in user.radio.channels) - var/ch_stat = user.radio.channels[ch_name] - var/ch_dat[0] - ch_dat["name"] = ch_name - // FREQ_LISTENING is const in /obj/item/radio - ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING) - channels[++channels.len] = ch_dat - - data["channels"] = channels - - return data - -/datum/pai_software/radio_config/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - P.radio.Topic(href, href_list) - return 1 - -/datum/pai_software/crew_manifest - name = "Crew Manifest" - ram_cost = 5 - id = "manifest" - toggle = 0 - - autoupdate = 1 - template_file = "pai_manifest.tmpl" - ui_title = "Crew Manifest" - -/datum/pai_software/crew_manifest/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - GLOB.data_core.get_manifest_json() - data["manifest"] = GLOB.PDA_Manifest - - return data - -/datum/pai_software/messenger - name = "Digital Messenger" - ram_cost = 5 - id = "messenger" - toggle = 0 - - autoupdate = 1 - template_file = "pai_messenger.tmpl" - ui_title = "Digital Messenger" - -/datum/pai_software/messenger/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - if(!user.pda) - log_runtime(EXCEPTION("pAI found without PDA."), user) - return data - var/datum/data/pda/app/messenger/M = user.pda.find_program(/datum/data/pda/app/messenger) - if(!M) - log_runtime(EXCEPTION("pAI PDA lacks a messenger program"), user) - return data - - data["receiver_off"] = M.toff - data["ringer_off"] = M.notify_silent - data["current_ref"] = null - data["current_name"] = user.current_pda_messaging - - var/pdas[0] - if(!M.toff) - for(var/obj/item/pda/P in GLOB.PDAs) - var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger) - - if(P == user.pda || !PM || !PM.can_receive()) - continue - var/pda[0] - pda["name"] = "[P]" - pda["owner"] = "[P.owner]" - pda["ref"] = "\ref[P]" - if(P.owner == user.current_pda_messaging) - data["current_ref"] = "\ref[P]" - pdas[++pdas.len] = pda - - data["pdas"] = pdas - - var/messages[0] - if(user.current_pda_messaging) - for(var/index in M.tnote) - if(index["owner"] != user.current_pda_messaging) - continue - var/msg[0] - var/sent = index["sent"] - msg["sent"] = sent ? 1 : 0 - msg["target"] = index["owner"] - msg["message"] = index["message"] - messages[++messages.len] = msg - - data["messages"] = messages - - return data - -/datum/pai_software/messenger/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(!isnull(P.pda)) - var/datum/data/pda/app/messenger/M = P.pda.find_program(/datum/data/pda/app/messenger) - if(!M) - return - - if(href_list["toggler"]) - M.toff = href_list["toggler"] != "1" - return 1 - else if(href_list["ringer"]) - M.notify_silent = href_list["ringer"] != "1" - return 1 - else if(href_list["select"]) - var/s = href_list["select"] - if(s == "*NONE*") - P.current_pda_messaging = null - else - P.current_pda_messaging = s - return 1 - else if(href_list["target"]) - if(P.silence_time) - return alert("Communications circuits remain uninitialized.") - - var/target = locate(href_list["target"]) - M.create_message(P, target, 1) - return 1 - -/datum/pai_software/med_records - name = "Medical Records" - ram_cost = 15 - id = "med_records" - toggle = 0 - - autoupdate = 1 - template_file = "pai_medrecords.tmpl" - ui_title = "Medical Records" - - -/datum/pai_software/med_records/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - var/records[0] - for(var/datum/data/record/general in sortRecord(GLOB.data_core.general)) - var/record[0] - record["name"] = general.fields["name"] - record["ref"] = "\ref[general]" - records[++records.len] = record - - data["records"] = records - - var/datum/data/record/G = user.medicalActive1 - var/datum/data/record/M = user.medicalActive2 - data["general"] = G ? G.fields : null - data["medical"] = M ? M.fields : null - data["could_not_find"] = user.medical_cannotfind - - return data - -/datum/pai_software/med_records/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(href_list["select"]) - var/datum/data/record/record = locate(href_list["select"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/M = null - if(!( GLOB.data_core.general.Find(R) )) - P.medical_cannotfind = 1 - else - P.medical_cannotfind = 0 - for(var/datum/data/record/E in GLOB.data_core.medical) - if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - M = E - P.medicalActive1 = R - P.medicalActive2 = M - else - P.medical_cannotfind = 1 - return 1 - -/datum/pai_software/sec_records - name = "Security Records" - ram_cost = 15 - id = "sec_records" - toggle = 0 - - autoupdate = 1 - template_file = "pai_secrecords.tmpl" - ui_title = "Security Records" - - -/datum/pai_software/sec_records/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - var/records[0] - for(var/datum/data/record/general in sortRecord(GLOB.data_core.general)) - var/record[0] - record["name"] = general.fields["name"] - record["ref"] = "\ref[general]" - records[++records.len] = record - - data["records"] = records - - var/datum/data/record/G = user.securityActive1 - var/datum/data/record/S = user.securityActive2 - data["general"] = G ? G.fields : null - data["security"] = S ? S.fields : null - data["could_not_find"] = user.security_cannotfind - - return data - -/datum/pai_software/sec_records/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(href_list["select"]) - var/datum/data/record/record = locate(href_list["select"]) - if(record) - var/datum/data/record/R = record - var/datum/data/record/S = null - if(!( GLOB.data_core.general.Find(R) )) - P.securityActive1 = null - P.securityActive2 = null - P.security_cannotfind = 1 - else - P.security_cannotfind = 0 - for(var/datum/data/record/E in GLOB.data_core.security) - if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - P.securityActive1 = R - P.securityActive2 = S - else - P.securityActive1 = null - P.securityActive2 = null - P.security_cannotfind = 1 - return 1 - -/datum/pai_software/door_jack - name = "Door Jack" - ram_cost = 30 - id = "door_jack" - toggle = 0 - - autoupdate = 1 - template_file = "pai_doorjack.tmpl" - ui_title = "Door Jack" - ui_width = 300 - ui_height = 150 - -/datum/pai_software/door_jack/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - data["cable"] = user.cable != null - data["machine"] = user.cable && (user.cable.machine != null) - data["inprogress"] = user.hackdoor != null - data["progress_a"] = round(user.hackprogress / 10) - data["progress_b"] = user.hackprogress % 10 - data["aborted"] = user.hack_aborted - - return data - -/datum/pai_software/door_jack/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(href_list["jack"]) - if(P.cable && P.cable.machine) - P.hackdoor = P.cable.machine - P.hackloop() - return 1 - else if(href_list["cancel"]) - P.hackdoor = null - return 1 - else if(href_list["cable"]) - var/turf/T = get_turf_or_move(P.loc) - P.hack_aborted = 0 - P.cable = new /obj/item/pai_cable(T) - for(var/mob/M in viewers(T)) - M.show_message("A port on [P] opens to reveal [P.cable], which promptly falls to the floor.", 3, - "You hear the soft click of something light and hard falling to the ground.", 2) - return 1 - -/mob/living/silicon/pai/proc/hackloop() - var/obj/machinery/door/D = cable.machine - if(!istype(D)) - hack_aborted = 1 - hackprogress = 0 - cable.machine = null - hackdoor = null - return - while(hackprogress < 1000) - if(cable && cable.machine == D && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1) - hackprogress = min(hackprogress+rand(1, 20), 1000) - else - hack_aborted = 1 - hackprogress = 0 - hackdoor = null - return - if(hackprogress >= 1000) - hackprogress = 0 - D.open() - cable.machine = null - return - sleep(10) // Update every second - -/datum/pai_software/atmosphere_sensor - name = "Atmosphere Sensor" - ram_cost = 5 - id = "atmos_sense" - toggle = 0 - - template_file = "pai_atmosphere.tmpl" - ui_title = "Atmosphere Sensor" - ui_width = 350 - ui_height = 300 - - -/datum/pai_software/atmosphere_sensor/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - var/turf/T = get_turf_or_move(user.loc) - if(!T) - data["reading"] = 0 - data["pressure"] = 0 - data["temperature"] = 0 - data["temperatureC"] = 0 - data["gas"] = list() - else - var/datum/gas_mixture/env = T.return_air() - data["reading"] = 1 - data["pressure"] = env.return_pressure() - data["temperature"] = round(env.temperature) - data["temperatureC"] = round(env.temperature-T0C) - - var/t_moles = env.total_moles() - var/gases[0] - if(t_moles) - var/n2[0] - n2["name"] = "Nitrogen" - n2["percent"] = round((env.nitrogen/t_moles)*100) - var/o2[0] - o2["name"] = "Oxygen" - o2["percent"] = round((env.oxygen/t_moles)*100) - var/co2[0] - co2["name"] = "Carbon Dioxide" - co2["percent"] = round((env.carbon_dioxide/t_moles)*100) - var/plasma[0] - plasma["name"] = "Plasma" - plasma["percent"] = round((env.toxins/t_moles)*100) - var/other[0] - other["name"] = "Other" - other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles))) - gases[++gases.len] = n2 - gases[++gases.len] = o2 - gases[++gases.len] = co2 - gases[++gases.len] = plasma - gases[++gases.len] = other - data["gas"] = gases - - return data - -/datum/pai_software/sec_hud - name = "Security HUD" - ram_cost = 20 - id = "sec_hud" - -/datum/pai_software/sec_hud/toggle(mob/living/silicon/pai/user) - user.secHUD = !user.secHUD - user.remove_med_sec_hud() - if(user.secHUD) - user.add_sec_hud() - -/datum/pai_software/sec_hud/is_active(mob/living/silicon/pai/user) - return user.secHUD - -/datum/pai_software/med_hud - name = "Medical HUD" - ram_cost = 20 - id = "med_hud" - -/datum/pai_software/med_hud/toggle(mob/living/silicon/pai/user) - user.medHUD = !user.medHUD - user.remove_med_sec_hud() - if(user.medHUD) - user.add_med_hud() - -/datum/pai_software/med_hud/is_active(mob/living/silicon/pai/user) - return user.medHUD - -/datum/pai_software/translator - name = "Universal Translator" - ram_cost = 35 - id = "translator" - -/datum/pai_software/translator/toggle(mob/living/silicon/pai/user) - // Galactic Common, Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages - user.translator_on = !user.translator_on - if(user.translator_on) - user.add_language("Sinta'unathi") - user.add_language("Siik'tajr") - user.add_language("Canilunzt") - user.add_language("Skrellian") - user.add_language("Vox-pidgin") - user.add_language("Rootspeak") - user.add_language("Chittin") - user.add_language("Bubblish") - user.add_language("Orluum") - user.add_language("Clownish") - user.add_language("Neo-Russkiya") - else - user.remove_language("Sinta'unathi") - user.remove_language("Siik'tajr") - user.remove_language("Canilunzt") - user.remove_language("Skrellian") - user.remove_language("Vox-pidgin") - user.remove_language("Rootspeak") - user.remove_language("Chittin") - user.remove_language("Bubblish") - user.remove_language("Orluum") - user.remove_language("Clownish") - user.remove_language("Neo-Russkiya") - -/datum/pai_software/translator/is_active(mob/living/silicon/pai/user) - return user.translator_on - -/datum/pai_software/signaller - name = "Remote Signaller" - ram_cost = 5 - id = "signaller" - toggle = 0 - - template_file = "pai_signaller.tmpl" - ui_title = "Signaller" - ui_width = 320 - ui_height = 150 - -/datum/pai_software/signaller/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - - data["frequency"] = format_frequency(user.sradio.frequency) - data["code"] = user.sradio.code - - return data - -/datum/pai_software/signaller/Topic(href, href_list) - var/mob/living/silicon/pai/P = usr - if(!istype(P)) return - - if(href_list["send"]) - P.sradio.send_signal("ACTIVATE") - for(var/mob/O in hearers(1, P.loc)) - O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2) - return 1 - - else if(href_list["freq"]) - var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"])) - if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ) - new_frequency = sanitize_frequency(new_frequency) - P.sradio.set_frequency(new_frequency) - return 1 - - else if(href_list["code"]) - P.sradio.code += text2num(href_list["code"]) - P.sradio.code = round(P.sradio.code) - P.sradio.code = min(100, P.sradio.code) - P.sradio.code = max(1, P.sradio.code) - return 1 - -/datum/pai_software/host_scan - name = "Host Bioscan" - ram_cost = 5 - id = "bioscan" - toggle = 0 - - template_file = "pai_bioscan.tmpl" - ui_title = "Host Bioscan" - ui_width = 400 - ui_height = 350 - -/datum/pai_software/host_scan/on_ui_data(mob/living/silicon/pai/user, datum/topic_state/state = GLOB.self_state) - var/data[0] - var/mob/living/held = user.loc - var/count = 0 - - // Find the carrier - while(!isliving(held)) - if(!held || !held.loc || count > 6) - //For a runtime where M ends up in nullspace (similar to bluespace but less colourful) - to_chat(user, "You are not being carried by anyone!") - return 0 - held = held.loc - count++ - if(isliving(held)) - data["holder"] = held - data["health"] = "[held.stat > 1 ? "dead" : "[held.health]% healthy"]" - data["brute"] = "[held.getBruteLoss() > 50 ? "" : ""][held.getBruteLoss()]" - data["oxy"] = "[held.getOxyLoss() > 50 ? "" : ""][held.getOxyLoss()]" - data["tox"] = "[held.getToxLoss() > 50 ? "" : ""][held.getToxLoss()]" - data["burn"] = "[held.getFireLoss() > 50 ? "" : ""][held.getFireLoss()]" - data["temp"] = "[held.bodytemperature-T0C]°C ([held.bodytemperature*1.8-459.67]°F)" - else - data["holder"] = 0 - - return data - -/datum/pai_software/flashlight - name = "Flashlight" - ram_cost = 5 - id = "flashlight" - -/datum/pai_software/flashlight/toggle(mob/living/silicon/pai/user) - var/atom/movable/actual_location = istype(user.loc, /obj/item/paicard) ? user.loc : user - if(!user.flashlight_on) - actual_location.set_light(2) - user.card.set_light(2) - else - actual_location.set_light(0) - user.card.set_light(0) - - user.flashlight_on = !user.flashlight_on - -/datum/pai_software/flashlight/is_active(mob/living/silicon/pai/user) - return user.flashlight_on diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index fc3b775f229..b746693a2c8 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -1,7 +1,6 @@ /mob/living/silicon - var/register_alarms = 1 - var/datum/nano_module/alarm_monitor/all/alarm_monitor - var/datum/nano_module/atmos_control/atmos_control + var/register_alarms = TRUE + var/datum/tgui_module/atmos_control/atmos_control var/datum/tgui_module/crew_monitor/crew_monitor var/datum/nano_module/law_manager/law_manager var/datum/tgui_module/power_monitor/digital/power_monitor @@ -41,7 +40,7 @@ set category = "Subsystems" set name = "Atmospherics Control" - atmos_control.ui_interact(usr, state = GLOB.self_state) + atmos_control.tgui_interact(usr, state = GLOB.tgui_self_state) /******************** * Crew Monitor * diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm index e78acd08a90..586983b5d06 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/queen.dm @@ -102,6 +102,8 @@ var/mob/living/simple_animal/hostile/poison/terror_spider/T = thing if(!T.spider_myqueen) continue + if(T == src) + continue if(T.spider_myqueen != src) continue if(prob(50) || T.spider_tier >= spider_tier) diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index d7b080fd1e6..8ef178918b4 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -10,10 +10,10 @@ /mob/living/update_blurry_effects() if(eyes_blurred()) - add_eyeblur() + overlay_fullscreen("blurry", /obj/screen/fullscreen/blurry) return 1 else - remove_eyeblur() + clear_fullscreen("blurry") return 0 /mob/living/update_druggy_effects() @@ -133,19 +133,3 @@ updatehealth("var edit") if("resize") update_transform() - -/mob/proc/add_eyeblur() - if(client?.screen) - var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen - var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen - GW.add_filter(EYE_BLUR_FILTER_KEY, FILTER_EYE_BLUR) - F.add_filter(EYE_BLUR_FILTER_KEY, FILTER_EYE_BLUR) - animate(GW.filters[GW.filters.len], size = 3, time = 5) - animate(F.filters[F.filters.len], size = 3, time = 5) - -/mob/proc/remove_eyeblur() - if(client?.screen) - var/obj/screen/plane_master/game_world/GW = locate(/obj/screen/plane_master/game_world) in client.screen - var/obj/screen/plane_master/floor/F = locate(/obj/screen/plane_master/floor) in client.screen - GW.remove_filter(EYE_BLUR_FILTER_KEY) - F.remove_filter(EYE_BLUR_FILTER_KEY) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 617629e1b9a..a767383b72b 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -432,7 +432,7 @@ spawn(30) for(var/C in GLOB.employmentCabinets) var/obj/structure/filingcabinet/employment/employmentCabinet = C - if(!employmentCabinet.virgin) + if(employmentCabinet.populated) employmentCabinet.addFile(employee) /mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message) diff --git a/code/modules/nano/modules/atmos_control.dm b/code/modules/nano/modules/atmos_control.dm deleted file mode 100644 index 273b0bfc137..00000000000 --- a/code/modules/nano/modules/atmos_control.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/nano_module/atmos_control - name = "Atmospherics Control" - var/obj/access = new() - var/emagged = 0 - var/ui_ref - var/list/monitored_alarms = null - -/datum/nano_module/atmos_control/New(atmos_computer, req_access, req_one_access, monitored_alarm_ids) - ..() - access.req_access = req_access - access.req_one_access = req_one_access - - if(monitored_alarm_ids) - for(var/obj/machinery/alarm/alarm in GLOB.machines) - if(alarm.alarm_id && (alarm.alarm_id in monitored_alarm_ids)) - monitored_alarms += alarm - // machines may not yet be ordered at this point - monitored_alarms = dd_sortedObjectList(monitored_alarms) - -/datum/nano_module/atmos_control/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["alarm"]) - if(ui_ref) - var/obj/machinery/alarm/alarm = locate(href_list["alarm"]) in (monitored_alarms ? monitored_alarms : GLOB.machines) - if(alarm) - var/datum/topic_state/air_alarm/TS = generate_state(alarm) - alarm.ui_interact(usr, master_ui = ui_ref, state = TS) - -/datum/nano_module/atmos_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/master_ui = null, var/datum/topic_state/state = GLOB.default_state) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "atmos_control.tmpl", src.name, 900, 800, state = state) - ui.add_template("mapContent", "atmos_control_map_content.tmpl") - ui.add_template("mapHeader", "atmos_control_map_header.tmpl") - - // Send nanomaps - var/datum/asset/nanomaps = get_asset_datum(/datum/asset/simple/nanomaps) - nanomaps.send(user) - - ui.set_show_map(1) - ui.open() - ui.set_auto_update(1) - ui_ref = ui - -/datum/nano_module/atmos_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] - data["alarms"] = GLOB.air_alarm_repository.air_alarm_data(monitored_alarms) - - return data - -/datum/nano_module/atmos_control/proc/generate_state(air_alarm) - var/datum/topic_state/air_alarm/state = new() - state.atmos_control = src - state.air_alarm = air_alarm - return state - -/datum/topic_state/air_alarm - var/datum/nano_module/atmos_control/atmos_control = null - var/obj/machinery/alarm/air_alarm = null - -/datum/topic_state/air_alarm/can_use_topic(var/src_object, var/mob/user) - if(!isAI(user) && !in_range(atmos_control.nano_host(), user)) - return STATUS_CLOSE - if(has_access(user)) - return STATUS_INTERACTIVE - return STATUS_UPDATE - -/datum/topic_state/air_alarm/href_list(var/mob/user) - var/list/extra_href = list() - extra_href["remote_connection"] = TRUE - extra_href["remote_access"] = has_access(user) - - return extra_href - -/datum/topic_state/air_alarm/proc/has_access(var/mob/user) - return user && (isAI(user) || atmos_control.access.allowed(user) || atmos_control.emagged || air_alarm.rcon_setting == RCON_YES || air_alarm.emagged || (air_alarm.alarm_area.atmosalm && air_alarm.rcon_setting == RCON_AUTO)) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index eb350f5e29a..b5ea1bf1396 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -15,7 +15,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "filingcabinet" density = 1 - anchored = 1 + anchored = TRUE /obj/structure/filingcabinet/chestdrawer @@ -30,14 +30,14 @@ icon_state = "tallcabinet" -/obj/structure/filingcabinet/Initialize() +/obj/structure/filingcabinet/Initialize(mapload) ..() for(var/obj/item/I in loc) if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo)) I.loc = src -/obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob, params) +/obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/paper_bundle) || istype(P, /obj/item/documents)) to_chat(user, "You put [P] in [src].") user.drop_item() @@ -46,15 +46,15 @@ sleep(5) icon_state = initial(icon_state) updateUsrDialog() - else if(istype(P, /obj/item/wrench)) - playsound(loc, P.usesound, 50, 1) - anchored = !anchored - to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") else if(user.a_intent != INTENT_HARM) to_chat(user, "You can't put [P] in [src]!") else return ..() +/obj/structure/filingcabinet/wrench_act(mob/living/user, obj/item/I) + . = TRUE + default_unfasten_wrench(user, I) + /obj/structure/filingcabinet/deconstruct(disassembled = TRUE) if(!(flags & NODECONSTRUCT)) new /obj/item/stack/sheet/metal(loc, 2) @@ -62,9 +62,9 @@ I.forceMove(loc) qdel(src) -/obj/structure/filingcabinet/attack_hand(mob/user as mob) - if(contents.len <= 0) - to_chat(user, "\The [src] is empty.") +/obj/structure/filingcabinet/attack_hand(mob/user) + if(!length(contents)) + to_chat(user, "[src] is empty.") return user.set_machine(src) @@ -74,7 +74,7 @@ dat += "" var/datum/browser/popup = new(user, "filingcabinet", name, 350, 300) popup.set_content(dat) - popup.open(0) + popup.open(FALSE) return @@ -85,8 +85,8 @@ ..() /obj/structure/filingcabinet/attack_self_tk(mob/user) - if(contents.len) - if(prob(40 + contents.len * 5)) + if(length(contents)) + if(prob(40 + (length(contents) * 5))) var/obj/item/I = pick(contents) I.loc = loc if(prob(25)) @@ -105,20 +105,19 @@ usr.put_in_hands(P) updateUsrDialog() icon_state = "[initial(icon_state)]-open" - spawn(0) - sleep(5) - icon_state = initial(icon_state) + sleep(5) + icon_state = initial(icon_state) /* * Security Record Cabinets */ /obj/structure/filingcabinet/security - var/virgin = 1 + var/populated = FALSE /obj/structure/filingcabinet/security/proc/populate() - if(virgin) + if(!populated) for(var/datum/data/record/G in GLOB.data_core.general) var/datum/data/record/S for(var/datum/data/record/R in GLOB.data_core.security) @@ -133,7 +132,7 @@ P.info += "[c]
" P.info += "" P.name = "paper - '[G.fields["name"]]'" - virgin = 0 //tabbing here is correct- it's possible for people to try and use it + populated = TRUE //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. /obj/structure/filingcabinet/security/attack_hand() @@ -148,10 +147,10 @@ * Medical Record Cabinets */ /obj/structure/filingcabinet/medical - var/virgin = 1 + var/populated = FALSE /obj/structure/filingcabinet/medical/proc/populate() - if(virgin) + if(!populated) for(var/datum/data/record/G in GLOB.data_core.general) var/datum/data/record/M for(var/datum/data/record/R in GLOB.data_core.medical) @@ -166,7 +165,7 @@ P.info += "[c]
" P.info += "" P.name = "paper - '[G.fields["name"]]'" - virgin = 0 //tabbing here is correct- it's possible for people to try and use it + populated = TRUE //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. /obj/structure/filingcabinet/medical/attack_hand() @@ -184,9 +183,9 @@ GLOBAL_LIST_EMPTY(employmentCabinets) /obj/structure/filingcabinet/employment - var/cooldown = 0 + var/cooldown = FALSE // Only used for devils icon_state = "employmentcabinet" - var/virgin = 1 + var/populated = FALSE /obj/structure/filingcabinet/employment/New() GLOB.employmentCabinets += src @@ -210,23 +209,17 @@ GLOBAL_LIST_EMPTY(employmentCabinets) new /obj/item/paper/contract/employment(src, employee) /obj/structure/filingcabinet/employment/attack_hand(mob/user) - if(!cooldown) - if(virgin) + if(cooldown) + to_chat(user, "[src] is jammed, give it a few seconds.") + else + if(!populated) fillCurrent() - virgin = 0 - cooldown = 1 - ..() - sleep(100) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win. - cooldown = 0 - else - to_chat(user, "The [src] is jammed, give it a few seconds.") + populated = TRUE + if(user.mind.special_role != "devil") + return ..() -/obj/structure/filingcabinet/employment/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/wrench)) - to_chat(user, "You begin to [anchored ? "wrench" : "unwrench"] [src].") - if (do_after(user,300,user)) - playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) - anchored = !anchored - to_chat(user, "You successfully [anchored ? "wrench" : "unwrench"] [src].") - else - return ..() + else + cooldown = TRUE + ..() + sleep(10 SECONDS) // prevents the devil from just instantly emptying the cabinet, ensuring an easy win. + cooldown = FALSE diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm index ac4e6c9fd6b..aece49b6b83 100644 --- a/code/modules/pda/ai.dm +++ b/code/modules/pda/ai.dm @@ -97,8 +97,8 @@ /obj/item/pda/silicon/pai/can_use() var/mob/living/silicon/pai/pAI = usr if(!istype(pAI)) - return 0 - if(!pAI.software["messenger"]) + return FALSE + if(!pAI.installed_software["messenger"]) to_chat(usr, "You have not purchased the digital messenger!") - return 0 + return FALSE return ..() && !pAI.silence_time diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index aec047ad89b..973e7da9596 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -1,59 +1,30 @@ -/obj/item/gun/projectile/automatic/spikethrower +/obj/item/gun/energy/spikethrower //It's like the cyborg LMG, uses energy to make spikes name = "\improper Vox spike thrower" desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon = 'icons/obj/guns/projectile.dmi' icon_state = "spikethrower" item_state = "spikethrower" w_class = WEIGHT_CLASS_SMALL fire_sound_text = "a strange noise" - mag_type = /obj/item/ammo_box/magazine/internal/spikethrower - burst_size = 2 - fire_delay = 3 can_suppress = 0 - var/charge_tick = 0 - var/charge_delay = 15 + burst_size = 2 // burst has to be stored here + can_charge = FALSE + selfcharge = TRUE + charge_delay = 10 restricted_species = list(/datum/species/vox) + ammo_type = list(/obj/item/ammo_casing/energy/spike) -/obj/item/gun/projectile/automatic/spikethrower/New() - ..() - START_PROCESSING(SSobj, src) - -/obj/item/gun/projectile/automatic/spikethrower/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/gun/projectile/automatic/spikethrower/update_icon() +/obj/item/gun/energy/spikethrower/emp_act() return -/obj/item/gun/projectile/automatic/spikethrower/process() - charge_tick++ - if(charge_tick < charge_delay || !magazine) - return - charge_tick = 0 - var/obj/item/ammo_casing/caseless/spike/S = new(get_turf(src)) - magazine.give_round(S) - return 1 - -/obj/item/gun/projectile/automatic/spikethrower/attack_self() - return - -/obj/item/gun/projectile/automatic/spikethrower/process_chamber(eject_casing = 0, empty_chamber = 1) - ..() - -/obj/item/ammo_box/magazine/internal/spikethrower - name = "\improper Vox spikethrower internal magazine" - ammo_type = /obj/item/ammo_casing/caseless/spike - caliber = "spike" - max_ammo = 10 - -/obj/item/ammo_casing/caseless/spike +/obj/item/ammo_casing/energy/spike name = "alloy spike" desc = "A broadhead spike made out of a weird silvery metal." projectile_type = /obj/item/projectile/bullet/spike muzzle_flash_effect = null - throwforce = 5 - w_class = WEIGHT_CLASS_NORMAL - caliber = "spike" - icon_state = "bolt" + e_cost = 100 + delay = 3 //and delay has to be stored here on energy guns + select_name = "spike" fire_sound = 'sound/weapons/bladeslice.ogg' /obj/item/projectile/bullet/spike diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 90e6e700db9..b35400abc92 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -318,6 +318,9 @@ zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. shaded_charge = 1 +/obj/item/gun/energy/sniperrifle/isHandgun() + return FALSE // Makes it so no, you cant fit a massive, bulky, sniper under your arm + // Temperature Gun // /obj/item/gun/energy/temperature name = "temperature gun" diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 072a22aa7ba..894491056fc 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -1001,19 +1001,14 @@ reagent_state = LIQUID color = "#FFDCFF" taste_description = "stability" + var/list/drug_list = list("crank","methamphetamine","space_drugs","psilocybin","ephedrine","epinephrine","stimulants","bath_salts","lsd","thc") /datum/reagent/medicine/haloperidol/on_mob_life(mob/living/M) var/update_flags = STATUS_UPDATE_NONE - M.reagents.remove_reagent("crank", 5) - M.reagents.remove_reagent("methamphetamine", 5) - M.reagents.remove_reagent("space_drugs", 5) - M.reagents.remove_reagent("psilocybin", 5) - M.reagents.remove_reagent("ephedrine", 5) - M.reagents.remove_reagent("epinephrine", 5) - M.reagents.remove_reagent("stimulants", 3) - M.reagents.remove_reagent("bath_salts", 5) - M.reagents.remove_reagent("lsd", 5) - M.reagents.remove_reagent("thc", 5) + for(var/I in M.reagents.reagent_list) + var/datum/reagent/R = I + if(drug_list.Find(R.id)) + M.reagents.remove_reagent(R.id, 5) update_flags |= M.AdjustDruggy(-5, FALSE) M.AdjustHallucinate(-5) M.AdjustJitter(-5) @@ -1241,9 +1236,15 @@ can_synth = FALSE harmless = FALSE taste_description = "wholeness" + var/list/stimulant_list = list("methamphetamine", "crank", "bath_salts", "stimulative_agent", "stimulants") /datum/reagent/medicine/nanocalcium/on_mob_life(mob/living/carbon/human/M) var/update_flags = STATUS_UPDATE_NONE + var/has_stimulant = FALSE + for(var/I in M.reagents.reagent_list) + var/datum/reagent/R = I + if(stimulant_list.Find(R.id)) + has_stimulant = TRUE switch(current_cycle) if(1 to 19) M.AdjustJitter(4) @@ -1251,7 +1252,7 @@ to_chat(M, "Your skin feels hot and your veins are on fire!") if(20 to 43) //If they have stimulants or stimulant drugs then just apply toxin damage instead. - if(M.reagents.has_reagent("methamphetamine") || M.reagents.has_reagent("crank") || M.reagents.has_reagent("bath_salts") || M.reagents.has_reagent("stimulative_agent") || M.reagents.has_reagent("stimulants")) + if(has_stimulant == TRUE) update_flags |= M.adjustToxLoss(10, FALSE) else //apply debilitating effects if(prob(75)) @@ -1262,7 +1263,7 @@ to_chat(M, "Your body goes rigid, you cannot move at all!") update_flags |= M.AdjustWeakened(15, FALSE) if(45 to INFINITY) // Start fixing bones | If they have stimulants or stimulant drugs in their system then the nanites won't work. - if(M.reagents.has_reagent("methamphetamine") || M.reagents.has_reagent("crank") || M.reagents.has_reagent("bath_salts") || M.reagents.has_reagent("stimulative_agent") || M.reagents.has_reagent("stimulants")) + if(has_stimulant == TRUE) return ..() else for(var/obj/item/organ/external/E in M.bodyparts) diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 186315ecc56..861c48c7e0e 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -69,7 +69,7 @@ /datum/reagent/space_cleaner/reaction_turf(turf/T, volume) if(volume >= 1) var/floor_only = TRUE - for(var/obj/effect/decal/cleanable/C in src) + for(var/obj/effect/decal/cleanable/C in T) var/obj/effect/decal/cleanable/blood/B = C if(istype(B) && B.off_floor) floor_only = FALSE diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 309cdb7eef1..d919aee97ca 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -10,9 +10,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). icon_state = "circuit_imprinter" container_type = OPENCONTAINER - var/efficiency_coeff - - var/list/categories = list( + categories = list( "AI Modules", "Computer Boards", "Engineering Machinery", @@ -62,16 +60,17 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis). var/T = 0 for(var/obj/item/stock_parts/manipulator/M in component_parts) T += M.rating - efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas + T = clamp(T, 1, 4) + efficiency_coeff = 1 / (2 ** (T - 1)) -/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, var/M) +/obj/machinery/r_n_d/circuit_imprinter/check_mat(datum/design/being_built, var/M) var/list/all_materials = being_built.reagents_list + being_built.materials var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) - return round(A / max(1, (all_materials[M]/efficiency_coeff))) + return round(A / max(1, (all_materials[M] * efficiency_coeff))) /obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob, params) if(shocked) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 8e85c041708..63b6a14860a 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -13,9 +13,7 @@ Note: Must be placed west/left of and R&D console to function. icon_state = "protolathe" container_type = OPENCONTAINER - var/efficiency_coeff - - var/list/categories = list( + categories = list( "Bluespace", "Equipment", "Janitorial", @@ -70,7 +68,7 @@ Note: Must be placed west/left of and R&D console to function. T -= M.rating/10 efficiency_coeff = min(max(0, T), 1) -/obj/machinery/r_n_d/protolathe/proc/check_mat(datum/design/being_built, var/M) // now returns how many times the item can be built with the material +/obj/machinery/r_n_d/protolathe/check_mat(datum/design/being_built, var/M) // now returns how many times the item can be built with the material var/A = materials.amount(M) if(!A) A = reagents.get_reagent_amount(M) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 822554549c9..da10dbfe558 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -41,6 +41,25 @@ won't update every console in existence) but it's more of a hassle to do. Also, #define RESET_RESEARCH_DELAY 20 #define IMPRINTER_DELAY 16 +// SUBMENU_MAIN also used by other menus +// MENU_LEVELS is not accessible normally +#define MENU_MAIN 0 +#define MENU_LEVELS 1 +#define MENU_DISK 2 +#define MENU_DESTROY 3 +#define MENU_LATHE 4 +#define MENU_IMPRINTER 5 +#define MENU_SETTINGS 6 +#define SUBMENU_MAIN 0 +#define SUBMENU_DISK_COPY 1 +#define SUBMENU_LATHE_CATEGORY 1 +#define SUBMENU_LATHE_MAT_STORAGE 2 +#define SUBMENU_LATHE_CHEM_STORAGE 3 +#define SUBMENU_SETTINGS_DEVICES 1 + +#define BUILD_POWER 2000 +#define DECONSTRUCT_POWER 250 + /obj/machinery/computer/rdconsole name = "\improper R&D console" icon_screen = "rdcomp" @@ -57,8 +76,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/screen = 1.0 //Which screen is currently showing. - var/menu = 0 // Current menu. - var/submenu = 0 + var/menu = MENU_MAIN + var/submenu = SUBMENU_MAIN var/wait_message = 0 var/wait_message_timer = 0 @@ -186,467 +205,594 @@ won't update every console in existence) but it's more of a hassle to do. Also, to_chat(user, "You add the disk to the machine!") else if(!(linked_destroy && linked_destroy.busy) && !(linked_lathe && linked_lathe.busy) && !(linked_imprinter && linked_imprinter.busy)) ..() - SSnanoui.update_uis(src) + SStgui.update_uis(src) return /obj/machinery/computer/rdconsole/emag_act(user as mob) if(!emagged) playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1) req_access = list() - emagged = 1 + emagged = TRUE to_chat(user, "You disable the security protocols") -/obj/machinery/computer/rdconsole/Topic(href, href_list) +/obj/machinery/computer/rdconsole/proc/valid_nav(next_menu, next_submenu) + switch(next_menu) + if(MENU_MAIN, MENU_LEVELS, MENU_DESTROY) + return next_submenu in list(SUBMENU_MAIN) + if(MENU_DISK) + return next_submenu in list(SUBMENU_MAIN, SUBMENU_DISK_COPY) + if(MENU_LATHE, MENU_IMPRINTER) + return next_submenu in list(SUBMENU_MAIN, SUBMENU_LATHE_CATEGORY, SUBMENU_LATHE_MAT_STORAGE, SUBMENU_LATHE_CHEM_STORAGE) + if(MENU_SETTINGS) + return next_submenu in list(SUBMENU_MAIN, SUBMENU_SETTINGS_DEVICES) + return FALSE + +/obj/machinery/computer/rdconsole/proc/prompt_eject_sheets(obj/machinery/r_n_d/machine, material_id, amount) + if(!machine) + return + if(!(material_id in machine.materials.materials)) + return + + var/desired_num_sheets = 0 + if(amount == "custom") + desired_num_sheets = input("How many sheets would you like to eject from the machine?", "How much?", 1) as null|num + if(isnull(desired_num_sheets)) + desired_num_sheets = 0 + else + desired_num_sheets = text2num(amount) + + desired_num_sheets = max(0, round(desired_num_sheets)) // If you input too high of a number, the mineral datum will take care of it either way + if(desired_num_sheets) + machine.materials.retrieve_sheets(desired_num_sheets, material_id) + + + +/obj/machinery/computer/rdconsole/proc/update_from_disk() + clear_wait_message() + if(d_disk && d_disk.blueprint) + files.AddDesign2Known(d_disk.blueprint) + else if(t_disk && t_disk.stored) + files.AddTech2Known(t_disk.stored) + SStgui.update_uis(src) + griefProtection() //Update centcom too + +/obj/machinery/computer/rdconsole/proc/sync_research() + if(!sync) + return + clear_wait_message() + for(var/obj/machinery/r_n_d/server/S in GLOB.machines) + var/server_processed = FALSE + if(S.disabled) + continue + if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) + files.push_data(S.files) + server_processed = TRUE + if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) + S.files.push_data(files) + server_processed = TRUE + if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) + S.produce_heat(100) + SStgui.update_uis(src) + +/obj/machinery/computer/rdconsole/proc/reset_research() + qdel(files) + files = new /datum/research(src) + clear_wait_message() + SStgui.update_uis(src) + +/obj/machinery/computer/rdconsole/proc/find_devices() + SyncRDevices() + clear_wait_message() + SStgui.update_uis(src) + +/obj/machinery/computer/rdconsole/proc/start_destroyer() + if(!linked_destroy) + return + + if(linked_destroy.busy) + to_chat(usr, "[linked_destroy] is busy at the moment.") + return + + if(!linked_destroy.loaded_item) + to_chat(usr, "[linked_destroy] appears to be empty.") + return + + var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) + var/pointless = FALSE + + for(var/T in temp_tech) + if(files.IsTechHigher(T, temp_tech[T])) + pointless = TRUE + break + + if(!pointless) + var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") + if(choice == "Cancel" || !linked_destroy) + return + + linked_destroy.busy = TRUE + add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) + flick("d_analyzer_process", linked_destroy) + addtimer(CALLBACK(src, .proc/finish_destroyer, temp_tech), DECONSTRUCT_DELAY) + +// Sends salvaged materials to a linked protolathe, if any. +/obj/machinery/computer/rdconsole/proc/send_mats() + if(!linked_lathe || !linked_destroy || !linked_destroy.loaded_item) + return + + for(var/material in linked_destroy.loaded_item.materials) + var/space = linked_lathe.materials.max_amount - linked_lathe.materials.total_amount + // as item rating increases, amount salvageable increases + var/salvageable = linked_destroy.loaded_item.materials[material] * (linked_destroy.decon_mod / 10) + // but you shouldn't salvage more than the raw materials amount + var/available = linked_destroy.loaded_item.materials[material] + var/can_insert = min(space, salvageable, available) + linked_lathe.materials.insert_amount(can_insert, material) + +/obj/machinery/computer/rdconsole/proc/finish_destroyer(list/temp_tech) + clear_wait_message() + if(!linked_destroy || !temp_tech) + return + + if(!linked_destroy.hacked) + if(!linked_destroy.loaded_item) + to_chat(usr, "[linked_destroy] appears to be empty.") + else + for(var/T in temp_tech) + var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels + if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels + feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get + files.UpdateTech(T, temp_tech[T]) + send_mats() + linked_destroy.loaded_item = null + + for(var/obj/I in linked_destroy.contents) + for(var/mob/M in I.contents) + M.death() + if(istype(I, /obj/item/stack/sheet))//Only deconstructs one sheet at a time instead of the entire stack + var/obj/item/stack/sheet/S = I + if(S.amount > 1) + S.amount-- + linked_destroy.loaded_item = S + else + qdel(S) + linked_destroy.icon_state = "d_analyzer" + else if(!(I in linked_destroy.component_parts)) + qdel(I) + linked_destroy.icon_state = "d_analyzer" + + linked_destroy.busy = FALSE + use_power(DECONSTRUCT_POWER) + menu = MENU_MAIN + submenu = SUBMENU_MAIN + SStgui.update_uis(src) + + + +/obj/machinery/computer/rdconsole/proc/start_machine(obj/machinery/r_n_d/machine, design_id, amount) + if(!machine) + to_chat(usr, "No linked device detected.") + return + + var/is_lathe = istype(machine, /obj/machinery/r_n_d/protolathe) + var/is_imprinter = istype(machine, /obj/machinery/r_n_d/circuit_imprinter) + + if(!is_lathe && !is_imprinter) + to_chat(usr, "Unexpected linked device type.") + return + + if(machine.busy) + to_chat(usr, "[machine] is busy at the moment.") + return + + var/datum/design/being_built = files.known_designs[design_id] + if(!being_built) + to_chat(usr, "Unknown design specified.") + return + + if(!(being_built.build_type & (is_lathe ? PROTOLATHE : IMPRINTER))) + message_admins("[machine] exploit attempted by [key_name(usr, TRUE)]!") + return + + if(being_built.make_reagents.len) // build_type should equal BIOGENERATOR though.. + return + + var/max_amount = is_lathe ? 10 : 1 + amount = max(1, min(max_amount, amount)) + + var/power = BUILD_POWER + for(var/M in being_built.materials) + power += round(being_built.materials[M] * amount / 5) + power = max(BUILD_POWER, power) + + // goes down (1 -> 0.4) with upgrades + var/coeff = machine.efficiency_coeff + + var/time_to_construct = 0 + if(is_imprinter) + time_to_construct = IMPRINTER_DELAY * amount + else + time_to_construct = PROTOLATHE_CONSTRUCT_DELAY * coeff * being_built.lathe_time_factor * amount ** 0.8 + + if(is_lathe) + add_wait_message("Constructing Prototype. Please Wait...", time_to_construct) + flick("protolathe_n", machine) + else + add_wait_message("Imprinting Circuit. Please Wait...", time_to_construct) + flick("circuit_imprinter_ani", machine) + + machine.busy = TRUE + use_power(power) + + var/list/efficient_mats = list() + for(var/MAT in being_built.materials) + efficient_mats[MAT] = being_built.materials[MAT] * coeff + + var/enough_materials = TRUE + + if(!machine.materials.has_materials(efficient_mats, amount)) + atom_say("Not enough materials to complete prototype.") + enough_materials = FALSE + else + for(var/R in being_built.reagents_list) + if(!machine.reagents.has_reagent(R, being_built.reagents_list[R]) * coeff) + atom_say("Not enough reagents to complete prototype.") + enough_materials = FALSE + + if(enough_materials) + machine.materials.use_amount(efficient_mats, amount) + for(var/R in being_built.reagents_list) + machine.reagents.remove_reagent(R, being_built.reagents_list[R] * coeff) + + var/key = usr.key + addtimer(CALLBACK(src, .proc/finish_machine, key, amount, enough_materials, machine, being_built, efficient_mats), time_to_construct) + +/obj/machinery/computer/rdconsole/proc/finish_machine(key, amount, enough_materials, obj/machinery/r_n_d/machine, datum/design/being_built, list/efficient_mats) + if(machine) + if(enough_materials && being_built) + for(var/i in 1 to amount) + var/obj/item/new_item = new being_built.build_path(src) + if(istype(new_item, /obj/item/storage/backpack/holding)) + new_item.investigate_log("built by [key]","singulo") + if(!istype(new_item, /obj/item/stack/sheet)) // To avoid materials dupe glitches + new_item.materials = efficient_mats.Copy() + if(being_built.locked) + var/obj/item/storage/lockbox/research/L = new/obj/item/storage/lockbox/research(machine.loc) + new_item.forceMove(L) + L.name += " ([new_item.name])" + L.origin_tech = new_item.origin_tech + L.req_access = being_built.access_requirement + var/list/lockbox_access + for(var/A in L.req_access) + lockbox_access += "[get_access_desc(A)] " + L.desc = "A locked box. It is locked to [lockbox_access]access." + else + new_item.loc = machine.loc + machine.busy = FALSE + + clear_wait_message() + SStgui.update_uis(src) + +/obj/machinery/computer/rdconsole/tgui_act(action, list/params) if(..()) - return 1 + return if(!allowed(usr) && !isobserver(usr)) - return 1 + return add_fingerprint(usr) - usr.set_machine(src) - if(href_list["menu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code. - var/temp_screen = text2num(href_list["menu"]) - menu = temp_screen - if(href_list["submenu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code. - var/temp_screen = text2num(href_list["submenu"]) - submenu = temp_screen - if(href_list["category"]) - var/compare + switch(action) + if("nav") //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code. + var/next_menu = text2num(params["menu"]) + var/next_submenu = text2num(params["submenu"]) + if(valid_nav(next_menu, next_submenu)) + menu = next_menu + submenu = next_submenu - matching_designs.Cut() + if("setCategory") + var/next_category = params["category"] + var/compare - if(menu == 4) - compare = PROTOLATHE - else - compare = IMPRINTER + if(submenu != SUBMENU_MAIN) + return FALSE - for(var/v in files.known_designs) - var/datum/design/D = files.known_designs[v] - if(!(D.build_type & compare)) - continue - if(href_list["category"] in D.category) - matching_designs.Add(D) - submenu = 1 + if(menu == MENU_LATHE) + compare = PROTOLATHE + if(!linked_lathe || !(next_category in linked_lathe.categories)) + return FALSE + else if(menu == MENU_IMPRINTER) + compare = IMPRINTER + if(!linked_imprinter || !(next_category in linked_imprinter.categories)) + return FALSE + else + return FALSE - selected_category = "Viewing Category [href_list["category"]]" + matching_designs.Cut() - else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk. - add_wait_message("Updating Database...", TECH_UPDATE_DELAY) - spawn(TECH_UPDATE_DELAY) - clear_wait_message() - files.AddTech2Known(t_disk.stored) - SSnanoui.update_uis(src) - griefProtection() //Update centcom too + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] + if(!(D.build_type & compare)) + continue + if(next_category in D.category) + matching_designs.Add(D) + submenu = SUBMENU_LATHE_CATEGORY - else if(href_list["clear_tech"]) //Erase data on the technology disk. - if(t_disk) - t_disk.wipe_tech() + selected_category = "Viewing Category [next_category]" - else if(href_list["eject_tech"]) //Eject the technology disk. - if(t_disk) - t_disk.loc = src.loc - t_disk = null - menu = 0 - submenu = 0 + if("updt_tech") //Update the research holder with information from the technology disk. + add_wait_message("Updating Database...", TECH_UPDATE_DELAY) + addtimer(CALLBACK(src, .proc/update_from_disk), TECH_UPDATE_DELAY) - else if(href_list["copy_tech"]) //Copy some technology data from the research holder to the disk. - // Somehow this href makes me very nervous - t_disk.stored = files.known_tech[href_list["copy_tech_ID"]] - menu = 2 - submenu = 0 + if("clear_tech") //Erase data on the technology disk. + if(t_disk) + t_disk.wipe_tech() - else if(href_list["updt_design"]) //Updates the research holder with design data from the design disk. - add_wait_message("Updating Database...", DESIGN_UPDATE_DELAY) - spawn(DESIGN_UPDATE_DELAY) - clear_wait_message() - files.AddDesign2Known(d_disk.blueprint) - SSnanoui.update_uis(src) - griefProtection() //Update centcom too + if("eject_tech") //Eject the technology disk. + if(t_disk) + t_disk.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(t_disk) + t_disk = null + menu = MENU_MAIN + submenu = SUBMENU_MAIN - else if(href_list["clear_design"]) //Erases data on the design disk. - if(d_disk) - d_disk.wipe_blueprint() + if("copy_tech") //Copy some technology data from the research holder to the disk. + // Somehow this href makes me very nervous + var/datum/tech/known = files.known_tech[params["id"]] + if(t_disk && known) + t_disk.stored = known + menu = MENU_DISK + submenu = SUBMENU_MAIN - else if(href_list["eject_design"]) //Eject the design disk. - if(d_disk) - d_disk.loc = src.loc - d_disk = null - menu = 0 - submenu = 0 + if("updt_design") //Updates the research holder with design data from the design disk. + add_wait_message("Updating Database...", DESIGN_UPDATE_DELAY) + addtimer(CALLBACK(src, .proc/update_from_disk), DESIGN_UPDATE_DELAY) - else if(href_list["copy_design"]) //Copy design data from the research holder to the design disk. - // This href ALSO makes me very nervous - var/datum/design/D = files.known_designs[href_list["copy_design_ID"]] - if(D) - // eeeeeep design datums are global be careful! - var/autolathe_friendly = 1 - for(var/x in D.materials) - if( !(x in list(MAT_METAL, MAT_GLASS))) - autolathe_friendly = 0 - D.category -= "Imported" - if(D.locked) - autolathe_friendly = 0 - D.category -= "Imported" - if(D.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE)) // Specifically excludes circuit imprinter and mechfab - D.build_type = autolathe_friendly ? (D.build_type | AUTOLATHE) : D.build_type - D.category |= "Imported" - d_disk.blueprint = D - menu = 2 - submenu = 0 + if("clear_design") //Erases data on the design disk. + if(d_disk) + d_disk.wipe_blueprint() - else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer. - if(linked_destroy) - if(linked_destroy.busy) - to_chat(usr, " The destructive analyzer is busy at the moment.") + if("eject_design") //Eject the design disk. + if(d_disk) + d_disk.forceMove(loc) + if(Adjacent(usr) && !issilicon(usr)) + usr.put_in_hands(d_disk) + d_disk = null + menu = MENU_MAIN + submenu = SUBMENU_MAIN - else if(linked_destroy.loaded_item) - linked_destroy.loaded_item.loc = linked_destroy.loc - linked_destroy.loaded_item = null - linked_destroy.icon_state = "d_analyzer" - menu = 3 + if("copy_design") //Copy design data from the research holder to the design disk. + // This href ALSO makes me very nervous + var/datum/design/design = files.known_designs[params["id"]] + if(design && d_disk && can_copy_design(design)) + d_disk.blueprint = design + menu = MENU_DISK + submenu = SUBMENU_MAIN - else if(href_list["maxresearch"]) //Eject the item inside the destructive analyzer. - if(!check_rights(R_ADMIN)) - return - if(alert("Are you sure you want to maximize research levels?","Confirmation","Yes","No")=="No") - return - log_admin("[key_name(usr)] has maximized the research levels.") - message_admins("[key_name_admin(usr)] has maximized the research levels.") - Maximize() - SSnanoui.update_uis(src) - griefProtection() //Update centcomm too + if("eject_item") //Eject the item inside the destructive analyzer. + if(linked_destroy) + if(linked_destroy.busy) + to_chat(usr, "[linked_destroy] is busy at the moment.") - else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder. - if(linked_destroy) - if(linked_destroy.busy) - to_chat(usr, "The destructive analyzer is busy at the moment.") + else if(linked_destroy.loaded_item) + linked_destroy.loaded_item.forceMove(linked_destroy.loc) + linked_destroy.loaded_item = null + linked_destroy.icon_state = "d_analyzer" + menu = MENU_DESTROY + + if("maxresearch") + if(!check_rights(R_ADMIN)) return - var/list/temp_tech = linked_destroy.ConvertReqString2List(linked_destroy.loaded_item.origin_tech) - var/cancontinue = FALSE - for(var/T in temp_tech) - if(files.IsTechHigher(T, temp_tech[T])) - cancontinue = TRUE - break - if(!cancontinue) - var/choice = input("This item does not raise tech levels. Proceed destroying loaded item anyway?") in list("Proceed", "Cancel") - if(choice == "Cancel" || !linked_destroy) - return - linked_destroy.busy = 1 - add_wait_message("Processing and Updating Database...", DECONSTRUCT_DELAY) - SSnanoui.update_uis(src) - flick("d_analyzer_process", linked_destroy) - spawn(DECONSTRUCT_DELAY) - clear_wait_message() - if(linked_destroy) - linked_destroy.busy = 0 - if(!linked_destroy.hacked) - if(!linked_destroy.loaded_item) - to_chat(usr, "The destructive analyzer appears to be empty.") - menu = 0 - submenu = 0 - return - for(var/T in temp_tech) - var/datum/tech/KT = files.known_tech[T] //For stat logging of high levels - if(files.IsTechHigher(T, temp_tech[T]) && KT.level >= 5) //For stat logging of high levels - feedback_add_details("high_research_level","[KT][KT.level + 1]") //+1 to show the level which we're about to get - files.UpdateTech(T, temp_tech[T]) - menu = 0 - submenu = 0 - if(linked_lathe) //Also sends salvaged materials to a linked protolathe, if any. - for(var/material in linked_destroy.loaded_item.materials) - var/can_insert = min(linked_lathe.materials.max_amount - linked_lathe.materials.total_amount, linked_destroy.loaded_item.materials[material] * (linked_destroy.decon_mod / 10), linked_destroy.loaded_item.materials[material]) - linked_lathe.materials.insert_amount(can_insert, material) - linked_destroy.loaded_item = null - else - menu = 0 - submenu = 0 - for(var/obj/I in linked_destroy.contents) - for(var/mob/M in I.contents) - M.death() - if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack - var/obj/item/stack/sheet/S = I - if(S.amount > 1) - S.amount-- - linked_destroy.loaded_item = S - else - qdel(S) - linked_destroy.icon_state = "d_analyzer" - else - if(!(I in linked_destroy.component_parts)) - qdel(I) - linked_destroy.icon_state = "d_analyzer" - use_power(250) - SSnanoui.update_uis(src) - - else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected. - if(!sync) - to_chat(usr, "You must connect to the network first!") - else - add_wait_message("Updating Database...", SYNC_RESEARCH_DELAY) - griefProtection() //Putting this here because I dont trust the sync process - spawn(SYNC_RESEARCH_DELAY) - clear_wait_message() - if(src) - for(var/obj/machinery/r_n_d/server/S in GLOB.machines) - var/server_processed = 0 - if(S.disabled) - continue - if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom)) - files.push_data(S.files) - server_processed = 1 - if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked) - S.files.push_data(files) - server_processed = 1 - if(!istype(S, /obj/machinery/r_n_d/server/centcom) && server_processed) - S.produce_heat(100) - SSnanoui.update_uis(src) - - else if(href_list["togglesync"]) //Prevents the console from being synced by other consoles. Can still send data. - sync = !sync - - else if(href_list["build"]) //Causes the Protolathe to build something. - if(linked_lathe) - if(linked_lathe.busy) - to_chat(usr, "Protolathe is busy at the moment.") + if(alert("Are you sure you want to maximize research levels?","Confirmation","Yes","No")=="No") return - var/coeff = linked_lathe.efficiency_coeff - var/g2g = 1 - var/datum/design/being_built = files.known_designs[href_list["build"]] - if(being_built) - var/power = 2000 - var/amount=text2num(href_list["amount"]) - if(being_built.make_reagents.len) - return 0 - amount = max(1, min(10, amount)) - for(var/M in being_built.materials) - power += round(being_built.materials[M] * amount / 5) - power = max(2000, power) - var/key = usr.key //so we don't lose the info during the spawn delay - if(!(being_built.build_type & PROTOLATHE)) - g2g = 0 - message_admins("Protolathe exploit attempted by [key_name(usr, TRUE)]!") + log_admin("[key_name(usr)] has maximized the research levels.") + message_admins("[key_name_admin(usr)] has maximized the research levels.") + Maximize() + griefProtection() //Update centcomm too - if(g2g) //If input is incorrect, nothing happens - var/new_coeff = coeff * being_built.lathe_time_factor - var/time_to_construct = PROTOLATHE_CONSTRUCT_DELAY * new_coeff * amount ** 0.8 - var/enough_materials = 1 + if("deconstruct") //Deconstruct the item in the destructive analyzer and update the research holder. + start_destroyer(usr) - add_wait_message("Constructing Prototype. Please Wait...", time_to_construct) - linked_lathe.busy = 1 - flick("protolathe_n",linked_lathe) - use_power(power) + if("sync") //Sync the research holder with all the R&D consoles in the game that aren't sync protected. + if(!sync) + to_chat(usr, "You must connect to the network first!") + else + add_wait_message("Syncing Database...", SYNC_RESEARCH_DELAY) + griefProtection() //Putting this here because I dont trust the sync process + addtimer(CALLBACK(src, .proc/sync_research), SYNC_RESEARCH_DELAY) - var/list/efficient_mats = list() - for(var/MAT in being_built.materials) - efficient_mats[MAT] = being_built.materials[MAT]*coeff + if("togglesync") //Prevents the console from being synced by other consoles. Can still send data. + sync = !sync - if(!linked_lathe.materials.has_materials(efficient_mats, amount)) - src.visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") - enough_materials = 0 - g2g = 0 - else - for(var/R in being_built.reagents_list) - if(!linked_lathe.reagents.has_reagent(R, being_built.reagents_list[R])*coeff) - src.visible_message("The [src.name] beeps, \"Not enough reagents to complete prototype.\"") - enough_materials = 0 - g2g = 0 + if("build") //Causes the Protolathe to build something. + start_machine(linked_lathe, params["id"], text2num(params["amount"])) - if(enough_materials) - linked_lathe.materials.use_amount(efficient_mats, amount) - for(var/R in being_built.reagents_list) - linked_lathe.reagents.remove_reagent(R, being_built.reagents_list[R]*coeff) + if("imprint") //Causes the Circuit Imprinter to build something. + start_machine(linked_imprinter, params["id"], text2num(params["amount"])) - var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. - var/O = being_built.locked + if("disposeI") //Causes the circuit imprinter to dispose of a single reagent (all of it) + if(linked_imprinter) + linked_imprinter.reagents.del_reagent(params["id"]) - spawn(time_to_construct) - if(g2g) //And if we only fail the material requirements, we still spend time and power - for(var/i = 0, iCircuit Imprinter is busy at the moment.") - return - var/datum/design/being_built = null - being_built = files.known_designs[href_list["imprint"]] - if(being_built) - var/power = 2000 - for(var/M in being_built.materials) - power += round(being_built.materials[M] / 5) - power = max(2000, power) - if(!(being_built.build_type & IMPRINTER)) - g2g = 0 - message_admins("Circuit imprinter exploit attempted by [key_name(usr, TRUE)]!") + if("disposeP") //Causes the protolathe to dispose of a single reagent (all of it) + if(linked_lathe) + linked_lathe.reagents.del_reagent(params["id"]) - if(g2g) //Again, if input is wrong, do nothing - add_wait_message("Imprinting Circuit. Please Wait...", IMPRINTER_DELAY) - linked_imprinter.busy = 1 - flick("circuit_imprinter_ani",linked_imprinter) - use_power(power) + if("disposeallP") //Causes the protolathe to dispose of all it's reagents. + if(linked_lathe) + linked_lathe.reagents.clear_reagents() - var/list/efficient_mats = list() - for(var/MAT in being_built.materials) - efficient_mats[MAT] = being_built.materials[MAT]/coeff + if("lathe_ejectsheet") //Causes the protolathe to eject a sheet of material + prompt_eject_sheets(linked_lathe, params["id"], params["amount"]) - if(!linked_imprinter.materials.has_materials(efficient_mats)) - visible_message("The [src.name] beeps, \"Not enough materials to complete prototype.\"") - enough_materials = 0 - g2g = 0 - else - for(var/R in being_built.reagents_list) - if(!linked_imprinter.reagents.has_reagent(R, being_built.reagents_list[R]/coeff)) - visible_message("The [name] beeps, \"Not enough reagents to complete prototype.\"") - enough_materials = 0 - g2g = 0 + if("imprinter_ejectsheet") //Causes the protolathe to eject a sheet of material + prompt_eject_sheets(linked_imprinter, params["id"], params["amount"]) - if(enough_materials) - linked_imprinter.materials.use_amount(efficient_mats) - for(var/R in being_built.reagents_list) - linked_imprinter.reagents.remove_reagent(R, being_built.reagents_list[R]/coeff) + if("find_device") //The R&D console looks for devices nearby to link up with. + add_wait_message("Syncing with nearby devices...", SYNC_DEVICE_DELAY) + addtimer(CALLBACK(src, .proc/find_devices), SYNC_DEVICE_DELAY) - var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes. - spawn(IMPRINTER_DELAY) - if(g2g) - var/obj/item/new_item = new P(src) - new_item.loc = linked_imprinter.loc - linked_imprinter.busy = 0 - clear_wait_message() - SSnanoui.update_uis(src) + if("disconnect") //The R&D console disconnects with a specific device. + switch(params["item"]) + if("destroy") + if(linked_destroy) + linked_destroy.linked_console = null + linked_destroy = null + if("lathe") + if(linked_lathe) + linked_lathe.linked_console = null + linked_lathe = null + if("imprinter") + if(linked_imprinter) + linked_imprinter.linked_console = null + linked_imprinter = null - else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it) - linked_imprinter.reagents.del_reagent(href_list["disposeI"]) + if("reset") //Reset the R&D console's database. + griefProtection() + var/choice = alert("Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", "R&D Console Database Reset", "Continue", "Cancel") + if(choice == "Continue") + add_wait_message("Resetting Database...", RESET_RESEARCH_DELAY) + addtimer(CALLBACK(src, .proc/reset_research), RESET_RESEARCH_DELAY) - else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents. - linked_imprinter.reagents.clear_reagents() - - else if(href_list["disposeP"] && linked_lathe) //Causes the protolathe to dispose of a single reagent (all of it) - linked_lathe.reagents.del_reagent(href_list["disposeP"]) - - else if(href_list["disposeallP"] && linked_lathe) //Causes the protolathe to dispose of all it's reagents. - linked_lathe.reagents.clear_reagents() - - else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets - if(href_list["lathe_ejectsheet_amt"] == "custom") - desired_num_sheets = input("How many sheets would you like to eject from the machine?", "How much?", 1) as null|num - desired_num_sheets = max(0,desired_num_sheets) // If you input too high of a number, the mineral datum will take care of it either way - if(!desired_num_sheets) - return - desired_num_sheets = round(desired_num_sheets) // No partial-sheet goofery - else - desired_num_sheets = text2num(href_list["lathe_ejectsheet_amt"]) - linked_lathe.materials.retrieve_sheets(desired_num_sheets, href_list["lathe_ejectsheet"]) - - else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material - var/desired_num_sheets = text2num(href_list["imprinter_ejectsheet_amt"]) - if(href_list["imprinter_ejectsheet_amt"] == "custom") - desired_num_sheets = input("How many sheets would you like to eject from the machine?", "How much?", 1) as null|num - desired_num_sheets = max(0,desired_num_sheets) // for the imprinter they have something hacky, that still will guard against shenanigans. eh - if(!desired_num_sheets) - return - desired_num_sheets = round(desired_num_sheets) // No partial-sheet goofery - else - desired_num_sheets = text2num(href_list["imprinter_ejectsheet_amt"]) - linked_imprinter.materials.retrieve_sheets(desired_num_sheets, href_list["imprinter_ejectsheet"]) - - else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with. - add_wait_message("Updating Database...", SYNC_DEVICE_DELAY) - spawn(SYNC_DEVICE_DELAY) - SyncRDevices() - clear_wait_message() - SSnanoui.update_uis(src) - - else if(href_list["disconnect"]) //The R&D console disconnects with a specific device. - switch(href_list["disconnect"]) - if("destroy") - linked_destroy.linked_console = null - linked_destroy = null - if("lathe") - linked_lathe.linked_console = null - linked_lathe = null - if("imprinter") - linked_imprinter.linked_console = null - linked_imprinter = null - - else if(href_list["reset"]) //Reset the R&D console's database. - griefProtection() - var/choice = alert("Are you sure you want to reset the R&D console's database? Data lost cannot be recovered.", "R&D Console Database Reset", "Continue", "Cancel") - if(choice == "Continue") - add_wait_message("Updating Database...", RESET_RESEARCH_DELAY) - qdel(files) - files = new /datum/research(src) - spawn(RESET_RESEARCH_DELAY) - clear_wait_message() - SSnanoui.update_uis(src) - - else if(href_list["search"]) //Search for designs with name matching pattern - var/compare - - matching_designs.Cut() - - if(menu == 4) - compare = PROTOLATHE - else - compare = IMPRINTER - - for(var/v in files.known_designs) - var/datum/design/D = files.known_designs[v] - if(!(D.build_type & compare)) - continue - if(findtext(D.name,href_list["to_search"])) - matching_designs.Add(D) - submenu = 1 - - selected_category = "Search Results for '[href_list["to_search"]]'" - - SSnanoui.update_uis(src) - return + if("search") //Search for designs with name matching pattern + var/query = params["to_search"] + var/compare -/obj/machinery/computer/rdconsole/attack_hand(mob/user as mob) + if(menu == MENU_LATHE) + compare = PROTOLATHE + else if(menu == MENU_IMPRINTER) + compare = IMPRINTER + else + return FALSE + + matching_designs.Cut() + + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] + if(!(D.build_type & compare)) + continue + if(findtext(D.name, query)) + matching_designs.Add(D) + submenu = SUBMENU_LATHE_CATEGORY + + selected_category = "Search Results for '[query]'" + + return TRUE // update uis + + +/obj/machinery/computer/rdconsole/attack_hand(mob/user) if(..()) return 1 if(!allowed(user) && !isobserver(user)) to_chat(user, "Access denied.") - return 1 - ui_interact(user) + return TRUE + tgui_interact(user) -/obj/machinery/computer/rdconsole/ui_interact(mob/user, ui_key="main", var/datum/nanoui/ui = null, var/force_open = 1) - user.set_machine(src) - ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) +/obj/machinery/computer/rdconsole/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "r_n_d.tmpl", src.name, 800, 550) + ui = new(user, src, ui_key, "RndConsole", name, 800, 550, master_ui, state) ui.open() -/obj/machinery/computer/rdconsole/ui_data(mob/user, ui_key = "main", datum/topic_state/state = GLOB.default_state) - var/data[0] +/obj/machinery/computer/rdconsole/proc/tgui_machine_data(obj/machinery/r_n_d/machine, list/data) + if(!machine) + return + + data["total_materials"] = machine.materials.total_amount + data["max_materials"] = machine.materials.max_amount + data["total_chemicals"] = machine.reagents.total_volume + data["max_chemicals"] = machine.reagents.maximum_volume + data["categories"] = machine.categories + + var/list/designs_list = list() + var/list/materials_list = list() + var/list/loaded_chemicals = list() + data["matching_designs"] = designs_list + data["loaded_materials"] = materials_list + data["loaded_chemicals"] = loaded_chemicals + + var/is_lathe = istype(machine, /obj/machinery/r_n_d/protolathe) + var/is_imprinter = istype(machine, /obj/machinery/r_n_d/circuit_imprinter) + + if (!is_lathe && !is_imprinter) + return + + var/coeff = machine.efficiency_coeff + + if(submenu == SUBMENU_LATHE_CATEGORY) + for(var/datum/design/D in matching_designs) + var/list/design_list = list() + designs_list[++designs_list.len] = design_list + var/list/design_materials_list = list() + design_list["materials"] = design_materials_list + design_list["id"] = D.id + design_list["name"] = D.name + var/can_build = is_imprinter ? 1 : 50 + + for(var/M in D.materials) + var/list/material_list = list() + design_materials_list[++design_materials_list.len] = material_list + material_list["name"] = CallMaterialName(M) + material_list["amount"] = D.materials[M] * coeff + var/t = machine.check_mat(D, M) + material_list["is_red"] = t < 1 + can_build = min(can_build, t) + + for(var/R in D.reagents_list) + var/list/material_list = list() + design_materials_list[++design_materials_list.len] = material_list + material_list["name"] = CallMaterialName(R) + material_list["amount"] = D.reagents_list[R] * coeff + var/t = machine.check_mat(D, R) + material_list["is_red"] = t < 1 + can_build = min(can_build, t) + + design_list["can_build"] = can_build + + else if(submenu == SUBMENU_LATHE_MAT_STORAGE) + materials_list[++materials_list.len] = list("name" = "Metal", "id" = MAT_METAL, "amount" = machine.materials.amount(MAT_METAL)) + materials_list[++materials_list.len] = list("name" = "Glass", "id" = MAT_GLASS, "amount" = machine.materials.amount(MAT_GLASS)) + materials_list[++materials_list.len] = list("name" = "Gold", "id" = MAT_GOLD, "amount" = machine.materials.amount(MAT_GOLD)) + materials_list[++materials_list.len] = list("name" = "Silver", "id" = MAT_SILVER, "amount" = machine.materials.amount(MAT_SILVER)) + materials_list[++materials_list.len] = list("name" = "Solid Plasma", "id" = MAT_PLASMA, "amount" = machine.materials.amount(MAT_PLASMA)) + materials_list[++materials_list.len] = list("name" = "Uranium", "id" = MAT_URANIUM, "amount" = machine.materials.amount(MAT_URANIUM)) + materials_list[++materials_list.len] = list("name" = "Diamond", "id" = MAT_DIAMOND, "amount" = machine.materials.amount(MAT_DIAMOND)) + materials_list[++materials_list.len] = list("name" = "Bananium", "id" = MAT_BANANIUM, "amount" = machine.materials.amount(MAT_BANANIUM)) + materials_list[++materials_list.len] = list("name" = "Tranquillite", "id" = MAT_TRANQUILLITE, "amount" = machine.materials.amount(MAT_TRANQUILLITE)) + materials_list[++materials_list.len] = list("name" = "Titanium", "id" = MAT_TITANIUM, "amount" = machine.materials.amount(MAT_TITANIUM)) + materials_list[++materials_list.len] = list("name" = "Plastic", "id" = MAT_PLASTIC, "amount" = machine.materials.amount(MAT_PLASTIC)) + materials_list[++materials_list.len] = list("name" = "Bluespace Mesh", "id" = MAT_BLUESPACE, "amount" = machine.materials.amount(MAT_BLUESPACE)) + else if(submenu == SUBMENU_LATHE_CHEM_STORAGE) + for(var/datum/reagent/R in machine.reagents.reagent_list) + var/list/loaded_chemical = list() + loaded_chemicals[++loaded_chemicals.len] = loaded_chemical + loaded_chemical["name"] = R.name + loaded_chemical["volume"] = R.volume + loaded_chemical["id"] = R.id + + +/obj/machinery/computer/rdconsole/proc/can_copy_design(datum/design/D) + if(D) + if(D.build_type & AUTOLATHE) + return TRUE + + if(D.build_type & PROTOLATHE) + for(var/M in D.materials) + if(M != MAT_METAL && M != MAT_GLASS) + return FALSE + return TRUE + + return FALSE + +/obj/machinery/computer/rdconsole/tgui_data(mob/user) + var/list/data = list() files.RefreshResearch() @@ -659,11 +805,13 @@ won't update every console in existence) but it's more of a hassle to do. Also, data["linked_lathe"] = linked_lathe ? 1 : 0 data["linked_imprinter"] = linked_imprinter ? 1 : 0 data["sync"] = sync - data["admin"] = check_rights(R_ADMIN,0) - data["disk_type"] = d_disk ? 2 : (t_disk ? 1 : 0) + data["admin"] = check_rights(R_ADMIN, FALSE, user) + data["disk_type"] = d_disk ? "design" : (t_disk ? "tech" : null) + data["disk_data"] = null + data["loaded_item"] = null data["category"] = selected_category - if(menu == 0 || menu == 1) + if(menu == MENU_MAIN || menu == MENU_LEVELS) var/list/tech_levels = list() data["tech_levels"] = tech_levels for(var/v in files.known_tech) @@ -676,28 +824,28 @@ won't update every console in existence) but it's more of a hassle to do. Also, this_tech_list["desc"] = T.desc tech_levels[++tech_levels.len] = this_tech_list - if(menu == 2) + else if(menu == MENU_DISK) - if(t_disk != null && t_disk.stored != null && submenu == 0) //Technology Disk Menu + if(t_disk != null && t_disk.stored != null && submenu == SUBMENU_MAIN) var/list/disk_data = list() data["disk_data"] = disk_data disk_data["name"] = t_disk.stored.name disk_data["level"] = t_disk.stored.level disk_data["desc"] = t_disk.stored.desc - if(t_disk != null && submenu == 1) + else if(t_disk != null && submenu == SUBMENU_DISK_COPY) var/list/to_copy = list() data["to_copy"] = to_copy for(var/v in files.known_tech) var/datum/tech/T = files.known_tech[v] - var/list/item = list() - to_copy[++to_copy.len] = item if(T.level <= 0) continue + var/list/item = list() + to_copy[++to_copy.len] = item item["name"] = T.name item["id"] = T.id - if(d_disk != null && d_disk.blueprint != null && submenu == 0) + else if(d_disk != null && d_disk.blueprint != null && submenu == SUBMENU_MAIN) var/list/disk_data = list() data["disk_data"] = disk_data disk_data["name"] = d_disk.blueprint.name @@ -720,17 +868,19 @@ won't update every console in existence) but it's more of a hassle to do. Also, material["name"] = CallMaterialName(M) material["amount"] = d_disk.blueprint.materials[M] - if(d_disk != null && submenu == 1) + else if(d_disk != null && submenu == SUBMENU_DISK_COPY) var/list/to_copy = list() data["to_copy"] = to_copy for(var/v in files.known_designs) var/datum/design/D = files.known_designs[v] + if(!can_copy_design(D)) + continue var/list/item = list() to_copy[++to_copy.len] = item item["name"] = D.name item["id"] = D.id - if(menu == 3 && linked_destroy && linked_destroy.loaded_item) + else if(menu == MENU_DESTROY && linked_destroy && linked_destroy.loaded_item) var/list/loaded_item_list = list() data["loaded_item"] = loaded_item_list loaded_item_list["name"] = linked_destroy.loaded_item.name @@ -748,140 +898,10 @@ won't update every console in existence) but it's more of a hassle to do. Also, tech_item["current_level"] = F.level break - if(menu == 4 && linked_lathe) - data["total_materials"] = linked_lathe.materials.total_amount - data["max_materials"] = linked_lathe.materials.max_amount - data["total_chemicals"] = linked_lathe.reagents.total_volume - data["max_chemicals"] = linked_lathe.reagents.maximum_volume - data["categories"] = linked_lathe.categories - if(submenu == 1) - var/list/designs_list = list() - data["matching_designs"] = designs_list - var/coeff = linked_lathe.efficiency_coeff - for(var/datum/design/D in matching_designs) - var/list/design_list = list() - designs_list[++designs_list.len] = design_list - var/list/materials_list = list() - design_list["materials"] = materials_list - design_list["id"] = D.id - design_list["name"] = sanitize(D.name) - var/c = 50 - for(var/M in D.materials) - var/list/material_list = list() - materials_list[++materials_list.len] = material_list - material_list["name"] = CallMaterialName(M) - material_list["amount"] = D.materials[M]*coeff - var/t = linked_lathe.check_mat(D, M) - - if(t < 1) - material_list["is_red"] = 1 - else - material_list["is_red"] = 0 - c = min(c, t) - - for(var/R in D.reagents_list) - var/list/material_list = list() - materials_list[++materials_list.len] = material_list - material_list["name"] = CallMaterialName(R) - material_list["amount"] = D.reagents_list[R]*coeff - var/t = linked_lathe.check_mat(D, R) - - if(t < 1) - material_list["is_red"] = 1 - else - material_list["is_red"] = 0 - c = min(c, t) - design_list["can_build"] = c - if(submenu == 2) - var/list/materials_list = list() - data["loaded_materials"] = materials_list - materials_list[++materials_list.len] = list("name" = "Metal", "id" = MAT_METAL, "amount" = linked_lathe.materials.amount(MAT_METAL)) - materials_list[++materials_list.len] = list("name" = "Glass", "id" = MAT_GLASS, "amount" = linked_lathe.materials.amount(MAT_GLASS)) - materials_list[++materials_list.len] = list("name" = "Gold", "id" = MAT_GOLD, "amount" = linked_lathe.materials.amount(MAT_GOLD)) - materials_list[++materials_list.len] = list("name" = "Silver", "id" = MAT_SILVER, "amount" = linked_lathe.materials.amount(MAT_SILVER)) - materials_list[++materials_list.len] = list("name" = "Solid Plasma", "id" = MAT_PLASMA, "amount" = linked_lathe.materials.amount(MAT_PLASMA)) - materials_list[++materials_list.len] = list("name" = "Uranium", "id" = MAT_URANIUM, "amount" = linked_lathe.materials.amount(MAT_URANIUM)) - materials_list[++materials_list.len] = list("name" = "Diamond", "id" = MAT_DIAMOND, "amount" = linked_lathe.materials.amount(MAT_DIAMOND)) - materials_list[++materials_list.len] = list("name" = "Bananium", "id" = MAT_BANANIUM, "amount" = linked_lathe.materials.amount(MAT_BANANIUM)) - materials_list[++materials_list.len] = list("name" = "Tranquillite", "id" = MAT_TRANQUILLITE, "amount" = linked_lathe.materials.amount(MAT_TRANQUILLITE)) - materials_list[++materials_list.len] = list("name" = "Titanium", "id" = MAT_TITANIUM, "amount" = linked_lathe.materials.amount(MAT_TITANIUM)) - materials_list[++materials_list.len] = list("name" = "Plastic", "id" = MAT_PLASTIC, "amount" = linked_lathe.materials.amount(MAT_PLASTIC)) - materials_list[++materials_list.len] = list("name" = "Bluespace Mesh", "id" = MAT_BLUESPACE, "amount" = linked_lathe.materials.amount(MAT_BLUESPACE)) - if(submenu == 3) - var/list/loaded_chemicals = list() - data["loaded_chemicals"] = loaded_chemicals - for(var/datum/reagent/R in linked_lathe.reagents.reagent_list) - var/list/loaded_chemical = list() - loaded_chemicals[++loaded_chemicals.len] = loaded_chemical - loaded_chemical["name"] = R.name - loaded_chemical["volume"] = R.volume - loaded_chemical["id"] = R.id - - if(menu == 5 && linked_imprinter) - data["total_materials"] = linked_imprinter.materials.total_amount - data["max_materials"] = linked_imprinter.materials.max_amount - data["total_chemicals"] = linked_imprinter.reagents.total_volume - data["max_chemicals"] = linked_imprinter.reagents.maximum_volume - data["categories"] = linked_imprinter.categories - if(submenu == 1) - var/list/designs_list = list() - data["matching_designs"] = designs_list - var/coeff = linked_imprinter.efficiency_coeff - for(var/datum/design/D in matching_designs) - var/list/design_list = list() - designs_list[++designs_list.len] = design_list - var/list/materials_list = list() - design_list["materials"] = materials_list - design_list["id"] = D.id - design_list["name"] = sanitize(D.name) - var/check_materials = 1 - for(var/M in D.materials) - var/list/material_list = list() - materials_list[++materials_list.len] = material_list - material_list["name"] = CallMaterialName(M) - material_list["amount"] = D.materials[M] / coeff - if(!linked_imprinter.check_mat(D, M)) - check_materials = 0 - material_list["is_red"] = 1 - else - material_list["is_red"] = 0 - - for(var/R in D.reagents_list) - var/list/material_list = list() - materials_list[++materials_list.len] = material_list - material_list["name"] = CallMaterialName(R) - material_list["amount"] = D.reagents_list[R]*coeff - if(!linked_imprinter.check_mat(D, R)) - check_materials = 0 - material_list["is_red"] = 1 - else - material_list["is_red"] = 0 - - design_list["can_build"] = check_materials - if(submenu == 2) - var/list/materials_list = list() - data["loaded_materials"] = materials_list - materials_list[++materials_list.len] = list("name" = "Metal", "id" = MAT_METAL, "amount" = linked_imprinter.materials.amount(MAT_METAL)) - materials_list[++materials_list.len] = list("name" = "Glass", "id" = MAT_GLASS, "amount" = linked_imprinter.materials.amount(MAT_GLASS)) - materials_list[++materials_list.len] = list("name" = "Gold", "id" = MAT_GOLD, "amount" = linked_imprinter.materials.amount(MAT_GOLD)) - materials_list[++materials_list.len] = list("name" = "Silver", "id" = MAT_SILVER, "amount" = linked_imprinter.materials.amount(MAT_SILVER)) - materials_list[++materials_list.len] = list("name" = "Solid Plasma", "id" = MAT_PLASMA, "amount" = linked_imprinter.materials.amount(MAT_PLASMA)) - materials_list[++materials_list.len] = list("name" = "Uranium", "id" = MAT_URANIUM, "amount" = linked_imprinter.materials.amount(MAT_URANIUM)) - materials_list[++materials_list.len] = list("name" = "Diamond", "id" = MAT_DIAMOND, "amount" = linked_imprinter.materials.amount(MAT_DIAMOND)) - materials_list[++materials_list.len] = list("name" = "Bananium", "id" = MAT_BANANIUM, "amount" = linked_imprinter.materials.amount(MAT_BANANIUM)) - materials_list[++materials_list.len] = list("name" = "Tranquillite", "id" = MAT_TRANQUILLITE, "amount" = linked_imprinter.materials.amount(MAT_TRANQUILLITE)) - materials_list[++materials_list.len] = list("name" = "Titanium", "id" = MAT_TITANIUM, "amount" = linked_imprinter.materials.amount(MAT_TITANIUM)) - materials_list[++materials_list.len] = list("name" = "Plastic", "id" = MAT_PLASTIC, "amount" = linked_imprinter.materials.amount(MAT_PLASTIC)) - materials_list[++materials_list.len] = list("name" = "Bluespace Mesh", "id" = MAT_BLUESPACE, "amount" = linked_imprinter.materials.amount(MAT_BLUESPACE)) - if(submenu == 3) - var/list/loaded_chemicals = list() - data["loaded_chemicals"] = loaded_chemicals - for(var/datum/reagent/R in linked_imprinter.reagents.reagent_list) - var/list/loaded_chemical = list() - loaded_chemicals[++loaded_chemicals.len] = loaded_chemical - loaded_chemical["name"] = R.name - loaded_chemical["volume"] = R.volume - loaded_chemical["id"] = R.id + else if(menu == MENU_LATHE && linked_lathe) + tgui_machine_data(linked_lathe, data) + else if(menu == MENU_IMPRINTER && linked_imprinter) + tgui_machine_data(linked_imprinter, data) return data @@ -902,8 +922,8 @@ won't update every console in existence) but it's more of a hassle to do. Also, // This could be expensive, and will still be called // if the timer calls this function deltimer(wait_message_timer) - wait_message_timer = 0 - SSnanoui.update_uis(src) + wait_message_timer = null + SStgui.update_uis(src) /obj/machinery/computer/rdconsole/core @@ -946,3 +966,18 @@ won't update every console in existence) but it's more of a hassle to do. Also, #undef SYNC_DEVICE_DELAY #undef RESET_RESEARCH_DELAY #undef IMPRINTER_DELAY +#undef MENU_MAIN +#undef MENU_LEVELS +#undef MENU_DISK +#undef MENU_DESTROY +#undef MENU_LATHE +#undef MENU_IMPRINTER +#undef MENU_SETTINGS +#undef SUBMENU_MAIN +#undef SUBMENU_DISK_COPY +#undef SUBMENU_LATHE_CATEGORY +#undef SUBMENU_LATHE_MAT_STORAGE +#undef SUBMENU_LATHE_CHEM_STORAGE +#undef SUBMENU_SETTINGS_DEVICES +#undef BUILD_POWER +#undef DECONSTRUCT_POWER diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index bd4e5528a9b..e185fdd6f71 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -18,6 +18,8 @@ var/obj/machinery/computer/rdconsole/linked_console var/obj/item/loaded_item = null var/datum/component/material_container/materials //Store for hyper speed! + var/efficiency_coeff = 1 + var/list/categories = list() /obj/machinery/r_n_d/New() materials = AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TRANQUILLITE, MAT_TITANIUM, MAT_BLUESPACE, MAT_PLASTIC), 0, TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) @@ -129,3 +131,6 @@ overlays += "[initial(name)]_[stack_name]" sleep(10) overlays -= "[initial(name)]_[stack_name]" + +/obj/machinery/r_n_d/proc/check_mat(datum/design/being_built, var/M) + return 0 // number of copies of design beign_built you can make with material M diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 444a2f9d017..b4c31dbb0c3 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -100,8 +100,13 @@ research holder datum. return known_tech[T.id] = T +/datum/research/proc/CanAddDesign2Known(var/datum/design/D) + if (D.id in known_designs) + return FALSE + return TRUE + /datum/research/proc/AddDesign2Known(var/datum/design/D) - if(D.id in known_designs) + if(!CanAddDesign2Known(D)) return // Global datums make me nervous known_designs[D.id] = D @@ -163,10 +168,16 @@ research holder datum. /datum/research/autolathe/DesignHasReqs(var/datum/design/D) return D && (D.build_type & AUTOLATHE) && ("initial" in D.category) -/datum/research/autolathe/AddDesign2Known(var/datum/design/D) - if(!(D.build_type & AUTOLATHE)) - return - ..() +/datum/research/autolathe/CanAddDesign2Known(var/datum/design/design) + // Specifically excludes circuit imprinter and mechfab + if(design.locked || !(design.build_type & (AUTOLATHE|PROTOLATHE|CRAFTLATHE))) + return FALSE + + for(var/mat in design.materials) + if(mat != MAT_METAL && mat != MAT_GLASS) + return FALSE + + return ..() //Biogenerator files /datum/research/biogenerator/New() @@ -178,10 +189,10 @@ research holder datum. if((D.build_type & BIOGENERATOR) && ("initial" in D.category)) AddDesign2Known(D) -/datum/research/biogenerator/AddDesign2Known(datum/design/D) +/datum/research/biogenerator/CanAddDesign2Known(datum/design/D) if(!(D.build_type & BIOGENERATOR)) - return - ..() + return FALSE + return ..() //Smelter files /datum/research/smelter/New() @@ -193,10 +204,10 @@ research holder datum. if((D.build_type & SMELTER) && ("initial" in D.category)) AddDesign2Known(D) -/datum/research/smelter/AddDesign2Known(datum/design/D) +/datum/research/smelter/CanAddDesign2Known(datum/design/D) if(!(D.build_type & SMELTER)) - return - ..() + return FALSE + return ..() /*************************************************************** ** Technology Datums ** diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard_authentication.dm similarity index 100% rename from code/modules/security_levels/keycard authentication.dm rename to code/modules/security_levels/keycard_authentication.dm diff --git a/code/modules/security_levels/security levels.dm b/code/modules/security_levels/security_levels.dm similarity index 100% rename from code/modules/security_levels/security levels.dm rename to code/modules/security_levels/security_levels.dm diff --git a/code/modules/station_goals/bluespace_tap.dm b/code/modules/station_goals/bluespace_tap.dm new file mode 100644 index 00000000000..3f24e383457 --- /dev/null +++ b/code/modules/station_goals/bluespace_tap.dm @@ -0,0 +1,455 @@ +//Station goal stuff goes here +/datum/station_goal/bluespace_tap + name = "Bluespace Harvester" + var/goal = 45000 + +/datum/station_goal/bluespace_tap/get_report() + return {"Bluespace Harvester Experiment
+ Another research station has developed a device called a Bluespace Harvester. + It reaches through bluespace into other dimensions to shift through them for interesting objects.
+ Due to unforseen circumstances the large-scale test of the prototype could not be completed on the original research station. It will instead be carried out on your station. + Acquire the circuit board, construct the device over a wire knot and feed it enough power to generate [goal] mining points by shift end. +

+ Be advised that the device is experimental and might act in slightly unforseen ways if sufficiently powered. +
+ Nanotrasen Science Directorate"} + +/datum/station_goal/bluespace_tap/on_report() + var/datum/supply_packs/misc/station_goal/bluespace_tap/P = SSshuttle.supply_packs["[/datum/supply_packs/misc/station_goal/bluespace_tap]"] + P.special_enabled = TRUE + +/datum/station_goal/bluespace_tap/check_completion() + if(..()) + return TRUE + var/highscore = 0 + for(var/obj/machinery/power/bluespace_tap/T in GLOB.machines) + highscore = max(highscore, T.total_points) + to_chat(world, "Bluespace Harvester Highscore : [highscore >= goal ? "": ""][highscore]") + if(highscore >= goal) + return TRUE + return FALSE + +//needed for the vending part of it +/datum/data/bluespace_tap_product + var/product_name = "generic" + var/product_path = null + var/product_cost = 100 //cost in mining points to generate + + +/datum/data/bluespace_tap_product/New(name, path, cost) + product_name = name + product_path = path + product_cost = cost + +/obj/item/circuitboard/machine/bluespace_tap + name = "Bluespace Harvester (Machine Board)" + build_path = /obj/machinery/power/bluespace_tap + origin_tech = "engineering=2;combat=2;bluespace=3" + req_components = list( + /obj/item/stock_parts/capacitor/quadratic = 5,//Probably okay, right? + /obj/item/stack/ore/bluespace_crystal = 5) + +/obj/effect/spawner/lootdrop/bluespace_tap + name = "bluespace harvester reward spawner" + lootcount = 1 + +/obj/effect/spawner/lootdrop/bluespace_tap/hat + name = "exotic hat" + loot = list( + /obj/item/clothing/head/collectable/chef, //same weighing on all of them + /obj/item/clothing/head/collectable/paper, + /obj/item/clothing/head/collectable/tophat, + /obj/item/clothing/head/collectable/captain, + /obj/item/clothing/head/collectable/beret, + /obj/item/clothing/head/collectable/welding, + /obj/item/clothing/head/collectable/flatcap, + /obj/item/clothing/head/collectable/pirate, + /obj/item/clothing/head/collectable/kitty, + /obj/item/clothing/head/crown/fancy, + /obj/item/clothing/head/collectable/rabbitears, + /obj/item/clothing/head/collectable/wizard, + /obj/item/clothing/head/collectable/hardhat, + /obj/item/clothing/head/collectable/HoS, + /obj/item/clothing/head/collectable/thunderdome, + /obj/item/clothing/head/collectable/swat, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/police, + /obj/item/clothing/head/collectable/slime, + /obj/item/clothing/head/collectable/xenom, + /obj/item/clothing/head/collectable/petehat + ) + + +/obj/effect/spawner/lootdrop/bluespace_tap/cultural + name = "cultural artifacts" + loot = list( + /obj/vehicle/space/speedbike/red = 10, + /obj/item/grenade/clusterbuster/honk = 10, + /obj/item/toy/katana = 10, + /obj/item/stack/tile/brass/fifty = 20, + /obj/item/stack/sheet/mineral/abductor/fifty = 20, + /obj/item/sord = 20, + /obj/item/toy/syndicateballoon = 15, + /obj/item/lighter/zippo/gonzofist = 5, + /obj/item/lighter/zippo/engraved = 5, + /obj/item/lighter/zippo/nt_rep = 5, + /obj/item/gun/projectile/automatic/c20r/toy = 1, + /obj/item/gun/projectile/automatic/l6_saw/toy = 1, + /obj/item/gun/projectile/automatic/toy/pistol = 2, + /obj/item/gun/projectile/automatic/toy/pistol/enforcer = 1, + /obj/item/gun/projectile/shotgun/toy = 1, + /obj/item/gun/projectile/shotgun/toy/crossbow = 1, + /obj/item/gun/projectile/shotgun/toy/tommygun = 1, + /obj/item/gun/projectile/automatic/sniper_rifle/toy = 1, + /obj/item/twohanded/dualsaber/toy = 5, + /obj/machinery/snow_machine = 10, + /obj/item/clothing/head/kitty = 5, + /obj/item/coin/antagtoken = 5, + /obj/item/toy/prizeball/figure = 15, + /obj/item/toy/prizeball/therapy = 10, + /obj/item/bedsheet/patriot = 2, + /obj/item/bedsheet/rainbow = 2, + /obj/item/bedsheet/captain = 2, + /obj/item/bedsheet/centcom = 1, //mythic rare rarity + /obj/item/bedsheet/syndie = 2, + /obj/item/bedsheet/cult = 2, + /obj/item/bedsheet/wiz = 2, + /obj/item/stack/sheet/mineral/tranquillite/fifty = 3, + /obj/item/clothing/gloves/combat = 5 + ) + +/obj/effect/spawner/lootdrop/bluespace_tap/organic + name = "organic objects" + loot = list( + /obj/item/seeds/random/labelled = 50, + /obj/item/guardiancreator/biological = 5, + /obj/item/organ/internal/vocal_cords/adamantine = 15, + /obj/item/storage/pill_bottle/random_meds/labelled = 25, + /obj/item/reagent_containers/glass/bottle/reagent/omnizine = 15, + /obj/item/dnainjector/telemut = 5, + /obj/item/dnainjector/midgit = 5, + /obj/item/dnainjector/morph = 5, + /obj/item/dnainjector/regenerate = 5, + /mob/living/simple_animal/pet/dog/corgi/ = 5, + /mob/living/simple_animal/pet/cat = 5, + /mob/living/simple_animal/pet/dog/fox/ = 5, + /mob/living/simple_animal/pet/penguin = 5, + /mob/living/simple_animal/pig = 5, + /obj/item/slimepotion/sentience = 5, + /obj/item/clothing/mask/cigarette/cigar/havana = 3, + /obj/item/stack/sheet/mineral/bananium/fifty = 2, //bananas are organic, clearly. + /obj/item/storage/box/monkeycubes = 5, + /obj/item/stack/tile/carpet/twenty = 10, + /obj/item/stack/tile/carpet/black/twenty = 10, + /obj/item/soap/deluxe = 5 + ) + +/obj/effect/spawner/lootdrop/bluespace_tap/food + name = "fancy food" + lootcount = 3 + loot = list( + /obj/item/reagent_containers/food/snacks/wingfangchu, + /obj/item/reagent_containers/food/snacks/hotdog, + /obj/item/reagent_containers/food/snacks/sliceable/turkey, + /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit, + /obj/item/reagent_containers/food/snacks/appletart, + /obj/item/reagent_containers/food/snacks/sliceable/cheesecake, + /obj/item/reagent_containers/food/snacks/sliceable/bananacake, + /obj/item/reagent_containers/food/snacks/sliceable/chocolatecake, + /obj/item/reagent_containers/food/snacks/meatballsoup, + /obj/item/reagent_containers/food/snacks/mysterysoup, + /obj/item/reagent_containers/food/snacks/stew, + /obj/item/reagent_containers/food/snacks/hotchili, + /obj/item/reagent_containers/food/snacks/burrito, + /obj/item/reagent_containers/food/snacks/fishburger, + /obj/item/reagent_containers/food/snacks/cubancarp, + /obj/item/reagent_containers/food/snacks/fishandchips, + /obj/item/reagent_containers/food/snacks/meatpie, + /obj/item/pizzabox/hawaiian, //it ONLY gives hawaiian. MUHAHAHA + /obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread //maybe add some dangerous/special food here, ie robobuger? + ) + +#define kW *1000 +#define MW kW *1000 +#define GW MW *1000 + +/** + * # Bluespace Harvester + * + * A station goal that consumes enormous amounts of power to generate (mostly fluff) rewards + * + * A machine that takes power each tick, generates points based on it + * and lets you spend those points on rewards. A certain amount of points + * has to be generated for the station goal to count as completed. + */ +/obj/machinery/power/bluespace_tap + name = "Bluespace harvester" + icon = 'icons/obj/machines/bluespace_tap.dmi' + icon_state = "bluespace_tap" //sprites by Ionward + max_integrity = 300 + pixel_x = -32 //shamelessly stolen from dna vault + pixel_y = -64 + /// For faking having a big machine, dummy 'machines' that are hidden inside the large sprite and make certain tiles dense. See new and destroy. + var/list/obj/structure/fillers = list() + use_power = NO_POWER_USE // power usage is handelled manually + density = TRUE + interact_offline = TRUE + luminosity = 1 + + /// Correspond to power required for a mining level, first entry for level 1, etc. + var/list/power_needs = list(1 kW, 5 kW, 50 kW, 100 kW, 500 kW, + 1 MW, 2 MW, 5 MW, 10 MW, 25 MW, + 50 MW, 75 MW, 125 MW, 200 MW, 500 MW, + 1 GW, 5 GW, 15 GW, 45 GW, 500 GW) + + /// list of possible products + var/static/product_list = list( + new /datum/data/bluespace_tap_product("Unknown Exotic Hat", /obj/effect/spawner/lootdrop/bluespace_tap/hat, 5000), + new /datum/data/bluespace_tap_product("Unknown Snack", /obj/effect/spawner/lootdrop/bluespace_tap/food, 6000), + new /datum/data/bluespace_tap_product("Unknown Cultural Artifact", /obj/effect/spawner/lootdrop/bluespace_tap/cultural, 15000), + new /datum/data/bluespace_tap_product("Unknown Biological Artifact", /obj/effect/spawner/lootdrop/bluespace_tap/organic, 20000) + ) + + /// The level the machine is currently mining at. 0 means off + var/input_level = 0 + /// The machine you WANT the machine to mine at. It will try to match this. + var/desired_level = 0 + /// Available mining points + var/points = 0 + /// The total points earned by this machine so far, for tracking station goal and highscore + var/total_points = 0 + /// How much power the machine needs per processing tick at the current level. + var/actual_power_usage = 0 + + + // Tweak these and active_power_usage to balance power generation + + /// Max power input level, I don't expect this to be ever reached + var/max_level = 20 + /// Amount of points to give per mining level + var/base_points = 4 + /// How high the machine can be run before it starts having a chance for dimension breaches. + var/safe_levels = 10 + + +/obj/machinery/power/bluespace_tap/New() + ..() + //more code stolen from dna vault, inculding comment below. Taking bets on that datum being made ever. + //TODO: Replace this,bsa and gravgen with some big machinery datum + var/list/occupied = list() + for(var/direct in list(EAST, WEST, SOUTHEAST, SOUTHWEST)) + occupied += get_step(src, direct) + occupied += locate(x + 1, y - 2, z) + occupied += locate(x - 1, y - 2, z) + + for(var/T in occupied) + var/obj/structure/filler/F = new(T) + F.parent = src + fillers += F + component_parts = list() + component_parts += new /obj/item/circuitboard/machine/bluespace_tap(null) + for(var/i = 1 to 5) //five of each + component_parts += new /obj/item/stock_parts/capacitor/quadratic(null) + component_parts += new /obj/item/stack/ore/bluespace_crystal(null) + if(!powernet) + connect_to_network() + +/obj/machinery/power/bluespace_tap/Destroy() + QDEL_LIST(fillers) + return ..() + +/** + * Increases the desired mining level + * + * Increases the desired mining level, that + * the machine tries to reach if there + * is enough power for it. Note that it does + * NOT increase the actual mining level directly. + */ +/obj/machinery/power/bluespace_tap/proc/increase_level() + if(desired_level < max_level) + desired_level++ +/** + * Decreases the desired mining level + * + * Decreases the desired mining level, that + * the machine tries to reach if there + * is enough power for it. Note that it does + * NOT decrease the actual mining level directly. + */ +/obj/machinery/power/bluespace_tap/proc/decrease_level() + if(desired_level > 0) + desired_level-- + +/** + * Sets the desired mining level + * + * Sets the desired mining level, that + * the machine tries to reach if there + * is enough power for it. Note that it does + * NOT change the actual mining level directly. + * Arguments: + * * t_level - The level we try to set it at, between 0 and max_level + */ +/obj/machinery/power/bluespace_tap/proc/set_level(t_level) + if(t_level < 0) + return + if(t_level > max_level) + return + desired_level = t_level + +/** + * Gets the amount of power at a set input level + * + * Gets the amount of power (in W) a set input level needs. + * Note that this is not necessarily the current power use. + * * i_level - The hypothetical input level for which we want to know the power use. + */ +/obj/machinery/power/bluespace_tap/proc/get_power_use(i_level) + if(!i_level) + return 0 + return power_needs[i_level] + +/obj/machinery/power/bluespace_tap/process() + actual_power_usage = get_power_use(input_level) + if(surplus() < actual_power_usage) //not enough power, so turn down a level + input_level-- + return // and no mining gets done + if(actual_power_usage) + add_load(actual_power_usage) + var/points_to_add = (input_level + emagged) * base_points + points += points_to_add //point generation, emagging gets you 'free' points at the cost of higher anomaly chance + total_points += points_to_add + // actual input level changes slowly + if(input_level < desired_level && (surplus() >= get_power_use(input_level + 1))) + input_level++ + else if(input_level > desired_level) + input_level-- + if(prob(input_level - safe_levels + (emagged * 5))) //at dangerous levels, start doing freaky shit. prob with values less than 0 treat it as 0 + GLOB.event_announcement.Announce("Unexpected power spike during Bluespace Harvester Operation. Extra-dimensional intruder alert. Expected location: [get_area(src).name]. [emagged ? "DANGER: Emergency shutdown failed! Please proceed with manual shutdown." : "Emergency shutdown initiated."]", "Bluespace Harvester Malfunction") + if(!emagged) + input_level = 0 //emergency shutdown unless we're sabotaged + desired_level = 0 + for(var/i in 1 to rand(1, 3)) + var/turf/location = locate(x + rand(-5, 5), y + rand(-5, 5), z) + new /obj/structure/spawner/nether/bluespace_tap(location) + + + +/obj/machinery/power/bluespace_tap/tgui_data(mob/user) + var/data[0] + + data["desiredLevel"] = desired_level + data["inputLevel"] = input_level + data["points"] = points + data["totalPoints"] = total_points + data["powerUse"] = actual_power_usage + data["availablePower"] = surplus() + data["maxLevel"] = max_level + data["emagged"] = emagged + data["safeLevels"] = safe_levels + data["nextLevelPower"] = get_power_use(input_level + 1) + + /// A list of lists, each inner list equals a datum + var/list/listed_items = list() + for(var/key = 1 to length(product_list)) + var/datum/data/bluespace_tap_product/A = product_list[key] + listed_items[++listed_items.len] = list( + "key" = key, + "name" = A.product_name, + "price" = A.product_cost) + data["product"] = listed_items + return data + + +/obj/machinery/power/bluespace_tap/attack_hand(mob/user) + add_fingerprint(user) + tgui_interact(user) + +/obj/machinery/power/bluespace_tap/attack_ghost(mob/user) + tgui_interact(user) + +/obj/machinery/power/bluespace_tap/attack_ai(mob/user) + tgui_interact(user) + +/** + * Produces the product with the desired key and increases product cost accordingly + */ +/obj/machinery/power/bluespace_tap/proc/produce(key) + if(key <= 0 || key > length(product_list)) //invalid key + return + var/datum/data/bluespace_tap_product/A = product_list[key] + if(!A) + return + if(A.product_cost > points) + return + points -= A.product_cost + A.product_cost = round(1.2 * A.product_cost, 1) + playsound(src, 'sound/magic/blink.ogg', 50) + do_sparks(2, FALSE, src) + new A.product_path(get_turf(src)) + + + +//UI stuff below + +/obj/machinery/power/bluespace_tap/tgui_act(action, params) + if(..()) + return + . = TRUE // we want to refresh in all the cases below + switch(action) + if("decrease") + decrease_level() + if("increase") + increase_level() + if("set") + set_level(text2num(params["set_level"])) + if("vend")//it's not really vending as producing, but eh + var/key = text2num(params["target"]) + produce(key) + +/obj/machinery/power/bluespace_tap/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = TRUE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "BluespaceTap", name, 650, 400, master_ui, state) + ui.open() + +//emaging provides slightly more points but at much greater risk +/obj/machinery/power/bluespace_tap/emag_act(mob/living/user as mob) + if(emagged) + return + emagged = TRUE + do_sparks(5, FALSE, src) + if(user) + user.visible_message("[user] overrides the safety protocols of [src].", "You override the safety protocols.") + +/obj/structure/spawner/nether/bluespace_tap + spawn_time = 30 SECONDS + max_mobs = 5 //Dont' want them overrunning the station + max_integrity = 250 + +/obj/structure/spawner/nether/bluespace_tap/deconstruct(disassembled) + new /obj/item/stack/ore/bluespace_crystal(loc) //have a reward + return ..() + +/obj/item/paper/bluespace_tap + name = "paper- 'The Experimental NT Bluespace Harvester - Mining other universes for science and profit!'" + info = "

Important Instructions!

Please follow all setup instructions to ensure proper operation.
\ + 1. Create a wire node with ample access to spare power. The device operates independently of APCs.
\ + 2. Create a machine frame as normal on the wire node, taking into account the device's dimensions (3 by 3 meters).
\ + 3. Insert wiring, circuit board and required components and finish construction according to NT engineering standards.
\ + 4. Ensure the device is connected to the proper power network and the network contains sufficient power.
\ + 5. Set machine to desired level. Check periodically on machine progress.
\ + 6. Optionally, spend earned points on fun and exciting rewards.

\ +

Operational Principles

\ +

The Bluespace Harvester is capable of accepting a nearly limitless amount of power to search other universes for valuables to recover. The speed of this search is controlled via the 'level' control of the device. \ + While it can be run on a low level by almost any power generation system, higher levels require work by a dedicated engineering team to power. \ + As we are interested in testing how the device performs under stress, we wish to encourage you to stress-test it and see how much power you can provide it. \ + For this reason, total shift point production will be calculated and announced at shift end. High totals may result in bonus payments to members of the Engineering department.

\ +

NT Science Directorate, Extradimensional Exploitation Research Group

\ +

Device highly experimental. Not for sale. Do not operate near small children or vital NT assets. Do not tamper with machine. In case of existential dread, stop machine immediately. \ + Please document any and all extradimensional incursions. In case of imminent death, please leave said documentation in plain sight for clean-up teams to recover.

" + +#undef kW +#undef MW +#undef GW diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 033cd9fdf94..29fd5a7877b 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -136,6 +136,10 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m invisibility = 101 var/obj/machinery/parent +/obj/structure/filler/Destroy() + parent = null + return ..() + /obj/structure/filler/ex_act() return @@ -187,12 +191,8 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m ..() /obj/machinery/dna_vault/Destroy() - for(var/V in fillers) - var/obj/structure/filler/filler = V - filler.parent = null - qdel(filler) - fillers.Cut() - . = ..() + QDEL_LIST(fillers) + return ..() /obj/machinery/dna_vault/attack_ghost(mob/user) if(stat & (BROKEN|MAINT)) diff --git a/code/modules/tgui/modules/atmos_control.dm b/code/modules/tgui/modules/atmos_control.dm new file mode 100644 index 00000000000..189031c23ac --- /dev/null +++ b/code/modules/tgui/modules/atmos_control.dm @@ -0,0 +1,29 @@ +/datum/tgui_module/atmos_control + name = "Atmospherics Control" + +/datum/tgui_module/atmos_control/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + if(..()) + return + + switch(action) + if("open_alarm") + var/obj/machinery/alarm/alarm = locate(params["aref"]) in GLOB.air_alarms + if(alarm) + alarm.tgui_interact(usr, master_ui = ui, state = GLOB.tgui_always_state) // ALWAYS is intentional here, as the master_ui pass will prevent fuckery + +/datum/tgui_module/atmos_control/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "AtmosControl", name, 800, 600, master_ui, state) + + // Send nanomaps + var/datum/asset/nanomaps = get_asset_datum(/datum/asset/simple/nanomaps) + nanomaps.send(user) + + ui.open() + +/datum/tgui_module/atmos_control/tgui_data(mob/user) + var/list/data = list() + data["alarms"] = GLOB.air_alarm_repository.air_alarm_data(GLOB.air_alarms) + + return data diff --git a/config/example/spaceRuinBlacklist.txt b/config/example/spaceRuinBlacklist.txt index e83a528fb14..4bd66bba81f 100644 --- a/config/example/spaceRuinBlacklist.txt +++ b/config/example/spaceRuinBlacklist.txt @@ -1,6 +1,6 @@ #Listing maps here will blacklist them from generating in space. #Maps must be the full path to them -#A list of maps valid to blacklist can be found at _maps\map_files\RandomRuins\SpaceRuins\_maplisting.txt +#Maps valid to be blacklisted can be found in _maps/map_files/RandomRuins/SpaceRuins #SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START #_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm @@ -39,3 +39,7 @@ # Its also important incase a white-ship console is ever built midround # DO NOT DISABLE THIS UNLESS YOU HAVE A GOOD REASON #_maps/map_files/RandomRuins/SpaceRuins/whiteship.dmm + +# The following is a force-spawned ruin consisting mostly of empty space with a shuttle docking port for the free golem shuttle +# Disabling it will lead to the free golem shuttle sometimes being stuck on lavaland. +#_maps/map_files/RandomRuins/SpaceRuins/golemtarget.dmm diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index b073bece409..d901f351785 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -159,6 +159,11 @@ var/list/chatResources = list( return if(cookie != "none") + var/regex/crashy_thingy = new /regex("(\\\[ *){5}") + if(crashy_thingy.Find(cookie)) + message_admins("[key_name(src.owner)] tried to crash the server using malformed JSON") + log_admin("[key_name(owner)] tried to crash the server using malformed JSON") + return var/list/connData = json_decode(cookie) if(connData && islist(connData) && connData.len > 0 && connData["connData"]) connectionHistory = connData["connData"] diff --git a/icons/_nanomaps/MetaStation_nanomap_z1.png b/icons/_nanomaps/MetaStation_nanomap_z1.png index 70c0b1fe013..210806b2d9d 100644 Binary files a/icons/_nanomaps/MetaStation_nanomap_z1.png and b/icons/_nanomaps/MetaStation_nanomap_z1.png differ diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi index 011baf1e4ac..7238ef6072e 100644 Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 6f3e3f0ea2e..8620822ca5d 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/species/drask/eyes.dmi b/icons/mob/species/drask/eyes.dmi index 92b8d7c2190..697a8c7fa8d 100644 Binary files a/icons/mob/species/drask/eyes.dmi and b/icons/mob/species/drask/eyes.dmi differ diff --git a/icons/mob/species/grey/eyes.dmi b/icons/mob/species/grey/eyes.dmi index c3914dfd0be..522756904f0 100644 Binary files a/icons/mob/species/grey/eyes.dmi and b/icons/mob/species/grey/eyes.dmi differ diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi index dfa565dd2a7..4d3e8c984dd 100644 Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index fb4063c1bf4..c17502604fe 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 1e61cebb799..d3566b2a659 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/machines/bluespace_tap.dmi b/icons/obj/machines/bluespace_tap.dmi new file mode 100644 index 00000000000..1688b2c5ba4 Binary files /dev/null and b/icons/obj/machines/bluespace_tap.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 9a544fe7951..2b2f41e06f3 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,13 +1,10 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki(query as text) +/client/verb/wiki() set name = "wiki" set desc = "Type what you want to know about. This will open the wiki in your web browser." set hidden = 1 if(config.wikiurl) - if(query) - var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query - src << link(output) - else + if(alert("Open the wiki in your browser?", null, "Yes", "No") == "Yes") src << link(config.wikiurl) else to_chat(src, "The wiki URL is not set in the server configuration.") @@ -18,7 +15,7 @@ set desc = "Visit the forum." set hidden = 1 if(config.forumurl) - if(alert("Open the forum in your browser?",,"Yes","No")=="Yes") + if(alert("Open the forum in your browser?", null, "Yes", "No") == "Yes") if(config.forum_link_url && prefs && !prefs.fuid) link_forum_account() src << link(config.forumurl) @@ -30,7 +27,7 @@ set desc = "View the server rules." set hidden = 1 if(config.rulesurl) - if(alert("This will open the rules in your browser. Are you sure?",,"Yes","No")=="No") + if(alert("This will open the rules in your browser. Are you sure?", null, "Yes", "No") == "No") return src << link(config.rulesurl) else @@ -41,7 +38,7 @@ set desc = "Visit the GitHub page." set hidden = 1 if(config.githuburl) - if(alert("This will open our GitHub repository in your browser. Are you sure?",,"Yes","No")=="No") + if(alert("This will open our GitHub repository in your browser. Are you sure?", null, "Yes", "No") == "No") return src << link(config.githuburl) else @@ -58,7 +55,7 @@ if(!durl) to_chat(src, "The Discord URL is not set in the server configuration.") return - if(alert("This will invite you to our Discord server. Are you sure?",,"Yes","No")=="No") + if(alert("This will invite you to our Discord server. Are you sure?", null, "Yes", "No") == "No") return src << link(durl) @@ -67,7 +64,7 @@ set desc = "Donate to help with hosting costs." set hidden = 1 if(config.donationsurl) - if(alert("This will open the donation page in your browser. Are you sure?",,"Yes","No")=="No") + if(alert("This will open the donation page in your browser. Are you sure?", null, "Yes", "No") == "No") return src << link(config.donationsurl) else diff --git a/nano/templates/advanced_airlock_console.tmpl b/nano/templates/advanced_airlock_console.tmpl deleted file mode 100644 index 1bac2e16e98..00000000000 --- a/nano/templates/advanced_airlock_console.tmpl +++ /dev/null @@ -1,60 +0,0 @@ -
-
-
- External Pressure: -
-
- {{:helper.displayBar(data.external_pressure, 0, 200, (data.external_pressure < 80 || data.external_pressure > 120) ? 'bad' : (data.external_pressure < 95 || data.external_pressure > 110) ? 'average' : 'good')}} -
- {{:helper.smoothRound(data.external_pressure)}} kPa -
-
-
-
-
- Chamber Pressure: -
-
- {{:helper.displayBar(data.chamber_pressure, 0, 200, (data.chamber_pressure < 80 || data.chamber_pressure > 120) ? 'bad' : (data.chamber_pressure < 95 || data.chamber_pressure > 110) ? 'average' : 'good')}} -
- {{:helper.smoothRound(data.chamber_pressure)}} kPa -
-
-
-
-
- Internal Pressure: -
-
- {{:helper.displayBar(data.internal_pressure, 0, 200, (data.internal_pressure < 80 || data.internal_pressure > 120) ? 'bad' : (data.internal_pressure < 95 || data.internal_pressure > 110) ? 'average' : 'good')}} -
- {{:helper.smoothRound(data.internal_pressure)}} kPa -
-
-
-
-
-
-
- {{:helper.link('Cycle to Exterior', 'arrow-circle-o-left', {'command' : 'cycle_ext'}, data.processing ? 'disabled' : null)}} - {{:helper.link('Cycle to Interior', 'arrow-circle-right', {'command' : 'cycle_int'}, data.processing ? 'disabled' : null)}} -
-
- {{:helper.link('Force exterior door', 'exclamation-triangle', {'command' : 'force_ext'}, null, data.processing ? 'yellowButton' : null)}} - {{:helper.link('Force interior door', 'exclamation-triangle', {'command' : 'force_int'}, null, data.processing ? 'yellowButton' : null)}} -
-
-
-
-
- {{:helper.link('Purge', 'refresh', {'command' : 'purge'}, data.processing ? 'disabled' : null, data.purge ? 'linkOn' : null)}} -
-
- {{:helper.link('Secure', data.secure ? 'lock' : 'unlock', {'command' : 'secure'}, data.processing ? 'disabled' : null, data.secure ? 'linkOn' : null)}} -
-
-
-
- {{:helper.link('Abort', 'ban', {'command' : 'abort'}, data.processing ? null : 'disabled', data.processing ? 'redButton' : null)}} -
-
\ No newline at end of file diff --git a/nano/templates/ai_restorer.tmpl b/nano/templates/ai_restorer.tmpl deleted file mode 100644 index eb4c20a74f8..00000000000 --- a/nano/templates/ai_restorer.tmpl +++ /dev/null @@ -1,45 +0,0 @@ -{{if data.restoring}} -
Reconstruction in progress!
-{{/if}} - -
-
Inserted AI:
-
{{:helper.link(data.name ? data.name : "-----", 'eject', {'action' : 'PRG_eject'}, data.nocard ? 'disabled' : null)}}
-
- -{{if data.error}} - ERROR: {{:data.error}} -{{else}} -

System Status

-
-
-
Current AI:
-
{{:data.name}}
-
-
-
Status:
-
{{if data.isDead}}Nonfunctional{{else}}Functional{{/if}}
-
-
-
System Integrity:
- {{:helper.displayBar(data.health, 0, 100, (data.health > 75) ? 'good' : (data.health > 50) ? 'average' : 'bad')}} -
- {{:helper.smoothRound(data.health)}}% -
-
-
-
- Active Laws: -
-
- - {{for data.ai_laws}} -
{{:value.index}}: {{:value.text}} - {{/for}} -
-
-
-
-

Operations

- {{:helper.link('Begin Reconstruction', 'plus', {'action' : 'PRG_beginReconstruction'}, data.restoring ? 'disabled' : null)}} -{{/if}} \ No newline at end of file diff --git a/nano/templates/air_alarm.tmpl b/nano/templates/air_alarm.tmpl deleted file mode 100644 index 2f4cc8c5504..00000000000 --- a/nano/templates/air_alarm.tmpl +++ /dev/null @@ -1,254 +0,0 @@ - - -

{{:data.name}}

-{{if !data.air}} -
Unable to acquire air sample.
-{{else}} -
-
-
Pressure:
- {{:helper.string("
{1} kPa
",helper.dangerToClass(data.air.danger.pressure),helper.smoothRound(data.air.pressure,4))}} -
- {{if !data.locked}} - {{if data.mode == 3}} - {{:helper.link("DEACTIVATE PANIC SYPHON",null,{"mode" : 1},null,'linkOn')}} - {{else}} - {{:helper.link("ACTIVATE PANIC SYPHON",null,{"mode" : 3},null,'red')}} - {{/if}} - {{/if}} -
-
-
-
Oxygen:
- {{:helper.displayBar(data.air.contents.oxygen, 0, 100, helper.dangerToClass(data.air.danger.oxygen))}} - {{:helper.string("
{1}%
",helper.dangerToClass(data.air.danger.oxygen),helper.smoothRound(data.air.contents.oxygen))}} -
-
-
Nitrogen:
- {{:helper.displayBar(data.air.contents.nitrogen, 0, 100, helper.dangerToClass(data.air.danger.nitrogen))}} - {{:helper.string("
{1}%
",helper.dangerToClass(data.air.danger.nitrogen),helper.smoothRound(data.air.contents.nitrogen,0))}} -
-
-
Carbon Dioxide:
- {{:helper.displayBar(data.air.contents.co2, 0, 100, helper.dangerToClass(data.air.danger.co2))}} - {{:helper.string("
{1}%
",helper.dangerToClass(data.air.danger.co2),helper.smoothRound(data.air.contents.co2,0))}} -
-
-
Toxins:
- {{:helper.displayBar(data.air.contents.plasma, 0, 100, helper.dangerToClass(data.air.danger.plasma))}} - {{:helper.string("
{1}%
",helper.dangerToClass(data.air.danger.plasma),helper.smoothRound(data.air.contents.plasma,0))}} -
- {{if data.air.danger.other>0}} -
-
Other:
- {{:helper.displayBar(data.air.contents.other, 0, 100, helper.dangerToClass(data.air.danger.other))}} - {{:helper.string("
{1}%
",helper.dangerToClass(data.air.danger.other),helper.smoothRound(data.air.contents.other,0))}} -
- {{/if}} -
-
- Temperature: -
- {{:helper.string("
{1}°K ({2}°C)
",helper.dangerToClass(data.air.danger.temperature),helper.smoothRound(data.air.temperature,2),helper.smoothRound(data.air.temperature_c,2))}} -
-
-
Local Status:
- {{if data.air.danger.overall == 0}} - {{if data.atmos_alarm}} -
Caution: Atmos alert in area
- {{else}} -
Optimal
- {{/if}} - {{else data.air.danger.overall == 1}} -
Caution
- {{else}} -
DANGER: Internals Required
- {{/if}} - {{if !data.locked}} - {{if data.alarmActivated}} - {{:helper.link('Reset Alarm',null,{'atmos_reset':1},null,'linkOn')}} - {{else}} - {{:helper.link('Activate Alarm',null,{'atmos_alarm':1},null)}} - {{/if}} - {{/if}} -
-
- -
Remote Control:
- {{:helper.link('Off', null, {'rcon' : 1}, data.remote_connection && !data.remote_access ? (data.rcon == 1 ? '' : 'disabled') : null, data.rcon == 1 ? 'selected' : null)}} - {{:helper.link('Auto', null, {'rcon' : 2}, data.remote_connection && !data.remote_access ? (data.rcon == 2 ? '' : 'disabled') : null, data.rcon == 2 ? 'selected' : null)}} - {{:helper.link('On', null, {'rcon' : 3}, data.remote_connection && !data.remote_access ? (data.rcon == 3 ? '' : 'disabled') : null, data.rcon == 3 ? 'selected' : null)}} -
-
-
Thermostat:
- {{:helper.link(data.target_temp+" C", 'thermometer', {'temperature': 1})}} -
-
-{{/if}} - -{{if data.locked}} -
Swipe card to unlock.
-{{else}} -
Remember to lock with ID card after use.
-
-
Screen:
-
- {{:helper.link('Main', 'gear',{'screen':1},(data.screen==1)?'linkOn':'')}} - {{:helper.link('Vents', 'gear',{'screen':2},(data.screen==2)?'linkOn':'')}} - {{:helper.link('Scrubbers', 'gear',{'screen':3},(data.screen==3)?'linkOn':'')}} - {{:helper.link('Mode', 'gear',{'screen':4},(data.screen==4)?'linkOn':'')}} - {{:helper.link('Thresholds','gear',{'screen':5},(data.screen==5)?'linkOn':'')}} -
-
- - {{if data.screen == 2}} -

Vent Pump Settings

- {{for data.vents}} -
-
- {{>value.name}}: -
-
-
Operating:
-
- {{:helper.link(value.power ? 'On':'Off','power-off',{'id_tag':value.id_tag,'command':'power','val':value.power?0:1},null)}} - {{if value.direction=="siphon"}} - {{:helper.link('Siphoning','arrow-circle-down',{'id_tag':value.id_tag,'command':'direction','val':'1'})}} - {{else}} - {{:helper.link('Blowing','arrow-up',{'id_tag':value.id_tag,'command':'direction','val':'0'})}} - {{/if}} -
-
-
-
Pressure checks:
-
- {{:helper.link('External', 'power-off',{'id_tag':value.id_tag,'command':'checks','val':1},null,(value.checks == 1 ?'linkOn':''))}} - {{:helper.link('Internal', 'power-off',{'id_tag':value.id_tag,'command':'checks','val':2},null,(value.checks == 2 ?'linkOn':''))}} -
-
-
-
External pressure target:
-
- {{:helper.smoothRound(value.external,4)}} kPa -
- {{:helper.link('Set','gear',{'id_tag':value.id_tag,'command':'set_external_pressure'})}} - {{:helper.link('Reset','refresh',{'id_tag':value.id_tag,'command':'set_external_pressure','val':101.325},null,'linkOn')}} -
-
- {{empty}} - No vent pumps located in this area. - {{/for}} - - {{else data.screen == 3}} -

Scrubbers

- {{for data.scrubbers}} -
-
- {{>value.name}}: -
-
-
Operating:
-
- {{:helper.link(value.power ? 'On':'Off','power-off',{'id_tag':value.id_tag,'command':'power','val':value.power?0:1},null)}} -
-
-
-
Type:
-
- {{if value.scrubbing==0}} - {{:helper.link('Siphoning','arrow-circle-down',{'id_tag':value.id_tag,'command':'scrubbing','val':1},null,'red')}} - {{else}} - {{:helper.link('Scrubbing','exchange',{'id_tag':value.id_tag,'command':'scrubbing','val':0},null,'linkOn')}} - {{/if}} -
-
-
-
Scrub Range:
-
- {{:helper.link(value.widenet ? 'Extended' : 'Normal', null, { 'id_tag' : value.id_tag, 'command' : 'widenet', 'val' : value.widenet ? 0 : 1}, null, value.widenet ? 'selected' : null)}} -
-
- {{if value.scrubbing==1}} -
-
Filtering:
-
- {{:helper.link('CO2',null,{'id_tag':value.id_tag,'command':'co2_scrub','val':(value.filter_co2==0?1:0)},null,(value.filter_co2?'linkOn':''))}} - {{:helper.link('Plasma', null,{'id_tag':value.id_tag,'command':'tox_scrub','val':(value.filter_toxins==0?1:0)},null,(value.filter_toxins?'linkOn':''))}} - {{:helper.link('N2O',null,{'id_tag':value.id_tag,'command':'n2o_scrub','val':(value.filter_n2o==0?1:0)},null,(value.filter_n2o?'linkOn':''))}} - {{:helper.link('O2', null,{'id_tag':value.id_tag,'command':'o2_scrub', 'val':(value.filter_o2 ==0?1:0)},null,(value.filter_o2 ?'linkOn':''))}} - {{:helper.link('N2', null,{'id_tag':value.id_tag,'command':'n2_scrub', 'val':(value.filter_n2 ==0?1:0)},null,(value.filter_n2 ?'linkOn':''))}} -
-
- {{/if}} -
- {{empty}} - No scrubbers located in this area. - {{/for}} - - {{else data.screen == 4}} -

System Mode

-
- {{for data.modes}} - {{if !value.emagonly || value.emagonly && data.emagged}} -
-
{{:helper.link(value.name,'gear',{'mode':index+1},null,(index+1==data.mode?'linkOn':value.emagonly ? 'redButton' : ''))}}
-
- {{:value.desc}} -
-
- {{/if}} - {{/for}} -
-

System Preset

-
After making a selection, the system will automatically cycle in order to remove contaminants.
-
- {{for data.presets}} -
-
{{:helper.link(value.name,'gear',{'preset':index+1},null,(index+1==data.preset?'linkOn':''))}}
-
- {{:value.desc}} -
-
- {{/for}} -
- - {{else data.screen == 5}} -

Alarm Threshold

- Partial pressure for gases. - - - - - {{for data.thresholds}} - - - {{for value.settings :selectedItem:SelectedNull}} - - {{/for}} - - {{/for}} -
min2min1max1max2
{{:value.name}} - {{:helper.link(selectedItem.selected >= 0 ? helper.round(selectedItem.selected*100)/100 : "Off", null, { 'command' : 'set_threshold', 'env' : selectedItem.env, 'var' : selectedItem.val })}} -
- {{/if}} -{{/if}} \ No newline at end of file diff --git a/nano/templates/atmos_control.tmpl b/nano/templates/atmos_control.tmpl deleted file mode 100644 index 20972df7632..00000000000 --- a/nano/templates/atmos_control.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -{{:helper.link('Show Tracker Map', 'thumb-tack', {'showMap' : 1})}} -

Atmospherics Control

-
- {{for data.alarms}} -
- {{:helper.string("
{1}
", helper.dangerToClass(value.danger), value.name)}} - {{:helper.link("Access", "gear", {"alarm" : value.ref}, null, "floatRight")}} -
- {{/for}} -
\ No newline at end of file diff --git a/nano/templates/atmos_control_map_content.tmpl b/nano/templates/atmos_control_map_content.tmpl deleted file mode 100644 index e1a513ba9f2..00000000000 --- a/nano/templates/atmos_control_map_content.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -{{for data.alarms}} - {{if value.z == 1}} -
- -
- {{/if}} -{{/for}} \ No newline at end of file diff --git a/nano/templates/atmos_control_map_header.tmpl b/nano/templates/atmos_control_map_header.tmpl deleted file mode 100644 index c64fce951f7..00000000000 --- a/nano/templates/atmos_control_map_header.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -{{:helper.link('Show Detail List', 'file-text', {'showMap' : 0})}} -
- Zoom Level:  - - - - -
diff --git a/nano/templates/door_access_console.tmpl b/nano/templates/door_access_console.tmpl deleted file mode 100644 index 8ef37a64910..00000000000 --- a/nano/templates/door_access_console.tmpl +++ /dev/null @@ -1,42 +0,0 @@ -
-
-
- Exterior Door Status: -
-
- {{if data.exterior_status.state == "closed"}} - Locked - {{else}} - Open - {{/if}} -
-
-
-
- Interior Door Status: -
-
- {{if data.interior_status.state == "closed"}} - Locked - {{else}} - Open - {{/if}} -
-
-
-
-
-
- {{if data.exterior_status.state == "open"}} - {{:helper.link('Lock Exterior Door', 'exclamation-triangle', {'command' : 'force_ext'}, data.processing ? 'disabled' : null)}} - {{else}} - {{:helper.link('Cycle to Exterior', 'arrow-circle-o-left', {'command' : 'cycle_ext_door'}, data.processing ? 'disabled' : null)}} - {{/if}} - {{if data.interior_status.state == "open"}} - {{:helper.link('Lock Interior Door', 'exclamation-triangle', {'command' : 'force_int'}, data.processing ? 'disabled' : null)}} - {{else}} - {{:helper.link('Cycle to Interior', 'arrow-circle-right', {'command' : 'cycle_int_door'}, data.processing ? 'disabled' : null)}} - {{/if}} -
-
-
\ No newline at end of file diff --git a/nano/templates/exosuit_control.tmpl b/nano/templates/exosuit_control.tmpl deleted file mode 100644 index 111b63040ff..00000000000 --- a/nano/templates/exosuit_control.tmpl +++ /dev/null @@ -1,81 +0,0 @@ - -{{if data.screen == 0}} - {{for data.mechas}} -
-
-

{{:value.name}}

-

Information

-
- Pilot: -
-
- {{:value.pilot}} -
-
- Integrity: -
-
- {{:helper.smoothRound(value.integrity)}}% -
-
- Location: -
-
- {{:value.location}} -
-
- Airtank: -
-
- {{:helper.smoothRound(value.airtank)}}kPa -
-
- Active Equipment: -
-
- {{:value.equipment}} -
- {{if value.hascargo}} -
- Cargo Used: -
-
- {{:value.cargo}}% -
- {{/if}} - -

Power Cell

- {{if value.cell}} - - Rating: - - - {{:value.cell_capacity}} - - {{:helper.displayBar(value.cell_percentage, 0, 100, (value.cell_percentage >= 50) ? 'good' : (value.cell_percentage >= 25) ? 'average' : 'bad')}} - {{:helper.smoothRound(value.cell_percentage)}}% - {{else}} - Not Installed - {{:helper.displayBar(100, 0, 100, 'bad')}} - {{/if}} - - -

Actions

- {{:helper.link('Send Message', 'envelope', {'send_message' : value.reference})}} - {{:helper.link('Exosuit Log', 'search', {'get_log' : value.reference})}} - {{:helper.link('EMP Pulse', 'exclamation-triangle', {'shock' : value.reference}, null, 'redButton')}} -
- {{empty}} -
-

No mecha trackers were found.

-
- {{/for}} -{{else}} -
- {{:helper.link('Return', 'close', {'return' : 1})}} -
- {{:data.log}} -{{/if}} \ No newline at end of file diff --git a/nano/templates/pai_atmosphere.tmpl b/nano/templates/pai_atmosphere.tmpl deleted file mode 100644 index f8764f5a3a7..00000000000 --- a/nano/templates/pai_atmosphere.tmpl +++ /dev/null @@ -1,36 +0,0 @@ - - -{{if data.reading}} -
-
- Pressure: -
-
- {{:helper.smoothRound(data.pressure, 1)}} kPa -
-
- -
-
- Temperature: -
-
- {{:helper.smoothRound(data.temperature)}}K ({{:helper.smoothRound(data.temperatureC)}}°C) -
-
- - {{for data.gas}} -
-
- {{:value.name}}: -
-
- {{:helper.smoothRound(value.percent)}}% -
-
- {{/for}} -{{else}} - Unable to obtain air reading! -{{/if}} diff --git a/nano/templates/pai_bioscan.tmpl b/nano/templates/pai_bioscan.tmpl deleted file mode 100644 index 921588045a1..00000000000 --- a/nano/templates/pai_bioscan.tmpl +++ /dev/null @@ -1,30 +0,0 @@ - - -{{if data.holder}} -
-
- Bioscan Results for {{:data.holder}} : -
-
- Health Status : {{:data.health}} -
- -
- Brute Damage : {{:data.brute}} -
- Oxygen Content : {{:data.oxy}} -
- Toxin Content : {{:data.tox}} -
-
- Burn Status : {{:data.burn}} -
-
- User Temperature : {{:data.temp}} -
-
-{{else}} - Error: No biological host found! -{{/if}} diff --git a/nano/templates/pai_chatroom.tmpl b/nano/templates/pai_chatroom.tmpl deleted file mode 100644 index d669a375d86..00000000000 --- a/nano/templates/pai_chatroom.tmpl +++ /dev/null @@ -1,76 +0,0 @@ - - -
-
- Receiver: -
-
- {{if data.receiver_off}} - {{:helper.link("On", '', {"stopic":"chatroom", "toggler":1})}} - {{:helper.link("Off", '', {"stopic":"chatroom", "toggler":2}, 'selected')}} - {{else}} - {{:helper.link("On", '', {"stopic":"chatroom", "toggler":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"chatroom", "toggler":2})}} - {{/if}} -
-
- -
-
- Ringer: -
-
- {{if data.ringer_off}} - {{:helper.link("On", '', {"stopic":"chatroom", "ringer":1})}} - {{:helper.link("Off", '', {"stopic":"chatroom", "ringer":2}, 'selected')}} - {{else}} - {{:helper.link("On", '', {"stopic":"chatroom", "ringer":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"chatroom", "ringer":2})}} - {{/if}} -
-
- -{{for data.rooms}} -
- {{:helper.link(value.name, '', {"stopic":"chatroom", "select":value.ref})}} - {{:helper.link("Quick Message", '', {"stopic":"chatroom", "target":value.ref})}} -
-{{/for}} -
-{{if data.disconnected}} -

Connection Lost

- {{:helper.link("Reconnect", 'refresh', {"stopic":"chatroom", "reconnect":1})}} -{{else data.current_room}} -

#{{:data.current_room_name}}

-
- Topic:
-
{{:helper.link(data.current_room_topic, '', {"stopic":"chatroom", "topic":1})}}
-
-
-
Users:
-
- {{var firstUser = true;}} - {{for data.users}} - {{:firstUser ? "" : ", "}}{{:value}} - {{firstUser = false;}} - {{/for}} -
-
- {{var prevName = "";}} - {{for data.messages}} -
-
{{:value.username!=prevName ? value.username : " "}}
-
- {{:value.message}} -
-
- {{prevName = value.username;}} - {{/for}} - {{:helper.link("Send Message", '', {"stopic":"chatroom", "target":data.current_room})}} -{{/if}} - -{{if data.current_name}} - {{:helper.link("Clear Screen", '', {"stopic":"chatroom", "select":"*NONE*"})}} -{{/if}} diff --git a/nano/templates/pai_directives.tmpl b/nano/templates/pai_directives.tmpl deleted file mode 100644 index 2caff849a26..00000000000 --- a/nano/templates/pai_directives.tmpl +++ /dev/null @@ -1,50 +0,0 @@ - - -
-
- Master: -
-
- {{if data.master}} - {{:data.master}} ({{:data.dna}}) - {{:helper.link("Request carrier DNA sample", '', {"stopic":"directives", "getdna":1})}} - {{else}} - None - {{/if}} -
-
- -
-
- Prime Directive: -
-
- {{:data.prime}} -
-
- -
-
- Supplemental Directive(s): -
-
- {{if data.supplemental}} - {{:data.supplemental}} - {{else}} - None - {{/if}} -
-
- -
- - Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of comprehending the subtle nuances of human language. You may parse the "spirit" of a directive and follow its intent, rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are. - -
-
- - Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your prime directive to the best of your ability. - -
\ No newline at end of file diff --git a/nano/templates/pai_doorjack.tmpl b/nano/templates/pai_doorjack.tmpl deleted file mode 100644 index 69abd861e80..00000000000 --- a/nano/templates/pai_doorjack.tmpl +++ /dev/null @@ -1,44 +0,0 @@ - - -
-
- Cable: -
-
- {{if data.machine}} - {{:helper.link("Connected", '', {}, 'selected')}} - {{else data.cable}} - {{:helper.link("Extended", '', {}, 'yellowButton')}} - {{else}} - {{:helper.link("Retracted", '', {"stopic":"door_jack", "cable":1})}} - {{/if}} -
-
- -{{if data.machine}} -
-
- Hack: -
-
- {{if data.inprogress}} - {{if data.progress_a <= 33}} -
{{:helper.smoothRound(data.progress_a)}}.{{:helper.smoothRound(data.progress_b)}}%
- {{else data.progress_a <= 67}} -
{{:helper.smoothRound(data.progress_a)}}.{{:helper.smoothRound(data.progress_b)}}%
- {{else}} -
{{:helper.smoothRound(data.progress_a)}}.{{:helper.smoothRound(data.progress_b)}}%
- {{/if}} - {{:helper.link("Cancel", '', {"stopic":"door_jack", "cancel":1}, null, 'redButton')}} - {{else}} - {{:helper.link("Start", '', {"stopic":"door_jack", "jack":1})}} - {{/if}} -
-
-{{else data.aborted}} -
-
Hack aborted!
-
-{{/if}} \ No newline at end of file diff --git a/nano/templates/pai_interface.tmpl b/nano/templates/pai_interface.tmpl deleted file mode 100644 index e6441932665..00000000000 --- a/nano/templates/pai_interface.tmpl +++ /dev/null @@ -1,45 +0,0 @@ - - - - - Emotion: - - - {{for data.emotions}} - {{:helper.link(value.name, '', {"image" : value.id}, data.current_emotion == value.id ? 'selected' : null)}} - {{/for}} - - - - - - Installed Software: - - - {{for data.bought}} - {{:helper.link(value.name, '', {"software" : value.id}, null, value.on ? 'selected' : null)}} - {{/for}} - - - - - - Available RAM: - - - {{:data.available_ram}} - - - - - - Downloadable Software: - - - {{for data.not_bought}} - {{:helper.link(value.name + " (" + value.ram + ")", '', {"purchase" : value.id}, value.ram <= data.available_ram ? null : 'disabled')}} - {{/for}} - - \ No newline at end of file diff --git a/nano/templates/pai_manifest.tmpl b/nano/templates/pai_manifest.tmpl deleted file mode 100644 index d6827594e35..00000000000 --- a/nano/templates/pai_manifest.tmpl +++ /dev/null @@ -1,98 +0,0 @@ - - -
-
- {{if data.manifest.heads}} - - {{for data.manifest["heads"]}} - {{if value.rank == "Captain"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.sec}} - - {{for data.manifest["sec"]}} - {{if value.rank == "Head of Security"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.eng}} - - {{for data.manifest["eng"]}} - {{if value.rank == "Chief Engineer"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.med}} - - {{for data.manifest["med"]}} - {{if value.rank == "Chief Medical Officer"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.sci}} - - {{for data.manifest["sci"]}} - {{if value.rank == "Research Director"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.ser}} - - {{for data.manifest["ser"]}} - {{if value.rank == "Head of Personnel"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.sup}} - - {{for data.manifest["sup"]}} - {{if value.rank == "Head of Personnel"}} - - {{else value.rank == "Quartermaster"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.civ}} - - {{for data.manifest["civ"]}} - {{if value.rank == "Head of Personnel"}} - - {{else}} - - {{/if}} - {{/for}} - {{/if}} - {{if data.manifest.misc}} - - {{for data.manifest["misc"]}} - - {{/for}} - {{/if}} -
Command
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Security
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Engineering
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Medical
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Science
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Service
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Supply
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Civilian
{{:value.name}}{{:value.rank}}{{:value.active}}
{{:value.name}}{{:value.rank}}{{:value.active}}
Misc
{{:value.name}}{{:value.rank}}{{:value.active}}
- diff --git a/nano/templates/pai_medrecords.tmpl b/nano/templates/pai_medrecords.tmpl deleted file mode 100644 index 37b1d7061ca..00000000000 --- a/nano/templates/pai_medrecords.tmpl +++ /dev/null @@ -1,86 +0,0 @@ - - -{{if data.records}} - {{for data.records}} -
- {{:helper.link(value.name, '', {"stopic":"med_records", "select":value.ref})}} -
- {{/for}} -{{/if}} -
-{{if data.general}} -
-
Name
-
{{:data.general.name}}
-
-
-
Record ID
-
{{:data.general.id}}
-
-
-
Sex
-
{{:data.general.sex}}
-
-
-
Species
-
{{:data.general.species}}
-
-
-
Age
-
{{:data.general.age}}
-
-
-
Rank
-
{{:data.general.rank}}
-
-
-
Fingerprint
-
{{:data.general.fingerprint}}
-
-
-
Physical Status
-
{{:data.general.p_stat}}
-
-
-
Mental Status
-
{{:data.general.m_stat}}
-
-{{/if}} -{{if data.medical}} -
-
Blood Type
-
{{:data.medical.b_type}}
-
-
-
Minor Disabilities
-
{{:data.medical.mi_dis}}
-
{{:data.medical.mi_dis_d}}
-
-
-
Major Disabilities
-
{{:data.medical.ma_dis}}
-
{{:data.medical.ma_dis_d}}
-
-
-
Allergies
-
{{:data.medical.alg}}
-
{{:data.medical.alg_d}}
-
-
-
Current Diseases
-
{{:data.medical.cdi}}
-
{{:data.medical.cdi_d}}
-
-
-
Important Notes
-
{{:data.medical.notes}}
-
-{{/if}} - -{{if data.could_not_find}} -
- Failed to find some records; the information above may be incomplete or missing. -
-{{/if}} \ No newline at end of file diff --git a/nano/templates/pai_messenger.tmpl b/nano/templates/pai_messenger.tmpl deleted file mode 100644 index fb20f826f27..00000000000 --- a/nano/templates/pai_messenger.tmpl +++ /dev/null @@ -1,80 +0,0 @@ - - -
-
- Receiver: -
-
- {{if data.receiver_off}} - {{:helper.link("On", '', {"stopic":"messenger", "toggler":1})}} - {{:helper.link("Off", '', {"stopic":"messenger", "toggler":2}, 'selected')}} - {{else}} - {{:helper.link("On", '', {"stopic":"messenger", "toggler":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"messenger", "toggler":2})}} - {{/if}} -
-
- -
-
- Ringer: -
-
- {{if data.ringer_off}} - {{:helper.link("On", '', {"stopic":"messenger", "ringer":1})}} - {{:helper.link("Off", '', {"stopic":"messenger", "ringer":2}, 'selected')}} - {{else}} - {{:helper.link("On", '', {"stopic":"messenger", "ringer":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"messenger", "ringer":2})}} - {{/if}} -
-
- -{{for data.pdas}} -
- {{:helper.link(value.name, '', {"stopic":"messenger", "select":value.owner})}} - {{:helper.link("Quick Message", '', {"stopic":"messenger", "target":value.ref})}} -
-{{/for}} -
-{{if data.current_ref}} -
-
- Selected PDA: -
-
-
{{:data.current_name}}
- {{:helper.link("Send Message", '', {"stopic":"messenger", "target":data.current_ref})}} -
-
-{{else data.current_name}} -
-
- Selected PDA: -
-
- {{:data.current_name}} (Cannot send!) -
-
-{{/if}} - -{{for data.messages}} -
-
- {{if value.sent}} - To {{:value.target}}: - {{else}} - From {{:value.target}}: - {{/if}} -
-
- {{:value.message}} -
-
-{{/for}} - -{{if data.current_name}} - {{:helper.link("Clear Screen", '', {"stopic":"messenger", "select":"*NONE*"})}} -{{/if}} diff --git a/nano/templates/pai_radio.tmpl b/nano/templates/pai_radio.tmpl deleted file mode 100644 index bcdacdb48f1..00000000000 --- a/nano/templates/pai_radio.tmpl +++ /dev/null @@ -1,48 +0,0 @@ - - -
-
- Microphone: -
-
- {{if data.listening}} - {{:helper.link("On", '', {"stopic":"radio", "talk":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"radio", "talk":1})}} - {{else}} - {{:helper.link("On", '', {"stopic":"radio", "talk":1})}} - {{:helper.link("Off", '', {"stopic":"radio", "talk":1}, 'selected')}} - {{/if}} -
-
- -
-
- Frequency: -
-
- {{:helper.link("--", '', {"stopic":"radio", "freq":-10})}} - {{:helper.link("-", '', {"stopic":"radio", "freq": -2})}} -
{{:data.frequency}}
- {{:helper.link("+", '', {"stopic":"radio", "freq": 2})}} - {{:helper.link("++", '', {"stopic":"radio", "freq": 10})}} -
-
- -{{for data.channels}} -
-
- {{:value.name}} -
-
- {{if value.listening}} - {{:helper.link("On", '', {"stopic":"radio", "channel":value.name, "listen":1}, 'selected')}} - {{:helper.link("Off", '', {"stopic":"radio", "channel":value.name, "listen":1})}} - {{else}} - {{:helper.link("On", '', {"stopic":"radio", "channel":value.name, "listen":1})}} - {{:helper.link("Off", '', {"stopic":"radio", "channel":value.name, "listen":1}, 'selected')}} - {{/if}} -
-
-{{/for}} \ No newline at end of file diff --git a/nano/templates/pai_secrecords.tmpl b/nano/templates/pai_secrecords.tmpl deleted file mode 100644 index e139034c0de..00000000000 --- a/nano/templates/pai_secrecords.tmpl +++ /dev/null @@ -1,76 +0,0 @@ - - -{{if data.records}} - {{for data.records}} -
- {{:helper.link(value.name, '', {"stopic":"sec_records", "select":value.ref})}} -
- {{/for}} -{{/if}} -
-{{if data.general}} -
-
Name
-
{{:data.general.name}}
-
-
-
Record ID
-
{{:data.general.id}}
-
-
-
Sex
-
{{:data.general.sex}}
-
-
-
Species
-
{{:data.general.species}}
-
-
-
Age
-
{{:data.general.age}}
-
-
-
Rank
-
{{:data.general.rank}}
-
-
-
Fingerprint
-
{{:data.general.fingerprint}}
-
-
-
Physical Status
-
{{:data.general.p_stat}}
-
-
-
Mental Status
-
{{:data.general.m_stat}}
-
-{{/if}} -{{if data.security}} -
-
Criminal Status
-
{{:data.security.criminal}}
-
-
-
Minor Crimes
-
{{:data.security.mi_crim}}
-
{{:data.security.mi_crim_d}}
-
-
-
Major Crimes
-
{{:data.security.ma_crim}}
-
{{:data.security.ma_crim_d}}
-
-
-
Important Notes
-
{{:data.security.notes}}
-
-{{/if}} - -{{if data.could_not_find}} -
- Failed to find some records; the information above may be incomplete or missing. -
-{{/if}} \ No newline at end of file diff --git a/nano/templates/pai_signaller.tmpl b/nano/templates/pai_signaller.tmpl deleted file mode 100644 index 20c2781bc9b..00000000000 --- a/nano/templates/pai_signaller.tmpl +++ /dev/null @@ -1,33 +0,0 @@ - - -
-
- Frequency: -
-
- {{:helper.link("--", '', {"stopic":"signaller", "freq":-10})}} - {{:helper.link("-", '', {"stopic":"signaller", "freq": -2})}} -
{{:data.frequency}}
- {{:helper.link("+", '', {"stopic":"signaller", "freq": 2})}} - {{:helper.link("++", '', {"stopic":"signaller", "freq": 10})}} -
-
- -
-
- Code: -
-
- {{:helper.link("--", '', {"stopic":"signaller", "code":-10})}} - {{:helper.link("-", '', {"stopic":"signaller", "code": -1})}} -
{{:data.code}}
- {{:helper.link("+", '', {"stopic":"signaller", "code": 1})}} - {{:helper.link("++", '', {"stopic":"signaller", "code": 10})}} -
-
- -
- {{:helper.link("Send", '', {"stopic":"signaller", "send":1})}} -
\ No newline at end of file diff --git a/nano/templates/r_n_d.tmpl b/nano/templates/r_n_d.tmpl deleted file mode 100644 index 973ce934873..00000000000 --- a/nano/templates/r_n_d.tmpl +++ /dev/null @@ -1,269 +0,0 @@ -{{if data.menu > 0}} -
- {{:helper.link('Main Menu', 'reply', {'menu': 0, 'submenu': 0})}} - {{if data.submenu > 0}} - {{if data.menu == 2}} - {{:helper.link('Disk Operations Menu', 'reply', {'submenu': 0})}} - {{else data.menu == 4}} - {{:helper.link('Protolathe Menu', 'reply', {'submenu': 0})}} - {{else data.menu == 5}} - {{:helper.link('Circuit Imprinter Menu', 'reply', {'submenu': 0})}} - {{else data.menu == 6}} - {{:helper.link('Settings Menu', 'reply', {'submenu': 0})}} - {{/if}} - {{else data.menu == 4 || data.menu == 5}} - {{:helper.link('Material Storage', 'arrow-up', {'submenu': 2})}} - {{:helper.link('Chemical Storage', 'arrow-up', {'submenu': 3})}} - {{/if}} -
-{{/if}} -
- {{if data.menu == 0}} -

Main Menu:

-
{{:helper.link('Disk Operations', 'save', {'menu': 2, 'submenu': 0}, data.disk_type ? null : 'disabled')}}
-
{{:helper.link('Destructive Analyzer Menu', 'chain-broken', {'menu': 3, 'submenu': 0}, data.linked_destroy ? null : 'disabled')}}
-
{{:helper.link('Protolathe Menu', 'print', {'menu': 4, 'submenu': 0}, data.linked_lathe ? null : 'disabled')}}
-
{{:helper.link('Circuit Imprinter Menu', 'print', {'menu': 5, 'submenu': 0}, data.linked_imprinter ? null : 'disabled')}}
-
{{:helper.link('Settings', 'gear', {'menu': 6, 'submenu': 0})}}
-
-
- Current Research Levels: - {{for data.tech_levels}} -
{{:value.name}}:
{{:value.level}}
- {{/for}} - {{else data.menu == 1}} -

Current Research Levels:

- {{for data.tech_levels}} - {{if index > 0}} -
- {{/if}} -
{{:value.name}}
-
* Level: {{:value.level}}
-
* Summary: {{:value.desc}}
- {{/for}} - {{else data.menu == 2 && data.disk_type}} - {{if data.submenu == 0}} -

Data Disk Contents:

- {{if data.disk_data}} - {{if data.disk_type == 1}} -
Name: {{:data.disk_data.name}}
-
Level: {{:data.disk_data.level}}
-
Description: {{:data.disk_data.desc}}
- {{:helper.link('Upload to Database', 'arrow-up', {'updt_tech': 1})}} - {{:helper.link('Clear Disk', 'trash', {'clear_tech': 1})}} - {{else}} -
Name: {{:data.disk_data.name}}
-
- {{for data.disk_data.lathe_types}} - {{if index == 0}} - Lathe Types: - {{else}} - , - {{/if}} - {{:value}} - {{/for}} -
-
Required Materials:
- {{for data.disk_data.materials}} -
{{:value.name}} x {{:value.amount}}
- {{/for}} - {{:helper.link('Upload to Database', 'arrow-up', {'updt_design': 1})}} - {{:helper.link('Clear Disk', 'trash', {'clear_design': 1})}} - {{/if}} - {{else}} -
This disk is empty.
- {{:helper.link(data.disk_type == 1 ? 'Load Tech to Disk' : 'Load Design to Disk', 'arrow-down', {'submenu': 1})}} - {{/if}} - {{:helper.link('Eject Disk', 'eject', data.disk_type == 1 ? {'eject_tech': 1} : {'eject_design': 1})}} - {{else data.submenu == 1}} - {{for data.to_copy}} -
-
{{:value.name}}
- {{:helper.link('Copy to Disk', 'arrow-down', data.disk_type == 1 ? {'copy_tech': 1, 'copy_tech_ID': value.id} : {'copy_design': 1, 'copy_design_ID': value.id})}} -
- {{/for}} - {{/if}} - {{else data.menu == 3 && !data.linked_destroy}} - NO DESTRUCTIVE ANALYZER LINKED TO CONSOLE - {{else data.menu == 4 && !data.linked_lathe}} - NO PROTOLATHE LINKED TO CONSOLE - {{else data.menu == 5 && !data.linked_imprinter}} - NO CIRCUIT IMPRITER LINKED TO CONSOLE - {{else data.menu == 3}} - {{if !data.loaded_item}} - No item loaded. Standing by... - {{else}} -

Deconstruction Menu:

-
Name: {{:data.loaded_item.name}}
-

Origin Tech:

- {{for data.loaded_item.origin_tech}} -
-
* {{:value.name}}:
-
- {{:value.object_level}} - {{if value.current_level}} - (Current: {{:value.current_level}}) - {{/if}} -
-
- {{/for}} -

Options:

- {{:helper.link('Deconstruct Item', 'chain-broken', {'deconstruct': 1})}} - {{:helper.link('Eject Item', 'eject', {'eject_item': 1})}} - {{/if}} - {{else data.menu == 4 || data.menu == 5}} - {{if data.submenu == 0}} -

{{:(data.menu == 4 ? 'Protolathe' : 'Circuit Imprinter')}} Menu:

- {{else data.submenu == 1}} -

{{:data.category}}:

- {{else data.submenu == 2}} -

Material Storage:

- {{else data.submenu == 3}} -

Chemical Storage:

- {{/if}} - - {{if data.submenu < 2}} -
- - - {{if data.max_materials}} - - {{/if}} - - - - {{if data.max_chemicals}} - - {{/if}} - -
Material Amount:{{:data.total_materials}} / {{:data.max_materials}}
Chemical Amount:{{:data.total_chemicals}} / {{:data.max_chemicals}}
- {{/if}} - - {{if data.submenu == 0}} -
- - - - -
- -
- - {{for data.categories}} - {{if (index & 1) == 0 && index != 0}} - - {{/if}} - - {{/for}} -
{{:helper.link(value, 'arrow-right', {'category': value})}}
- {{else data.submenu == 1}} - - {{for data.matching_designs}} - - - - - - - {{/for}} -
{{:helper.link(value.name, 'print', data.menu == 4 ? {'build': value.id, 'amount': 1} : {'imprint': value.id}, value.can_build ? null : 'disabled')}}{{if value.can_build >= 5}} - {{:helper.link('x5', null, data.menu == 4 ? {'build': value.id, 'amount': 5} : {'imprint': value.id})}} - {{/if}}{{if value.can_build >= 10}} - {{:helper.link('x10', null, data.menu == 4 ? {'build': value.id, 'amount': 10} : {'imprint': value.id})}} - {{/if}} - {{for value.materials : material : i}} - | - {{if material.is_red}} - - {{/if}} - {{:material.amount}} {{:material.name}} - {{if material.is_red}} - - {{/if}} - {{/for}} -
- {{else data.submenu == 2}} - {{for data.loaded_materials}} -
-
* {{:value.amount}} of {{:value.name}}
({{:Math.round((value.amount / 2000) * 10) / 10}} sheets)
- {{if value.amount >= 2000}} - {{if data.menu == 4}} - {{:helper.link('1x', 'eject', {'lathe_ejectsheet': value.id, 'lathe_ejectsheet_amt': 1})}} - {{:helper.link('C', 'eject', {'lathe_ejectsheet': value.id, 'lathe_ejectsheet_amt': 'custom'})}} - {{if value.amount >= 2000*5}} - {{:helper.link('5x', 'eject', {'lathe_ejectsheet': value.id, 'lathe_ejectsheet_amt': 5})}} - {{/if}} - {{:helper.link('All', 'eject', {'lathe_ejectsheet': value.id, 'lathe_ejectsheet_amt': 50})}} - {{else}} - {{:helper.link('1x', 'eject', {'imprinter_ejectsheet': value.id, 'imprinter_ejectsheet_amt': 1})}} - {{:helper.link('C', 'eject', {'imprinter_ejectsheet': value.id, 'imprinter_ejectsheet_amt': 'custom'})}} - {{if value.amount >= 2000*5}} - {{:helper.link('5x', 'eject', {'imprinter_ejectsheet': value.id, 'imprinter_ejectsheet_amt': 5})}} - {{/if}} - {{:helper.link('All', 'eject', {'imprinter_ejectsheet': value.id, 'imprinter_ejectsheet_amt': 50})}} - {{/if}} - {{/if}} -
- {{/for}} - {{else data.submenu == 3}} -
- - {{:helper.link('Purge All', 'trash', data.menu == 4 ? {'disposeallP': 1} : {'disposeallI' : 1})}} -
- {{for data.loaded_chemicals}} -
-
* {{:value.volume}} of {{:value.name}}
- {{:helper.link('Purge', 'trash', data.menu == 4 ? {'disposeP': value.id} : {'disposeI': value.id})}} -
- {{/for}} - {{/if}} - {{else data.menu == 6}} - {{if data.submenu == 0}} -

Settings:

-
{{:helper.link('Sync Database with Network', 'refresh', {'sync': 1}, data.sync ? null : 'disabled')}}
-
{{:helper.link('Connect to Research Network', 'plug', {'togglesync': 1}, data.sync ? 'selected' : null)}}
-
{{:helper.link('Disconnect from Research Network', 'chain-broken', {'togglesync': 1}, data.sync ? null : 'selected')}}
-
{{:helper.link('Device Linkage Menu', 'chain', {'menu': 6, 'submenu': 1})}}
- {{if data.admin}} -
{{:helper.link('[ADMIN] Maximize Research Levels', 'exclamation', {'maxresearch': 1})}}
- {{/if}} -
{{:helper.link('Reset Database', 'trash-o', {'reset': 1})}}
- {{else data.submenu == 1}} -

Device Linkage Menu:

-
{{:helper.link('Re-sync with Nearby Devices', 'chain', {'find_device': 1})}}
-

Linked Devices:

-
- {{if data.linked_destroy}} -
* Destructive Analyzer
- {{:helper.link('Unlink', 'chain-broken', {'disconnect': 'destroy'})}} - {{else}} -
* No Destructive Analyzer Linked
- {{/if}} -
-
- {{if data.linked_lathe}} -
* Protolathe
- {{:helper.link('Unlink', 'chain-broken', {'disconnect': 'lathe'})}} - {{else}} -
* No Protolathe Linked
- {{/if}} -
-
- {{if data.linked_imprinter}} -
* Circuit Imprinter
- {{:helper.link('Unlink', 'chain-broken', {'disconnect': 'imprinter'})}} - {{else}} -
* No Circuit Imprinter Linked
- {{/if}} -
- {{/if}} - {{/if}} -
- -{{if data.wait_message}} -
-
-

{{:data.wait_message}}

-
-
-{{/if}} diff --git a/nano/templates/rcd.tmpl b/nano/templates/rcd.tmpl deleted file mode 100644 index d054156665d..00000000000 --- a/nano/templates/rcd.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -{{if data.menu == 1}} -

RCD Modes:

-
{{:helper.link('Floor and Walls', 'arrow-right', {'mode': "Turf"}, data.mode == "Turf" ? 'linkOn' : null)}}
-
- {{:helper.link('Airlock', 'arrow-right', {'mode': "Airlock"}, data.mode == "Airlock" ? 'linkOn' : null)}} - {{:helper.link('', 'gear', {'menu': 2})}} -
-
{{:helper.link('Deconstruct', 'arrow-right', {'mode': "Deconstruct"}, data.mode == "Deconstruct" ? 'linkOn' : null)}}
-
{{:helper.link('Windows', 'arrow-right', {'mode': "Windows"}, data.mode == "Windows" ? 'linkOn' : null)}}
-
-
RCD ammo: {{:data.matter}} / {{:data.max_matter}}
-
-{{else data.menu == 2}} -
{{:helper.link('Back', 'reply', {'menu': 1})}}
-
-
-
-
- {{if !data.locked}}{{:helper.link("Rename", '', {'choice' : 'airlock_name'})}}{{else}}LOCKED{{/if}} -
-
- Airlock Name: -
-
- {{:data.door_name}} -
-
-
-
-
-

Type

- {{for data.allowed_door_types}} -
{{:helper.link(value.name, 'arrow-right', {'door_type': value.type}, data.door_type == value.type ? 'linkOn' : null)}}
- {{/for}} -
-
-

Accesses

- {{if data.locked}} - {{:helper.link('Swipe ID', 'unlock-alt', {'login': 1})}} - {{else}} - {{:helper.link('Lock', 'lock', {'logout': 1})}} -
{{:helper.link(data.one_access ? 'ONE' : 'ALL', 'arrow-right', {'toggle_one_access': 1})}}

- {{for data.door_accesses}} -
{{:helper.link(value.name, 'arrow-right', {'toggle_access': value.id}, null, value.enabled ? 'selected' : null)}}
- {{/for}} - {{/if}} -
-{{/if}} \ No newline at end of file diff --git a/nano/templates/simple_airlock_console.tmpl b/nano/templates/simple_airlock_console.tmpl deleted file mode 100644 index 0e084437bdb..00000000000 --- a/nano/templates/simple_airlock_console.tmpl +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
- Chamber Pressure: -
-
- {{:helper.displayBar(data.chamber_pressure, 0, 200, (data.chamber_pressure < 80) || (data.chamber_pressure > 120) ? 'bad' : (data.chamber_pressure < 95) || (data.chamber_pressure > 110) ? 'average' : 'good')}} -
- {{:helper.smoothRound(data.chamber_pressure)}} kPa -
-
-
-
-
-
-
- {{:helper.link('Cycle to Exterior', 'arrow-circle-o-left', {'command' : 'cycle_ext'}, data.processing ? 'disabled' : null)}} - {{:helper.link('Cycle to Interior', 'arrow-circle-right', {'command' : 'cycle_int'}, data.processing ? 'disabled' : null)}} -
-
- {{if data.interior_status.state == "open"}} - {{:helper.link('Force exterior door', 'exclamation-triangle', {'command' : 'force_ext'}, null, 'redButton')}} - {{else}} - {{:helper.link('Force exterior door', 'exclamation-triangle', {'command' : 'force_ext'}, null, data.processing ? 'yellowButton' : null)}} - {{/if}} - {{if data.exterior_status.state == "open"}} - {{:helper.link('Force interior door', 'exclamation-triangle', {'command' : 'force_int'}, null, 'redButton')}} - {{else}} - {{:helper.link('Force interior door', 'exclamation-triangle', {'command' : 'force_int'}, null, data.processing ? 'yellowButton' : null)}} - {{/if}} -
-
-
- {{:helper.link('Abort', 'ban', {'command' : 'abort'}, data.processing ? null : 'disabled', data.processing ? 'redButton' : null)}} -
-
\ No newline at end of file diff --git a/paradise.dme b/paradise.dme index 876fbeb711d..3d014cc9f6a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -469,8 +469,8 @@ #include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" -#include "code\game\area\Dynamic areas.dm" -#include "code\game\area\Space Station 13 areas.dm" +#include "code\game\area\dynamic_areas.dm" +#include "code\game\area\ss13_areas.dm" #include "code\game\area\areas\depot-areas.dm" #include "code\game\area\areas\mining.dm" #include "code\game\area\areas\ruins\lavaland.dm" @@ -548,7 +548,7 @@ #include "code\game\gamemodes\devil\game_mode.dm" #include "code\game\gamemodes\devil\objectives.dm" #include "code\game\gamemodes\devil\contracts\friend.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" +#include "code\game\gamemodes\devil\devil_agent\devil_agent.dm" #include "code\game\gamemodes\devil\imp\imp.dm" #include "code\game\gamemodes\devil\true_devil\_true_devil.dm" #include "code\game\gamemodes\devil\true_devil\inventory.dm" @@ -963,7 +963,6 @@ #include "code\game\objects\items\weapons\dnascrambler.dm" #include "code\game\objects\items\weapons\explosives.dm" #include "code\game\objects\items\weapons\extinguisher.dm" -#include "code\game\objects\items\weapons\fireworks.dm" #include "code\game\objects\items\weapons\flamethrower.dm" #include "code\game\objects\items\weapons\garrote.dm" #include "code\game\objects\items\weapons\gift_wrappaper.dm" @@ -1202,7 +1201,7 @@ #include "code\modules\admin\stickyban.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\watchlist.dm" -#include "code\modules\admin\DB ban\functions.dm" +#include "code\modules\admin\db_ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" #include "code\modules\admin\tickets\adminticketsverbs.dm" #include "code\modules\admin\tickets\mentorticketsverbs.dm" @@ -1324,8 +1323,8 @@ #include "code\modules\buildmode\submodes\throwing.dm" #include "code\modules\buildmode\submodes\variable_edit.dm" #include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client defines.dm" -#include "code\modules\client\client procs.dm" +#include "code\modules\client\client_defines.dm" +#include "code\modules\client\client_procs.dm" #include "code\modules\client\message.dm" #include "code\modules\client\view.dm" #include "code\modules\client\preference\preferences.dm" @@ -1430,7 +1429,6 @@ #include "code\modules\economy\Economy_TradeDestinations.dm" #include "code\modules\economy\EFTPOS.dm" #include "code\modules\economy\Job_Departments.dm" -#include "code\modules\economy\POS.dm" #include "code\modules\economy\utils.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" @@ -1445,7 +1443,6 @@ #include "code\modules\events\anomaly_vortex.dm" #include "code\modules\events\apc_overload.dm" #include "code\modules\events\apc_short.dm" -#include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\carp_migration.dm" @@ -1894,8 +1891,10 @@ #include "code\modules\mob\living\silicon\pai\recruit.dm" #include "code\modules\mob\living\silicon\pai\say.dm" #include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\pai\software_modules.dm" #include "code\modules\mob\living\silicon\pai\update_status.dm" +#include "code\modules\mob\living\silicon\pai\software\_base.dm" +#include "code\modules\mob\living\silicon\pai\software\pai_apps.dm" +#include "code\modules\mob\living\silicon\pai\software\pai_toggles.dm" #include "code\modules\mob\living\silicon\robot\component.dm" #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" @@ -2099,7 +2098,6 @@ #include "code\modules\nano\interaction\physical.dm" #include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\zlevel.dm" -#include "code\modules\nano\modules\atmos_control.dm" #include "code\modules\nano\modules\human_appearance.dm" #include "code\modules\nano\modules\law_manager.dm" #include "code\modules\nano\modules\nano_module.dm" @@ -2340,8 +2338,8 @@ #include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" #include "code\modules\ruins\objects_and_mobs\gym.dm" #include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" -#include "code\modules\security_levels\keycard authentication.dm" -#include "code\modules\security_levels\security levels.dm" +#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ert.dm" @@ -2366,6 +2364,7 @@ #include "code\modules\spacepods\lock_buster.dm" #include "code\modules\spacepods\parts.dm" #include "code\modules\spacepods\spacepod.dm" +#include "code\modules\station_goals\bluespace_tap.dm" #include "code\modules\station_goals\bsa.dm" #include "code\modules\station_goals\dna_vault.dm" #include "code\modules\station_goals\shield.dm" @@ -2440,6 +2439,7 @@ #include "code\modules\tgui\states.dm" #include "code\modules\tgui\tgui.dm" #include "code\modules\tgui\modules\_base.dm" +#include "code\modules\tgui\modules\atmos_control.dm" #include "code\modules\tgui\modules\crew_monitor.dm" #include "code\modules\tgui\modules\ert_manager.dm" #include "code\modules\tgui\modules\power_monitor.dm" diff --git a/sound/Attributions.txt b/sound/Attributions.txt index 729562855ba..df74fd7ef55 100644 --- a/sound/Attributions.txt +++ b/sound/Attributions.txt @@ -1,5 +1,3 @@ items/thermal_drill.ogg was sampled from Builders Drilling.wav under a Sampling Plus 1.0 license. It was uploaded by Koops on 2010-05-10. Source (http://soundbible.com/1420-Builders-Drilling.html) -ambience/aurora_caelus.ogg is Music for Manatees by Kevin Macleod. It is under a CC-BY 3.0 license. It has been cropped and fades out. - -creatures/dog_yelp.ogg is DogYelp.wav. It is under a CC-BY 3.0 license. It has been cropped, EQ'd, and compressed to .ogg. Source (https://freesound.org/people/TobiasKosmos/sounds/163280/) \ No newline at end of file +creatures/dog_yelp.ogg is DogYelp.wav. It is under a CC-BY 3.0 license. It has been cropped, EQ'd, and compressed to .ogg. Source (https://freesound.org/people/TobiasKosmos/sounds/163280/) diff --git a/sound/ambience/aurora_caelus.ogg b/sound/ambience/aurora_caelus.ogg deleted file mode 100644 index 0c741678d50..00000000000 Binary files a/sound/ambience/aurora_caelus.ogg and /dev/null differ diff --git a/sound/ambience/aurora_caelus_short.ogg b/sound/ambience/aurora_caelus_short.ogg deleted file mode 100644 index f6d1acaa2fe..00000000000 Binary files a/sound/ambience/aurora_caelus_short.ogg and /dev/null differ diff --git a/tgui/packages/tgui/components/LabeledList.js b/tgui/packages/tgui/components/LabeledList.js index 43dbd0d5a32..28ef06f09c8 100644 --- a/tgui/packages/tgui/components/LabeledList.js +++ b/tgui/packages/tgui/components/LabeledList.js @@ -24,7 +24,9 @@ export const LabeledListItem = props => { buttons, content, children, + noColon = false, } = props; + const colon = noColon ? '' : ':'; return ( { 'LabeledList__cell', 'LabeledList__label', ])}> - {label ? label + ':' : null} + {label ? label + colon : null} { + const { act, data } = useBackend(context); + const { + locked, + } = data; + // Bail straight away if there is no air + return ( + + + + + {!locked && ( + + + + + )} + + + ); +}; + +const Danger2Colour = danger => { + if (danger === 0) { + return "green"; + } + if (danger === 1) { + return "orange"; + } + return "red"; +}; + +const AirStatus = (props, context) => { + const { act, data } = useBackend(context); + const { + air, + mode, + atmos_alarm, + locked, + alarmActivated, + rcon, + } = data; + + let areaStatus; + if (air.danger.overall === 0) { + if (atmos_alarm === 0) { + areaStatus = "Optimal"; + } else { + areaStatus = "Caution: Atmos alert in area"; + } + } else if (air.danger.overall === 1) { + areaStatus = "Caution"; + } else { + areaStatus = "DANGER: Internals Required"; + } + + return ( +
+ {air ? ( + + + + kPa + {!locked && ( + +   +
+ ); +}; + +const AirAlarmTabs = (props, context) => { + const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0); + return ( + + setTabIndex(0)}> + Vent Control + + setTabIndex(1)}> + Scrubber Control + + setTabIndex(2)}> + Mode + + setTabIndex(3)}> + Thresholds + + + ); +}; + +const AirAlarmUnlockedContent = (props, context) => { + const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0); + switch (tabIndex) { + case 0: + return ; + case 1: + return ; + case 2: + return ; + case 3: + return ; + default: + return "WE SHOULDN'T BE HERE!"; + } +}; + +const AirAlarmVentsView = (props, context) => { + const { act, data } = useBackend(context); + const { vents } = data; + return ( + vents.map(v => ( +
+ + +
+ )) + ); +}; + +const AirAlarmScrubbersView = (props, context) => { + const { act, data } = useBackend(context); + const { scrubbers } = data; + return ( + scrubbers.map(s => ( +
+ + +
+ )) + ); +}; + +const AirAlarmModesView = (props, context) => { + const { act, data } = useBackend(context); + const { + modes, + presets, + emagged, + mode, + preset, + } = data; + return ( + +
+ + {modes.map(m => ( + (!m.emagonly || m.emagonly && !!emagged) && ( + + +
+
+
+ + After making a selection, the system will automatically cycle in order to remove contaminants. + + + {presets.map(p => ( + + +
+
+
+ ); +}; + + +const AirAlarmThresholdsView = (props, context) => { + const { act, data } = useBackend(context); + const { + thresholds, + } = data; + return ( +
+ + + + Value + + + Danger Min + + + Warning Min + + + Warning Max + + + Danger Max + + + {thresholds.map(t => ( + + + {t.name} + + {t.settings.map(s => ( + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/AirlockAccessController.js b/tgui/packages/tgui/interfaces/AirlockAccessController.js new file mode 100644 index 00000000000..7d4edb9ee97 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AirlockAccessController.js @@ -0,0 +1,75 @@ +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, Section } from '../components'; +import { Window } from '../layouts'; + +export const AirlockAccessController = (props, context) => { + const { act, data } = useBackend(context); + const { + exterior_status, + interior_status, + processing, + } = data; + let exteriorbutton; + let interiorbutton; + // If exterior is open, then it can be locked, if closed, it can be cycled to. Vice versa for interior + + if (data.exterior_status.state === "open") { + exteriorbutton = ( + + ); +}; diff --git a/tgui/packages/tgui/interfaces/RndConsoleComponents/RndNavbar.js b/tgui/packages/tgui/interfaces/RndConsoleComponents/RndNavbar.js new file mode 100644 index 00000000000..86e68c61915 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RndConsoleComponents/RndNavbar.js @@ -0,0 +1,40 @@ +import { RndRoute, RndNavButton } from "./index"; +import { Box } from "../../components"; +import { MENU, SUBMENU } from "../RndConsole"; + +export const RndNavbar = () => ( + + n !== MENU.MAIN} render={() => ( + + )} /> + + {/* Links to return to submenu 0 for each menu other than main menu */} + n !== SUBMENU.MAIN} render={() => ( + + ( + + )} /> + + ( + + )} /> + + ( + + )} /> + + ( + + )} /> + + )} /> + + n === MENU.LATHE || n === MENU.IMPRINTER} submenu={SUBMENU.MAIN} render={() => ( + + + + + )} /> + + +); diff --git a/tgui/packages/tgui/interfaces/RndConsoleComponents/RndRoute.js b/tgui/packages/tgui/interfaces/RndConsoleComponents/RndRoute.js new file mode 100644 index 00000000000..5614a212065 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RndConsoleComponents/RndRoute.js @@ -0,0 +1,25 @@ +import { useBackend } from "../../backend"; + +export const RndRoute = (properties, context) => { + const { render } = properties; + const { data } = useBackend(context); + const { menu, submenu } = data; + + const compare = (comparator, item) => { + if (comparator === null || comparator === undefined) { + return true; + } // unspecified, match all + if (typeof comparator === 'function') { + return comparator(item); + } + return comparator === item; // strings or ints? + }; + + let match = compare(properties.menu, menu) && compare(properties.submenu, submenu); + + if (!match) { + return null; + } + + return render(); +}; diff --git a/tgui/packages/tgui/interfaces/RndConsoleComponents/SettingsMenu.js b/tgui/packages/tgui/interfaces/RndConsoleComponents/SettingsMenu.js new file mode 100644 index 00000000000..ea22cb6f9bd --- /dev/null +++ b/tgui/packages/tgui/interfaces/RndConsoleComponents/SettingsMenu.js @@ -0,0 +1,115 @@ +import { useBackend } from "../../backend"; +import { Box, Button, Flex, LabeledList, Section } from "../../components"; +import { RndRoute, RndNavButton } from "./index"; +import { MENU, SUBMENU } from "../RndConsole"; + +export const SettingsMenu = (properties, context) => { + const { data, act } = useBackend(context); + + const { + sync, + admin, + linked_destroy, + linked_lathe, + linked_imprinter, + } = data; + + return ( + + ( +
+ +
+ )} /> + + ( +
+
+ )} /> +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/RndConsoleComponents/index.js b/tgui/packages/tgui/interfaces/RndConsoleComponents/index.js new file mode 100644 index 00000000000..5bd4861c8e9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/RndConsoleComponents/index.js @@ -0,0 +1,15 @@ +export { CurrentLevels } from './CurrentLevels'; +export { DataDiskMenu } from './DataDiskMenu'; +export { DeconstructionMenu } from './DeconstructionMenu'; +export { LatheCategory } from './LatheCategory'; +export { LatheChemicalStorage } from './LatheChemicalStorage'; +export { LatheMainMenu } from './LatheMainMenu'; +export { LatheMaterials } from './LatheMaterials'; +export { LatheMaterialStorage } from './LatheMaterialStorage'; +export { LatheMenu } from './LatheMenu'; +export { LatheSearch } from './LatheSearch'; +export { MainMenu } from './MainMenu'; +export { RndNavbar } from './RndNavbar'; +export { RndNavButton } from './RndNavButton'; +export { RndRoute } from './RndRoute'; +export { SettingsMenu } from './SettingsMenu'; diff --git a/tgui/packages/tgui/interfaces/common/AccessList.js b/tgui/packages/tgui/interfaces/common/AccessList.js index 1a077027dc3..80b4346fbc5 100644 --- a/tgui/packages/tgui/interfaces/common/AccessList.js +++ b/tgui/packages/tgui/interfaces/common/AccessList.js @@ -1,7 +1,7 @@ import { sortBy } from 'common/collections'; import { Fragment } from 'inferno'; import { useLocalState } from '../../backend'; -import { Button, Flex, Grid, Section, Tabs } from '../../components'; +import { Box, Button, Flex, LabeledList, Section, Tabs } from '../../components'; const diffMap = { 0: { @@ -20,6 +20,10 @@ const diffMap = { export const AccessList = (props, context) => { const { + sectionButtons = null, + sectionFlexGrow = null, + usedByRcd, + rcdButtons, accesses = [], selectedList = [], accessMod, @@ -63,6 +67,7 @@ export const AccessList = (props, context) => { return (
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/common/SimpleRecords.js b/tgui/packages/tgui/interfaces/common/SimpleRecords.js new file mode 100644 index 00000000000..6d40197965b --- /dev/null +++ b/tgui/packages/tgui/interfaces/common/SimpleRecords.js @@ -0,0 +1,205 @@ +import { useBackend, useLocalState } from "../../backend"; +import { createSearch } from 'common/string'; +import { flow } from 'common/fp'; +import { filter, sortBy } from 'common/collections'; +import { Box, Input, Button, Section, LabeledList } from "../../components"; + +export const SimpleRecords = (props, context) => { + const { + records, + } = props.data; + + return ( + + {!records ? ( + + ) : ( + + )} + + ); +}; + +const SelectionView = (props, context) => { + const { act } = useBackend(context); + const { + recordsList, + } = props.data; + + const [ + searchText, + setSearchText, + ] = useLocalState(context, 'searchText', ''); + + // Search for peeps + const SelectMembers = (people, searchText = '') => { + const MemberSearch = createSearch(searchText, member => member.Name); + return flow([ + // Null member filter + filter(member => member?.Name), + // Optional search term + searchText && filter(MemberSearch), + // Slightly expensive, but way better than sorting in BYOND + sortBy(member => member.Name), + ])(recordsList); + }; + + const formattedRecords = SelectMembers(recordsList, searchText); + + return ( + + setSearchText(value)} /> + {formattedRecords.map(r => ( + +