diff --git a/README.md b/README.md
index 5437433fc0c..8f2d270db37 100644
--- a/README.md
+++ b/README.md
@@ -5,8 +5,9 @@
**Website:** http://www.tgstation13.org
**Code:** https://github.com/tgstation/-tg-station
-**Wiki** http://tgstation13.org/wiki/Main_Page
-**IRC:** irc://irc.rizon.net/coderbus
+**Wiki** http://tgstation13.org/wiki/Main_Page
+**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
+
##DOWNLOADING
diff --git a/_maps/map_files/MetaStation/MetaStation.v41F.dmm b/_maps/map_files/MetaStation/MetaStation.v41F.dmm
index afcc5f7f1f7..b3a99819ace 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41F.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41F.dmm
@@ -1719,7 +1719,7 @@
"aHc" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aHd" = (/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 0; supply_display = 1},/turf/simulated/wall,/area/quartermaster/storage)
"aHe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/storage)
-"aHf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Vault Storage"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"})
+"aHf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Vault Storage"},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/construction/Storage{name = "Storage Wing"})
"aHg" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"aHh" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/primary)
"aHi" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/chiefs_office)
@@ -1800,10 +1800,10 @@
"aIF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/storage)
"aIG" = (/obj/machinery/firealarm{pixel_y = 27},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/storage)
"aIH" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/quartermaster/storage)
-"aII" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
+"aII" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
"aIJ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/construction/Storage{name = "Storage Wing"})
"aIK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/construction/Storage{name = "Storage Wing"})
-"aIL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
+"aIL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
"aIM" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -28; pixel_y = 23},/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32; supply_display = 1},/obj/machinery/conveyor{dir = 1; id = "QMLoad2"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aIN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"})
"aIO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"})
@@ -1859,7 +1859,7 @@
"aJM" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warningcorner"; tag = "icon-warningcorner (EAST)"},/area/quartermaster/storage)
"aJN" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage)
"aJO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage)
-"aJP" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
+"aJP" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_mining{glass = 0; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/construction/Storage{name = "Storage Wing"})
"aJQ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/construction/Storage{name = "Storage Wing"})
"aJR" = (/obj/machinery/camera{c_tag = "Cargo Bay - Storage Wing Entrance"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/construction/Storage{name = "Storage Wing"})
"aJS" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/apc{dir = 2; name = "Storage Wing APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "browncorner"},/area/construction/Storage{name = "Storage Wing"})
@@ -1937,8 +1937,8 @@
"aLm" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;63;48;50"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aLn" = (/turf/simulated/wall,/area/storage/primary)
"aLo" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/quartermaster/office{name = "\improper Cargo Office"})
-"aLp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
-"aLq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
+"aLp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Primary Tool Storage"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
+"aLq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/storage/primary)
"aLr" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aLs" = (/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"aLt" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
@@ -2575,8 +2575,8 @@
"aXA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/break_room)
"aXB" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/wall/shuttle{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/pod_1)
"aXC" = (/turf/simulated/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/arrival)
-"aXD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
-"aXE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorminingglass.dmi'; name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
+"aXD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
+"aXE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/storage/primary)
"aXF" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"aXG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"aXH" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
@@ -2821,8 +2821,8 @@
"bcm" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"bcn" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tools)
"bco" = (/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"})
-"bcp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"})
-"bcq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"})
+"bcp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"})
+"bcq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bcr" = (/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/weapon/stamp/denied{pixel_x = 4; pixel_y = -2},/obj/structure/table/reinforced,/obj/structure/noticeboard{desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; name = "requests board"; pixel_x = 32; pixel_y = 32},/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bcs" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/red,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 5; icon_state = "brown"},/area/quartermaster/office{name = "\improper Cargo Office"})
"bct" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/hallway/primary/port)
@@ -3126,14 +3126,14 @@
"bif" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"big" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/central)
"bih" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/bridge)
-"bii" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
+"bii" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Auxiliary Tool Storage"; req_access_txt = "12"},/turf/simulated/floor/plasteel,/area/storage/tools)
"bij" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/storage/art)
"bik" = (/obj/structure/closet/emcloset,/obj/structure/sign/map/left{icon_state = "map-left-MS"; pixel_y = 32},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
"bil" = (/obj/structure/sign/map/right{desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; icon_state = "map-right-MS"; pixel_y = 32},/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/starboard)
"bim" = (/turf/simulated/wall,/area/hallway/primary/starboard)
"bin" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bio" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/storage/tech)
-"bip" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{icon = 'icons/obj/doors/Dooreng.dmi'; name = "Tech Storage"; req_access_txt = "0"; req_one_access_txt = "23;30"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
+"bip" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{ name = "Tech Storage"; req_access_txt = "0"; req_one_access_txt = "23;30"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
"biq" = (/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
"bir" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/break_room)
"bis" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{dir = 5; icon_state = "darkred"; tag = "icon-darkblue"},/area/bridge)
@@ -3224,7 +3224,7 @@
"bjZ" = (/obj/structure/table/wood,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bka" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=14.2-Central-CrewQuarters"; location = "14-Starboard-Central"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bkb" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/central)
-"bkc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorglass.dmi'; name = "Starboard Primary Hallway"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard)
+"bkc" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Starboard Primary Hallway"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard)
"bkd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard)
"bke" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard)
"bkf" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/starboard)
@@ -3315,7 +3315,7 @@
"blM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"blN" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"blO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"blP" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorglass.dmi'; name = "Starboard Primary Hallway"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
+"blP" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Starboard Primary Hallway"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
"blQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
"blR" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
"blS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard)
@@ -3401,7 +3401,7 @@
"bnu" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bnv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=13.1-Engineering-Enter"; location = "12-Central-Starboard"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bnw" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/central)
-"bnx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorglass.dmi'; name = "Starboard Primary Hallway"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
+"bnx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Starboard Primary Hallway"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
"bny" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
"bnz" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
"bnA" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/starboard)
@@ -3498,7 +3498,7 @@
"bpn" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/central)
"bpo" = (/turf/simulated/wall,/area/storage/art)
"bpp" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/maintcentral{name = "Central Maintenance"})
-"bpq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorengglass.dmi'; name = "Art Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/art)
+"bpq" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Art Storage"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/art)
"bpr" = (/obj/structure/sign/directions/security{desc = "A direction sign, pointing out which way the security department is."; dir = 1; icon_state = "direction_sec"; pixel_x = 0; pixel_y = 8; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the engineering department is."; dir = 4; icon_state = "direction_eng"; pixel_y = 0; tag = "icon-direction_eng (EAST)"},/obj/structure/sign/directions/engineering{desc = "A direction sign, pointing out which way the bridge is."; dir = 2; icon_state = "direction_bridge"; name = "bridge"; pixel_y = -8; tag = "icon-direction_bridge (EAST)"},/turf/simulated/wall/r_wall,/area/storage/tools)
"bps" = (/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkbluecorners"; tag = "icon-darkbluecorners"},/area/turret_protected/aisat_interior)
"bpt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/maintenance/starboard)
@@ -4487,7 +4487,7 @@
"bIo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bIp" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bIq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/toy/cards/deck{pixel_y = 4},/obj/structure/table/wood/poker,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bIr" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre)
+"bIr" = (/obj/machinery/door/airlock{ name = "Theatre Stage"; req_access_txt = "0"; req_one_access_txt = "12;46"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre)
"bIs" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"bIt" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"bIu" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/atmos)
@@ -4752,7 +4752,7 @@
"bNt" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine/n20,/area/atmos)
"bNu" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bNv" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
-"bNw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"bNw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{ name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"bNx" = (/turf/simulated/floor/engine/n20,/area/atmos)
"bNy" = (/obj/structure/sign/atmosplaque{desc = "A guide to the exhibit, detailing the constructive and destructive applications of modern mech appliances, as well as the development of the uncorruptable cyborg servants of tomorrow, available today."; icon_state = "kiddieplaque"; name = "\improper 'Perfect Machine' sign"; pixel_x = 0; pixel_y = 32},/obj/structure/showcase{desc = "This cyborg looks frighteningly robust, with cold unseeing eyes. Signs praise the incorruptible nature of synthetics."; dir = 2; icon = 'icons/mob/robots.dmi'; icon_state = "Security"; name = "'Perfect Machine' cyborg exhibit"; pixel_y = 3},/obj/structure/window/reinforced,/turf/simulated/floor/carpet,/area/assembly/showroom{name = "\improper Corporate Showroom"})
"bNz" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/atmos)
@@ -4816,7 +4816,7 @@
"bOF" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/teleporter{name = "\improper Teleporter Room"})
"bOG" = (/obj/structure/grille,/obj/structure/window/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery)
"bOH" = (/turf/simulated/wall/r_wall,/area/assembly/showroom{name = "\improper Corporate Showroom"})
-"bOI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
+"bOI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{ name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
"bOJ" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent/roomfiller{valve_open = 1},/turf/simulated/floor/engine/n20,/area/atmos)
"bOK" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/gateway)
"bOL" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/gateway)
@@ -4953,7 +4953,7 @@
"bRm" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bRn" = (/obj/structure/table/wood,/obj/item/weapon/paper,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bRo" = (/obj/structure/table/wood,/obj/item/weapon/folder/white,/turf/simulated/floor/wood,/area/security/vacantoffice)
-"bRp" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Theatre Backstage"; req_access_txt = "46"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre)
+"bRp" = (/obj/machinery/door/airlock{ name = "Theatre Backstage"; req_access_txt = "46"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/theatre)
"bRq" = (/obj/structure/table,/obj/item/clothing/mask/cigarette/pipe,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bRr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"bRs" = (/obj/machinery/atmospherics/components/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/atmos)
@@ -5074,7 +5074,7 @@
"bTD" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/gateway)
"bTE" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/gateway)
"bTF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/gateway)
-"bTG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{icon = 'icons/obj/doors/Doorcomglass.dmi'; name = "Gateway Chamber"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/gateway)
+"bTG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{ name = "Gateway Chamber"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/gateway)
"bTH" = (/obj/machinery/atmospherics/components/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
"bTI" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/gateway)
"bTJ" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/gateway)
@@ -5159,7 +5159,7 @@
"bVk" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bVl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bVm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bVn" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorsilver.dmi'; name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
+"bVn" = (/obj/machinery/door/airlock{ name = "Kitchen Cold Room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bVo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bVp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera{c_tag = "Kitchen - Coldroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"bVq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light_switch{pixel_y = -26},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
@@ -5199,15 +5199,15 @@
"bVY" = (/obj/machinery/door/poddoor/shutters{id = "teleshutter"; name = "Teleporter Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
"bVZ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Research and Development Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplefull"; tag = "icon-whitehall (WEST)"},/area/toxins/lab)
"bWa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/explab)
-"bWb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
+"bWb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{ name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
"bWc" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters/preopen{id = "kitchen"; name = "Serving Hatch"},/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"bWd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
+"bWd" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{ name = "Corporate Showroom"; req_access_txt = "19"},/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
"bWe" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{id = "gateshutter"; name = "Gateway Access Shutter"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/gateway)
"bWf" = (/obj/machinery/atmospherics/components/unary/heat_reservoir/heater{dir = 8; tag = ""},/turf/simulated/floor/plasteel,/area/atmos)
"bWg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bWh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "greencorner"},/area/hallway/primary/central)
"bWi" = (/turf/simulated/wall,/area/hydroponics)
-"bWj" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Service Door"; req_access_txt = "0"; req_one_access_txt = "35;28"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics)
+"bWj" = (/obj/machinery/door/poddoor/shutters/preopen{id = "kitchenhydro"; name = "Service Shutter"},/obj/machinery/door/airlock/glass_medical{ id_tag = ""; name = "Service Door"; req_access_txt = "0"; req_one_access_txt = "35;28"},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/hydroponics)
"bWk" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastleft{dir = 1; name = "Kitchen Window"; req_access_txt = "28"; req_one_access_txt = "0"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/weapon/paper,/obj/machinery/door/window/eastleft{dir = 2; name = "Hydroponics Window"; req_access_txt = "0"; req_one_access_txt = "30;35"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/hydroponics)
"bWl" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/hydroponics)
"bWm" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/crew_quarters/kitchen)
@@ -5608,7 +5608,7 @@
"cdR" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cdS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
"cdT" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hallway/primary/central)
-"cdU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{icon = 'icons/obj/doors/Doorglass.dmi'; id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"cdU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{ id_tag = ""; name = "Hydroponics"; req_access_txt = "35"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cdV" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
"cdW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 6},/area/hydroponics)
"cdX" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "green"},/area/hydroponics)
@@ -5959,8 +5959,8 @@
"ckE" = (/obj/structure/noticeboard{desc = "A board for pinning important notices upon."; name = "notice board"; pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
"ckF" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
"ckG" = (/obj/machinery/power/apc{dir = 8; name = "Incinerator APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"ckH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = "ResearchFoyer"; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
-"ckI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"ckH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; id_tag = "ResearchFoyer"; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"ckI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"ckJ" = (/turf/simulated/wall/r_wall,/area/security/checkpoint/science{name = "Security Post - Research Division"})
"ckK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Post - Research Division"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/security/checkpoint/science{name = "Security Post - Research Division"})
"ckL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;47"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6236,10 +6236,10 @@
"cpY" = (/obj/machinery/r_n_d/destructive_analyzer,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/lab)
"cpZ" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurple"},/area/toxins/lab)
"cqa" = (/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/toxins/lab)
-"cqb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
+"cqb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{glass = 0; id_tag = ""; name = "Research Division"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"cqc" = (/obj/machinery/door/window/westleft{dir = 2; name = "Research Division Deliveries"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/maintenance/aft{name = "Aft Maintenance"})
"cqd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/toxins/explab)
-"cqe" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{glass = 0; icon = 'icons/obj/doors/Doorresearch.dmi'; id_tag = ""; name = "Research Break Room"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
+"cqe" = (/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_medical{glass = 0; id_tag = ""; name = "Research Break Room"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "47"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/research{name = "Research Division"})
"cqf" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"cqg" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cqh" = (/obj/item/candle,/obj/machinery/light_switch{pixel_x = -27},/obj/effect/decal/cleanable/cobweb,/obj/structure/table/wood,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/chapel/main)
@@ -7438,8 +7438,8 @@
"cND" = (/obj/machinery/atmospherics/components/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cNE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/virology)
"cNF" = (/turf/simulated/wall,/area/chapel/office)
-"cNG" = (/obj/machinery/door/airlock/centcom{icon = 'icons/obj/doors/Doormaint.dmi'; layer = 2.7; name = "Crematorium Maintenance"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cNH" = (/obj/machinery/door/airlock/centcom{icon = 'icons/obj/doors/Doormaint.dmi'; name = "Chapel Office Maintenance"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cNG" = (/obj/machinery/door/airlock/centcom{ layer = 2.7; name = "Crematorium Maintenance"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cNH" = (/obj/machinery/door/airlock/centcom{ name = "Chapel Office Maintenance"; opacity = 1; req_access_txt = "27"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cNI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cNJ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cNK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -7832,7 +7832,7 @@
"cVj" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVk" = (/obj/structure/closet,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVl" = (/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cVm" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cVm" = (/obj/machinery/door/airlock/command{ name = "Test Chamber Maintenance"; req_access_txt = "47"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVn" = (/obj/machinery/atmospherics/pipe/simple/general/visible,/obj/structure/window/reinforced{dir = 4},/obj/machinery/button/ignition{id = "Xenobio"; pixel_x = -6; pixel_y = -2},/obj/machinery/button/door{id = "Xenolab"; name = "Test Chamber Blast Doors"; pixel_x = 4; pixel_y = -2; req_access_txt = "55"},/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVo" = (/obj/machinery/computer/security/telescreen{dir = 1; name = "Test Chamber Monitor"; network = list("Xeno"); pixel_x = 0; pixel_y = 2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVp" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -7840,7 +7840,7 @@
"cVr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVs" = (/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/structure/table,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVt" = (/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
-"cVu" = (/obj/machinery/door/airlock/command{icon = 'icons/obj/doors/Doorele.dmi'; name = "Test Chamber Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
+"cVu" = (/obj/machinery/door/airlock/command{ name = "Test Chamber Maintenance"; req_access_txt = "47"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVv" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cVx" = (/obj/machinery/shieldwallgen{req_access = list(55)},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 75a1ab76ce7..8ae31fd23ca 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -5418,7 +5418,7 @@
/area/wizard_station)
"ov" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Break Room"
},
/turf/simulated/floor/plasteel/cult,
@@ -6011,7 +6011,7 @@
/area/wizard_station)
"qb" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Corridor A"
},
/turf/simulated/floor/plasteel/cult,
@@ -6132,14 +6132,14 @@
/area/centcom/holding)
"qu" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Personal Quarters"
},
/turf/simulated/floor/plasteel/cult,
/area/wizard_station)
"qv" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Engine Room B"
},
/turf/space,
diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm
index f30f2a703be..e3dbfe6a3ef 100644
--- a/_maps/map_files/MiniStation/z2.dmm
+++ b/_maps/map_files/MiniStation/z2.dmm
@@ -424,7 +424,7 @@
"ih" = (/turf/indestructible/riveted{tag = "icon-uranium12"; icon_state = "uranium12"},/area/wizard_station)
"ii" = (/turf/indestructible/riveted{tag = "icon-uranium4"; icon_state = "uranium4"},/area/wizard_station)
"ij" = (/turf/indestructible/riveted{tag = "icon-uranium14"; icon_state = "uranium14"},/area/wizard_station)
-"ik" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Break Room"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
+"ik" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Break Room"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"il" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 10},/obj/item/device/multitool,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
"im" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
"in" = (/obj/structure/closet/syndicate/personal,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
@@ -527,7 +527,7 @@
"kg" = (/obj/structure/urinal{pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"kh" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"ki" = (/turf/indestructible/riveted{tag = "icon-uranium13"; icon_state = "uranium13"},/area/wizard_station)
-"kj" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
+"kj" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Corridor A"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"kk" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
"kl" = (/obj/structure/stool,/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
"km" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/wall/shuttle{icon_state = "wall3"},/area/shuttle/syndicate)
@@ -573,7 +573,7 @@
"la" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plating,/area/syndicate_mothership)
"lb" = (/turf/simulated/floor/plasteel{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/syndicate_mothership)
"lc" = (/obj/machinery/vending/tool,/turf/simulated/floor/plasteel/black,/area/syndicate_mothership)
-"ld" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Personal Quarters"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
+"ld" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Personal Quarters"},/turf/simulated/floor/plasteel/cult,/area/wizard_station)
"le" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/floor/plasteel/shuttle/red,/area/shuttle/syndicate)
"lf" = (/turf/simulated/floor/plating/snow,/turf/simulated/floor/plasteel/cult{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"lg" = (/turf/simulated/floor/plating/snow,/obj/structure/flora/bush,/turf/simulated/floor/plasteel/cult{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
@@ -698,7 +698,7 @@
"nw" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/tie/waistcoat,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/centcom/holding)
"nx" = (/turf/simulated/floor/bluegrid,/area/tdome/arena)
"ny" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena)
-"nz" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Engine Room B"},/turf/space,/area/wizard_station)
+"nz" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; name = "Engine Room B"},/turf/space,/area/wizard_station)
"nA" = (/obj/item/toy/beach_ball,/turf/simulated/floor/plating/beach/sand,/area/centcom/holding)
"nB" = (/obj/structure/rack,/obj/item/weapon/storage/crayons,/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/centcom/holding)
"nC" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/centcom/holding)
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index aa8d04f8832..7756f32ef39 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -4356,7 +4356,7 @@
/area/wizard_station)
"mR" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Break Room"
},
/turf/simulated/floor/plasteel/cult,
@@ -5041,7 +5041,7 @@
/area/wizard_station)
"oC" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Corridor A"
},
/turf/simulated/floor/plasteel/cult,
@@ -5232,7 +5232,7 @@
/area/tdome/tdomeadmin)
"pf" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Personal Quarters"
},
/turf/simulated/floor/plasteel/cult,
@@ -5463,7 +5463,7 @@
/area/centcom/holding)
"pR" = (
/obj/machinery/door/airlock{
- icon = 'icons/obj/doors/Dooruranium.dmi';
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi';
name = "Engine Room B"
},
/turf/space,
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index b0a8aedddc5..5fcd9bf7266 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -44,7 +44,7 @@ Pipelines + Other Objects -> Pipe network
if(pipe_vision_img)
qdel(pipe_vision_img)
- ..()
+ return ..()
//this is called just after the air controller sets up turfs
/obj/machinery/atmospherics/proc/atmosinit()
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index 9cecf78413f..6b0719580ff 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -35,7 +35,7 @@ Acts like a normal vent, but has an input AND output.
/obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume
name = "large dual-port air vent"
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index d75d045a636..63697dfaad6 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -25,7 +25,7 @@ Passive gate is similar to the regular pump except:
/obj/machinery/atmospherics/components/binary/passive_gate/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/binary/passive_gate/update_icon_nopipes()
if(!on)
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 73482b9c864..c9a3147e482 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -29,7 +29,7 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/pump/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/binary/pump/on
on = 1
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index a87f2964480..39160074e52 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -29,7 +29,7 @@ Thus, the two variables affect pump operation are set in New():
/obj/machinery/atmospherics/components/binary/volume_pump/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/binary/volume_pump/on
on = 1
diff --git a/code/ATMOSPHERICS/components/components_base.dm b/code/ATMOSPHERICS/components/components_base.dm
index 9f63f655d34..46f5ac86d99 100644
--- a/code/ATMOSPHERICS/components/components_base.dm
+++ b/code/ATMOSPHERICS/components/components_base.dm
@@ -90,7 +90,7 @@ Pipenet stuff; housekeeping
N.disconnect(src)
nodes["n[I]"] = null
nullifyPipenet(parents["p[I]"])
- ..()
+ return ..()
/obj/machinery/atmospherics/components/atmosinit(var/list/node_connects)
for(var/I = 1; I <= device_type; I++)
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index a56bdd14c0c..49029140f7e 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -47,7 +47,7 @@ Filter types:
/obj/machinery/atmospherics/components/trinary/filter/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/trinary/filter/update_icon()
overlays.Cut()
diff --git a/code/ATMOSPHERICS/components/unary_devices/cryo.dm b/code/ATMOSPHERICS/components/unary_devices/cryo.dm
index 246716772aa..03c978cead4 100644
--- a/code/ATMOSPHERICS/components/unary_devices/cryo.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/cryo.dm
@@ -44,7 +44,7 @@
if(beaker)
beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube
beaker = null
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos()
..()
var/datum/gas_mixture/air_contents = airs[AIR1]
diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
index 10ecdf726d9..430d8b42820 100644
--- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
@@ -19,7 +19,7 @@
/obj/machinery/atmospherics/components/unary/outlet_injector/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/outlet_injector/on
on = 1
diff --git a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm
index 9446c396078..d9e649c7a13 100644
--- a/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/portables_connector.dm
@@ -19,7 +19,7 @@
/obj/machinery/atmospherics/components/unary/portables_connector/Destroy()
if(connected_device)
connected_device.disconnect()
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/portables_connector/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 7d574f302d6..c6bc8523f43 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -59,7 +59,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/vent_pump/high_volume
name = "large air vent"
@@ -305,7 +305,7 @@
if(initial_loc)
initial_loc.air_vent_info -= id_tag
initial_loc.air_vent_names -= id_tag
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/vent_pump/can_crawl_through()
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 691835ed4cc..95fb33af540 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -51,7 +51,7 @@
if(initial_loc)
initial_loc.air_scrub_info -= id_tag
initial_loc.air_scrub_names -= id_tag
- ..()
+ return ..()
/obj/machinery/atmospherics/components/unary/vent_scrubber/auto_use_power()
if(!powered(power_channel))
return 0
diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm
index cf55d774602..95f95101838 100644
--- a/code/ATMOSPHERICS/datum_pipeline.dm
+++ b/code/ATMOSPHERICS/datum_pipeline.dm
@@ -18,7 +18,7 @@
P.parent = null
for(var/obj/machinery/atmospherics/components/C in other_atmosmch)
C.nullifyPipenet(src)
- ..()
+ return ..()
/datum/pipeline/process()
if(update)
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index 8f6ac175080..c8ae1b45986 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -73,7 +73,7 @@
node3 = null
A.build_network()
releaseAirToTurf()
- ..()
+ return ..()
/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference)
if(reference == node1)
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm
index 4db873eed76..d630135caad 100644
--- a/code/ATMOSPHERICS/pipes/manifold4w.dm
+++ b/code/ATMOSPHERICS/pipes/manifold4w.dm
@@ -77,7 +77,7 @@
node4 = null
A.build_network()
releaseAirToTurf()
- ..()
+ return ..()
/obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference)
if(reference == node1)
diff --git a/code/ATMOSPHERICS/pipes/pipes.dm b/code/ATMOSPHERICS/pipes/pipes.dm
index f0ca8f8e244..5825da05ce9 100644
--- a/code/ATMOSPHERICS/pipes/pipes.dm
+++ b/code/ATMOSPHERICS/pipes/pipes.dm
@@ -56,7 +56,7 @@
var/obj/item/pipe_meter/PM = new (T)
meter.transfer_fingerprints_to(PM)
qdel(meter)
- ..()
+ return ..()
/obj/machinery/atmospherics/pipe/proc/update_node_icon()
//Used for pipe painting. Overriden in the children.
diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm
index b4685c44a1d..586b6eb16d1 100644
--- a/code/ATMOSPHERICS/pipes/simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple.dm
@@ -77,7 +77,7 @@ The regular pipe you see everywhere, including bent ones.
node2 = null
A.build_network()
releaseAirToTurf()
- ..()
+ return ..()
/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference)
if(reference == node1)
diff --git a/code/__DATASTRUCTURES/linked_lists.dm b/code/__DATASTRUCTURES/linked_lists.dm
new file mode 100644
index 00000000000..eccc3c422a8
--- /dev/null
+++ b/code/__DATASTRUCTURES/linked_lists.dm
@@ -0,0 +1,191 @@
+
+//Ok so it's technically a double linked list, bite me.
+
+/datum/linked_list
+ var/datum/linked_node/head
+ var/datum/linked_node/tail
+ var/node_amt = 0
+
+
+/datum/linked_node
+ var/value = null
+ var/datum/linked_list/linked_list = null
+ var/datum/linked_node/next_node = null
+ var/datum/linked_node/previous_node = null
+
+
+/datum/linked_list/proc/IsEmpty()
+ . = (node_amt <= 0)
+
+
+//Add a linked_node (or value, creating a linked_node) at position
+//the added node BECOMES the position-th element,
+//eg: add("Test",5), the 5th node is now "Test", the previous 5th moves up to become the 6th
+/datum/linked_list/proc/Add(node, position)
+ var/datum/linked_node/adding
+ if(istype(node, /datum/linked_node))
+ adding = node
+ else
+ adding = new()
+ adding.value = node
+
+ if(!adding.linked_list || (adding.linked_list && (adding.linked_list != src)))
+ node_amt++
+
+ adding.linked_list = src
+
+ if(position && position < node_amt)
+ //Replacing head
+ if(position == 1)
+ if(head)
+ head.previous_node = adding
+ adding.next_node = head
+ head = adding
+
+ //Replacing any middle node
+ else
+ var/location = 0
+ var/datum/linked_node/at
+ while((location != position) && (location <= node_amt))
+ if(at)
+ if(at.next_node)
+ at = at.next_node
+ else
+ break
+ else
+ at = head
+ location++
+
+ //Push at up and assume it's place as the position-th element
+ if(at && at.previous_node)
+ at.previous_node.next_node = adding
+ adding.previous_node = at.previous_node
+ at.previous_node = adding
+ adding.next_node = at
+ return
+
+ //Replacing tail
+ if(tail)
+ tail.next_node = adding
+ adding.previous_node = tail
+ if(!tail.previous_node)
+ head = tail
+ tail = adding
+
+
+
+//Remove a linked_node or the linked_node of a value
+//If you specify a value the FIRST ONE is removed
+/datum/linked_list/proc/Remove(node)
+ var/datum/linked_node/removing
+ if(istype(node,/datum/linked_node))
+ removing = node
+ else
+ //optimise removing head and tail, no point looping for them, especially the tail
+ if(removing == head)
+ removing = head
+ else if(removing == tail)
+ removing = tail
+ else
+ var/location = 1
+ var/current_value = null
+ var/datum/linked_node/at = null
+ while((current_value != node) && (location <= node_amt))
+ if(at)
+ if(at.next_node)
+ at = at.next_node
+ else
+ at = head
+ location++
+ if(at)
+ current_value = at.value
+ if(current_value == node)
+ removing = at
+ break
+
+ //Adjust pointers of where removing -was- in the chain.
+ if(removing)
+ if(removing.previous_node)
+ if(removing == tail)
+ tail = removing.previous_node
+ if(removing.next_node)
+ if(removing == head)
+ head = removing.next_node
+ removing.next_node.previous_node = removing.previous_node
+ removing.previous_node.next_node = removing.next_node
+ else
+ removing.previous_node.next_node = null
+ else
+ if(removing.next_node)
+ if(removing == head)
+ head = removing.next_node
+ removing.next_node.previous_node = null
+
+ //if this is still true at this point, there's no more nodes to replace them with
+ if(removing == head)
+ head = null
+ if(removing == tail)
+ tail = null
+
+ removing.next_node = null
+ removing.previous_node = null
+ if(removing.linked_list == src)
+ node_amt--
+ removing.linked_list = null
+
+ return removing
+ return 0
+
+
+//Removes and deletes a node or value
+/datum/linked_list/proc/RemoveDelete(node)
+ var/datum/linked_node/dead = Remove(node)
+ if(dead)
+ qdel(dead)
+ return 1
+ return 0
+
+
+//Empty the linked_list, deleting all nodes
+/datum/linked_list/proc/Empty()
+ var/datum/linked_node/n = head
+ while(n)
+ var/next = n.next_node
+ Remove(n)
+ qdel(n)
+ n = next
+ node_amt = 0
+
+
+//Some debugging tools
+/datum/linked_list/proc/CheckNodeLinks()
+ var/datum/linked_node/n = head
+ while(n)
+ . = "|[n.value]|"
+ if(n.previous_node)
+ . = "[n.previous_node.value]<-" + .
+ if(n.next_node)
+ . += "->[n.next_node.value]"
+ n = n.next_node
+ . += "
"
+
+
+/datum/linked_list/proc/DrawNodeLinks()
+ . = "|<-"
+ var/datum/linked_node/n = head
+ while(n)
+ if(n.previous_node)
+ . += "<-"
+ . += "[n.value]"
+ if(n.next_node)
+ . += "->"
+ n = n.next_node
+ . += "->|"
+
+
+/datum/linked_list/proc/ToList()
+ . = list()
+ var/datum/linked_node/n = head
+ while(n)
+ . += n
+ n = n.next_node
\ No newline at end of file
diff --git a/code/__DATASTRUCTURES/priority_queue.dm b/code/__DATASTRUCTURES/priority_queue.dm
new file mode 100644
index 00000000000..2983924e0a1
--- /dev/null
+++ b/code/__DATASTRUCTURES/priority_queue.dm
@@ -0,0 +1,65 @@
+
+//////////////////////
+//PriorityQueue object
+//////////////////////
+
+//an ordered list, using the cmp proc to weight the list elements
+/PriorityQueue
+ var/list/L //the actual queue
+ var/cmp //the weight function used to order the queue
+
+/PriorityQueue/New(compare)
+ L = new()
+ cmp = compare
+
+/PriorityQueue/proc/IsEmpty()
+ return !L.len
+
+//add an element in the list,
+//immediatly ordering it to its position using Insertion sort
+/PriorityQueue/proc/Enqueue(atom/A)
+ var/i
+ L.Add(A)
+ i = L.len -1
+ while(i > 0 && call(cmp)(L[i],A) >= 0) //place the element at it's right position using the compare proc
+ L.Swap(i,i+1) //last inserted element being first in case of ties (optimization)
+ i--
+
+//removes and returns the first element in the queue
+/PriorityQueue/proc/Dequeue()
+ if(!L.len)
+ return 0
+ . = L[1]
+ Remove(.)
+ return .
+
+//removes an element
+/PriorityQueue/proc/Remove(atom/A)
+ return L.Remove(A)
+
+//returns a copy of the elements list
+/PriorityQueue/proc/List()
+ var/list/ret = L.Copy()
+ return ret
+
+//return the position of an element or 0 if not found
+/PriorityQueue/proc/Seek(atom/A)
+ return L.Find(A)
+
+//return the element at the i_th position
+/PriorityQueue/proc/Get(i)
+ if(i > L.len || i < 1)
+ return 0
+ return L[i]
+
+//replace the passed element at it's right position using the cmp proc
+/PriorityQueue/proc/ReSort(atom/A)
+ var/i = Seek(A)
+ if(i == 0)
+ return
+ while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
+ L.Swap(i,i+1)
+ i++
+ while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
+ L.Swap(i,i-1)
+ i--
\ No newline at end of file
diff --git a/code/__DATASTRUCTURES/stacks.dm b/code/__DATASTRUCTURES/stacks.dm
new file mode 100644
index 00000000000..64280ec7006
--- /dev/null
+++ b/code/__DATASTRUCTURES/stacks.dm
@@ -0,0 +1,64 @@
+
+//Both count as failures, and they don't equate to each other
+//this lets us do if(Pop()) without having to specifically check for underflow
+//same for if(Push()) and overflow
+#define STACK_OVERFLOW -1
+#define STACK_UNDERFLOW -2
+
+
+/datum/stack
+ var/list/stack = list()
+ var/max_elements = 0
+
+/datum/stack/New(list/elements,max)
+ ..()
+ if(elements)
+ stack = elements.Copy()
+ if(max)
+ max_elements = max
+
+/datum/stack/proc/Pop()
+ if(is_empty())
+ return STACK_UNDERFLOW
+ . = stack[stack.len]
+ stack.Cut(stack.len,0)
+
+/datum/stack/proc/Push(element)
+ if(max_elements && (stack.len+1 > max_elements))
+ return STACK_OVERFLOW
+ stack += element
+
+/datum/stack/proc/Top()
+ if(is_empty())
+ return STACK_UNDERFLOW
+ . = stack[stack.len]
+
+/datum/stack/proc/is_empty()
+ . = (stack.len > 0)
+
+//Rotate entire stack left with the leftmost looping around to the right
+/datum/stack/proc/RotateLeft()
+ if(is_empty())
+ return 0
+ . = stack[1]
+ stack.Cut(1,2)
+ Push(.)
+
+//Rotate entire stack to the right with the rightmost looping around to the left
+/datum/stack/proc/RotateRight()
+ if(is_empty())
+ return 0
+ . = stack[stack.len]
+ stack.Cut(stack.len,0)
+ stack.Insert(1,.)
+
+
+/datum/stack/proc/Copy()
+ var/datum/stack/S=new()
+ S.stack = stack.Copy()
+ S.max_elements = max_elements
+ return S
+
+
+/datum/stack/proc/Clear()
+ stack.Cut()
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 264f8cc73f1..27f8526c2e1 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -76,7 +76,7 @@
// Used to get a properly sanitized input, of max_length
/proc/stripped_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN)
var/name = input(user, message, title, default) as text|null
- return html_encode(trim(name, max_length)) //trim is "inside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
+ return trim(html_encode(name), max_length) //trim is "outside" because html_encode can expand single symbols into multiple symbols (such as turning < into <)
// Used to get a properly sanitized multiline input, of max_length
/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN)
@@ -411,4 +411,4 @@ var/list/binary = list("0","1")
t = replacetext(t, "\[list\]", "
")
t = replacetext(t, "\[/list\]", "
")
- return t
\ No newline at end of file
+ return t
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index fcb84606da3..aa1082cdf82 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -13,4 +13,5 @@ var/global/list/chemical_reactions_list //list of all /datum/chemical_reactio
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path.
var/global/list/table_recipes = list() //list of all table craft recipes
+var/global/list/rcd_list = list() //list of Rapid Construction Devices.
var/global/list/apcs_list = list() //list of all Area Power Controller machines, seperate from machines for powernet speeeeeeed.
\ No newline at end of file
diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm
index b9c8254054b..c1442fe2e9c 100644
--- a/code/_onclick/hud/action.dm
+++ b/code/_onclick/hud/action.dm
@@ -30,6 +30,7 @@
/datum/action/Destroy()
if(owner)
Remove(owner)
+ return ..()
/datum/action/proc/Grant(mob/living/T)
if(owner)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index bc045a9923d..8c70a7825eb 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -15,7 +15,7 @@
/obj/screen/Destroy()
master = null
- ..()
+ return ..()
/obj/screen/text
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index b8d4c6c4a6f..ecd7ad159da 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -121,10 +121,13 @@ var/datum/subsystem/garbage_collector/SSgarbage
PlaceInPool(A,0)
if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
#ifdef TESTING
- A.find_references(remove_from_queue = FALSE)
- #endif
+ A.to_be_queued = TRUE
+ A.find_references()
+ #else
SSgarbage.Queue(A)
+ #endif
else
+ testing("WARNING: \ref[A] \[[A.type]] is not returning a qdel hint. It is being placed in the queue.")
SSgarbage.Queue(A)
// Returns 1 if the object has been queued for deletion.
@@ -147,8 +150,9 @@ var/datum/subsystem/garbage_collector/SSgarbage
#ifdef TESTING
/client/var/running_find_references
/datum/var/running_find_references
+/datum/var/to_be_queued = FALSE
-/datum/verb/find_references(remove_from_queue = TRUE as num)
+/datum/verb/find_references()
set category = "Debug"
set name = "Find References"
set background = 1
@@ -166,7 +170,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
running_find_references = null
return
// Remove this object from the list of things to be auto-deleted.
- if(remove_from_queue && SSgarbage && ("\ref[src]" in SSgarbage.queue))
+ if(SSgarbage && ("\ref[src]" in SSgarbage.queue))
SSgarbage.queue -= "\ref[src]"
if(usr && usr.client)
usr.client.running_find_references = type
@@ -192,6 +196,10 @@ var/datum/subsystem/garbage_collector/SSgarbage
usr.client.running_find_references = null
running_find_references = null
+ if(to_be_queued == TRUE)
+ to_be_queued = FALSE
+ SSgarbage.Queue(src)
+
/client/verb/purge_all_destroyed_objects()
set category = "Debug"
if(SSgarbage)
@@ -210,5 +218,6 @@ var/datum/subsystem/garbage_collector/SSgarbage
qdel(src)
if(!running_find_references)
- find_references(remove_from_queue = FALSE)
+ to_be_queued = TRUE //find_references removes the object from the queue;
+ find_references() //this ensures the object will be queued again once find_references has completed
#endif
\ No newline at end of file
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index d31987e4f0b..4c04c91bbdf 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -109,7 +109,7 @@ var/datum/subsystem/shuttle/SSshuttle
user << "The emergency shuttle has been disabled by Centcom."
return
- call_reason = html_encode(trim(call_reason))
+ call_reason = trim(html_encode(call_reason))
if(length(call_reason) < CALL_SHUTTLE_REASON_LENGTH)
user << "You must provide a reason."
@@ -284,6 +284,12 @@ var/datum/subsystem/shuttle/SSshuttle
A:amount = object.amount
slip.info += "[A.name]" //add the item to the manifest (even if it was misplaced)
+ if(istype(Crate, /obj/structure/closet/critter)) // critter crates do not actually spawn mobs yet and have no contains var, but the manifest still needs to list them
+ var/obj/structure/closet/critter/CritCrate = Crate
+ if(CritCrate.content_mob)
+ var/mob/crittername = CritCrate.content_mob
+ slip.info += "[initial(crittername.name)]"
+
if((errors & MANIFEST_ERROR_ITEM))
//secure and large crates cannot lose items
if(findtext("[object.containertype]", "/secure/") || findtext("[object.containertype]","/largecrate/"))
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 1d9fb09f63b..67c5abe8b5c 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -43,6 +43,7 @@ var/datum/subsystem/timer/SStimer
/datum/timedevent/Destroy()
SStimer.processing -= src
+ return ..()
/proc/addtimer(thingToCall, procToCall, wait, argList = list())
if (!SStimer) //can't run timers before the mc has been created
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index 2d514504c81..ef414e9269c 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -40,7 +40,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/selection_type = "view" //can be "range" or "view"
var/spell_level = 0 //if a spell can be taken multiple times, this raises
var/level_max = 4 //The max possible level_max is 4
- var/cooldown_min = 0 //This defines what spell quickened four timeshas as a cooldown. Make sure to set this for every spell
+ var/cooldown_min = 0 //This defines what spell quickened four times has as a cooldown. Make sure to set this for every spell
var/overlay = 0
var/overlay_icon = 'icons/obj/wizard.dmi'
diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm
new file mode 100644
index 00000000000..0e5db631223
--- /dev/null
+++ b/code/datums/spells/bloodcrawl.dm
@@ -0,0 +1,32 @@
+/obj/effect/proc_holder/spell/bloodcrawl
+ name = "Blood crawl"
+ desc = "Use blood to travel."
+ charge_max = 10
+ clothes_req = 0
+ selection_type = "range"
+ range = 1
+ cooldown_min = 0
+ overlay = null
+ action_icon_state = "bloodcrawl"
+ var/phased = 0
+
+/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr)
+ for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user)))
+ if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder))
+ perform(target)
+ return
+ revert_cast()
+ user << "You need blood to blood crawl."
+
+/obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr)
+ if(istype(user))
+ if(phased)
+ if(user.phasein(target))
+ phased = 0
+ else
+ user.phaseout(target)
+ phased = 1
+ start_recharge()
+ return
+ revert_cast()
+ user << "You cannot blood crawl."
\ No newline at end of file
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 6f5247e8e92..664bf001425 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -88,7 +88,7 @@
// Eject contents if deleted somehow
for(var/atom/movable/AM in src)
AM.loc = get_turf(src)
- ..()
+ return ..()
/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction)
if (!src.canmove || reappearing || !direction) return
diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm
index 45fd66af320..6b772162c7b 100644
--- a/code/datums/spells/knock.dm
+++ b/code/datums/spells/knock.dm
@@ -20,5 +20,9 @@
if(istype(door,/obj/machinery/door/airlock))
door:locked = 0
door.open()
+ for(var/obj/structure/closet/C in T.contents)
+ spawn(1)
+ C.locked = 0
+ C.open()
return
\ No newline at end of file
diff --git a/code/datums/spells/touch_attacks.dm b/code/datums/spells/touch_attacks.dm
index cd83738c1f7..9f69c3bd2a4 100644
--- a/code/datums/spells/touch_attacks.dm
+++ b/code/datums/spells/touch_attacks.dm
@@ -1,6 +1,7 @@
-/obj/effect/proc_holder/spell/targeted/touch/
+/obj/effect/proc_holder/spell/targeted/touch
var/hand_path = "/obj/item/weapon/melee/touch_attack"
var/obj/item/weapon/melee/touch_attack/attached_hand = null
+ var/refund_coeff = 1 //how much of their charge they get back.
invocation_type = "none" //you scream on connecting, not summoning
include_user = 1
range = -1
@@ -8,7 +9,7 @@
/obj/effect/proc_holder/spell/targeted/touch/Click(mob/user = usr)
if(attached_hand)
qdel(attached_hand)
- charge_counter = charge_max
+ charge_counter = round(charge_max * refund_coeff, 1)
attached_hand = null
user << "You draw the power out of your hand."
return 0
@@ -48,6 +49,7 @@
name = "Disintegrate"
desc = "This spell charges your hand with vile energy that can be used to violently explode victims."
hand_path = "/obj/item/weapon/melee/touch_attack/disintegrate"
+ refund_coeff = 0.66
school = "evocation"
charge_max = 600
@@ -56,6 +58,15 @@
action_icon_state = "gib"
+/obj/effect/proc_holder/spell/targeted/touch/disintegrate/cast(list/targets)
+ for(var/mob/living/carbon/user in targets)
+ visible_message("[user] starts gathering destructive energy...", "You start gathering destructive energy...")
+ playsound(user.loc, 'sound/magic/Ethereal_Exit.ogg', 50, 1)
+ if(!do_after(user, 15))
+ return 0
+ visible_message("[user] channels a large amount of destructive energy to his hand!", "You channel a large amount of destructive energy to his hand!")
+ ..()
+
/obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone
name = "Flesh to Stone"
desc = "This spell charges your hand with the power to turn victims into inert statues for a long period of time."
diff --git a/code/datums/spells/trigger.dm b/code/datums/spells/trigger.dm
index 684f51159a6..3988f3bae16 100644
--- a/code/datums/spells/trigger.dm
+++ b/code/datums/spells/trigger.dm
@@ -17,7 +17,7 @@
qdel(spell)
linked_spells = null
starting_spells = null
- ..()
+ return ..()
/obj/effect/proc_holder/spell/targeted/trigger/cast(list/targets)
playMagSound()
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index d7b6ef50879..fadd5898320 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -353,6 +353,12 @@ var/list/uplink_items = list()
cost = 6
excludefrom = list(/datum/game_mode/nuclear)
+/datum/uplink_item/stealthy_weapons/edagger
+ name = "Energy Dagger"
+ desc = "A dagger made of energy that looks and functions as a pen when off."
+ item = /obj/item/weapon/pen/edagger
+ cost = 2
+
/datum/uplink_item/stealthy_weapons/foampistol
name = "Toy Gun (with Stun Darts)"
desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade darts, to incapacitate a target."
@@ -471,7 +477,7 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_tools/camera_bug
name = "Camera Bug"
- desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions."
+ desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you to disable them remotely"
item = /obj/item/device/camera_bug
cost = 1
surplus = 90
@@ -520,7 +526,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/belt/military
cost = 3
excludefrom = list(/datum/game_mode/nuclear)
-
+
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 8e6662109e3..0b710001f38 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -277,9 +277,9 @@
var/datum/objective/objective = team_objectives[team_number]
var/team_name = team_names[team_number]
if(console.experiment.points >= objective.target_amount)
- world << "[team_name] team fullfilled its mission!"
+ world << "[team_name] team fullfilled its mission!"
else
- world << "[team_name] team failed its mission."
+ world << "[team_name] team failed its mission."
..()
return 1
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index 743196fbb2a..55f79d883b8 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -45,8 +45,7 @@
var/datum/game_mode/blob/blob_mode = src
if(blob_mode.infected_crew.len)
var/text = "The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:"
-
for(var/datum/mind/blob in blob_mode.infected_crew)
- text += "
[blob.key] was [blob.name]"
+ text += printplayer(blob)
world << text
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index cad8505781d..17e79f569bd 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -26,7 +26,7 @@
/mob/living/simple_animal/hostile/blob/blobspore
name = "blob"
- desc = "Some blob thing."
+ desc = "A floating, fragile spore."
icon_state = "blobpod"
icon_living = "blobpod"
health = 40
@@ -117,7 +117,7 @@
if(contents)
for(var/mob/M in contents)
M.loc = src.loc
- ..()
+ return ..()
/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
@@ -146,7 +146,7 @@
/mob/living/simple_animal/hostile/blob/blobbernaut
name = "blobbernaut"
- desc = "Some HUGE blob thing."
+ desc = "A hulking, mobile chunk of blobmass."
icon_state = "blobbernaut"
icon_living = "blobbernaut"
icon_dead = "blobbernaut_dead"
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index b19965f3d3e..b3056465ffe 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -2,8 +2,10 @@
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
+ desc = "A huge, pulsating yellow mass."
health = 200
fire_resist = 2
+ explosion_block = 6
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds
var/resource_delay = 0
var/point_rate = 2
@@ -39,11 +41,14 @@
overmind.blob_core = null
overmind = null
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
+/obj/effect/blob/core/ex_act(severity, target)
+ return
+
/obj/effect/blob/core/update_icon()
if(health <= 0)
qdel(src)
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index 90dab3c0fe2..ea5c39267ea 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -2,6 +2,7 @@
name = "factory blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
+ desc = "A thick spire of tendrils."
health = 100
fire_resist = 2
var/list/spores = list()
@@ -17,7 +18,7 @@
if(spore.factory == src)
spore.factory = null
spores = null
- ..()
+ return ..()
/obj/effect/blob/factory/PulseAnimation(activate = 0)
if(activate)
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 423272ed8b6..8d2ef8caa7c 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -2,6 +2,7 @@
name = "blob node"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
+ desc = "A large, pulsating yellow mass."
health = 100
fire_resist = 2
@@ -25,7 +26,7 @@
/obj/effect/blob/node/Destroy()
blob_nodes -= src
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/effect/blob/node/Life()
pulseLoop(5)
diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm
index 78527b7cde0..2996265ee2c 100644
--- a/code/game/gamemodes/blob/blobs/resource.dm
+++ b/code/game/gamemodes/blob/blobs/resource.dm
@@ -2,6 +2,7 @@
name = "resource blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
+ desc = "A thin spire of slightly swaying tendrils."
health = 30
fire_resist = 2
var/resource_delay = 0
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index 1c145f4404f..68e29f221ee 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -2,8 +2,9 @@
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
- desc = "Some blob creature thingy"
+ desc = "A solid wall of slightly twitching tendrils."
health = 75
+ explosion_block = 3
fire_resist = 2
diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm
index 4b5089b10cc..a09e58915f3 100644
--- a/code/game/gamemodes/blob/blobs/storage.dm
+++ b/code/game/gamemodes/blob/blobs/storage.dm
@@ -2,6 +2,7 @@
name = "storage blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
+ desc = "A huge, smooth mass supported by tendrils."
health = 30
fire_resist = 2
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 26ffc2d65c5..f97ae377668 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -47,7 +47,7 @@
qdel(ghostimage)
ghostimage = null;
updateallghostimages()
- ..()
+ return ..()
/mob/camera/blob/Login()
..()
@@ -96,7 +96,7 @@
if (!message)
return
- var/message_a = say_quote(message)
+ var/message_a = say_quote(message, get_spans())
var/rendered = "Blob Telepathy, [name]([blob_reagent_datum.name]) [message_a]"
for (var/mob/M in mob_list)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 907bf7e2c68..c0dd7fa6a8b 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -3,10 +3,11 @@
name = "blob"
icon = 'icons/mob/blob.dmi'
luminosity = 3
- desc = "Some blob creature thingy"
+ desc = "A thick wall of writhing tendrils."
density = 0
opacity = 0
anchored = 1
+ explosion_block = 1
var/health = 30
var/health_timestamp = 0
var/brute_resist = 4
@@ -28,7 +29,7 @@
blobs -= src
if(isturf(loc)) //Necessary because Expand() is retarded and spawns a blob and then deletes it
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
- ..()
+ return ..()
/obj/effect/blob/CanPass(atom/movable/mover, turf/target, height=0)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 47ca5efc699..a88707f19cc 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -454,3 +454,4 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
/datum/changelingprofile/Destroy()
qdel(dna)
+ return ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index d040f806720..8b5f9794d53 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -389,6 +389,7 @@ var/list/sting_paths
if(ishuman(src) || ismonkey(src))
if(mind && mind.changeling)
digitalcamo = 0
+ digitalinvis = 0
mind.changeling.changeling_speak = 0
mind.changeling.reset()
for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers)
diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm
index 2404041ae17..13bf62bdbc4 100644
--- a/code/game/gamemodes/changeling/powers/digitalcamo.dm
+++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm
@@ -1,7 +1,7 @@
/obj/effect/proc_holder/changeling/digitalcamo
name = "Digital Camouflage"
desc = "By evolving the ability to distort our form and proprotions, we defeat common altgorithms used to detect lifeforms on cameras."
- helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny."
+ helptext = "We cannot be tracked by camera or seen by AI units while using this skill. However, humans looking at us will find us... uncanny."
dna_cost = 1
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
@@ -9,9 +9,12 @@
if(user.digitalcamo)
user << "We return to normal."
+ user.digitalinvis = 0
else
- user << "We distort our form to prevent AI-tracking."
- user.digitalcamo = !user.digitalcamo
+ user << "We distort our form to hide from the AI"
+ user.digitalcamo = 1
+ user.digitalinvis = !user.digitalcamo
+
feedback_add_details("changeling_powers","CAM")
return 1
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 50fac253f91..333142996be 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -313,11 +313,11 @@
if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
feedback_set("round_end_result",acolytes_survived)
- world << "The cult wins! It has succeeded in serving its dark masters!"
+ world << "The cult wins! It has succeeded in serving its dark masters!"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
- world << "The staff managed to stop the cult!"
+ world << "The staff managed to stop the cult!"
var/text = ""
@@ -328,28 +328,28 @@
switch(cult_objectives[obj_count])
if("survive")
if(!check_survive())
- explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!"
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
- explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail."
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail."
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in sacrificed)
- explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
- explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail."
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail."
feedback_add_details("cult_objective","cult_sacrifice|FAIL")
else
- explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)."
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)."
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
- explanation = "Summon Nar-Sie. Success!"
+ explanation = "Summon Nar-Sie. Success!"
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
else
- explanation = "Summon Nar-Sie. Fail."
+ explanation = "Summon Nar-Sie. Fail."
feedback_add_details("cult_objective","cult_narsie|FAIL")
text += "
Objective #[obj_count]: [explanation]"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index f27e6522c59..b47f6b500c3 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -471,17 +471,19 @@
if(M.client && M.client.holder)
M << msg
-/datum/game_mode/proc/printplayer(datum/mind/ply)
+/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
var/text = "
[ply.key] was [ply.name] the [ply.assigned_role] and"
if(ply.current)
if(ply.current.stat == DEAD)
- text += " died"
+ text += " died"
else
- text += " survived"
+ text += " survived"
+ if(fleecheck && ply.current.z > ZLEVEL_STATION)
+ text += " while fleeing the station"
if(ply.current.real_name != ply.name)
text += " as [ply.current.real_name]"
else
- text += " had their body destroyed"
+ text += " had their body destroyed"
return text
/datum/game_mode/proc/printobjectives(datum/mind/ply)
@@ -489,9 +491,9 @@
var/count = 1
for(var/datum/objective/objective in ply.objectives)
if(objective.check_completion())
- text += "
Objective #[count]: [objective.explanation_text] Success!"
+ text += "
Objective #[count]: [objective.explanation_text] Success!"
else
- text += "
Objective #[count]: [objective.explanation_text] Fail."
+ text += "
Objective #[count]: [objective.explanation_text] Fail."
count++
return text
diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm
index 898f558d087..c3ee3bb0c30 100644
--- a/code/game/gamemodes/gang/dominator.dm
+++ b/code/game/gamemodes/gang/dominator.dm
@@ -109,7 +109,7 @@
/obj/machinery/dominator/Destroy()
if(operating != -1)
set_broken()
- ..()
+ return ..()
/obj/machinery/dominator/emp_act(severity)
healthcheck(100)
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index a0373cc04dc..c641b5f6392 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -106,6 +106,7 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
var/obj/item/device/gangtool/gangtool = new(mob)
var/obj/item/weapon/pen/gang/T = new(mob)
var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang)
+ var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -139,8 +140,14 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
. += 1
else
mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get. All gangsters can use these, so distribute them to grow your influence faster."
- mob.update_icons()
+ var/where4 = mob.equip_in_one_of_slots(C, slots)
+ if (!where4)
+ mob << "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD."
+ . += 1
+ else
+ mob << "The chameleon security HUD in your [where4] will help you keep track of who is loyalty-implanted, and unable to be recruited."
+ mob.update_icons()
return .
@@ -241,39 +248,20 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
/datum/game_mode/proc/auto_declare_completion_gang(datum/gang/winner)
if(gangs.len)
if(!winner)
- world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
"
+ world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
"
else
- world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
"
+ world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
"
for(var/datum/gang/G in gangs)
- world << "
The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!"
- world << "
The [G.name] Gang Bosses were:"
- gang_membership_report(G.bosses)
- world << "
The [G.name] Gangsters were:"
- gang_membership_report(G.gangsters)
- world << "
"
-
-
-
-/datum/game_mode/proc/gang_membership_report(list/membership)
- var/text = ""
- for(var/datum/mind/gang_mind in membership)
- text += "
[gang_mind.key] was [gang_mind.name] ("
- if(gang_mind.current)
- if(gang_mind.current.stat == DEAD || isbrain(gang_mind.current))
- text += "died"
- else if(gang_mind.current.z > ZLEVEL_STATION)
- text += "fled the station"
- else
- text += "survived"
- if(gang_mind.current.real_name != gang_mind.name)
- text += " as [gang_mind.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
-
- world << text
-
+ var/text = "The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!"
+ text += "
The [G.name] Gang Bosses were:"
+ for(var/datum/mind/boss in G.bosses)
+ text += printplayer(boss, 1)
+ text += "
The [G.name] Gangsters were:"
+ for(var/datum/mind/gangster in G.gangsters)
+ text += printplayer(gangster, 1)
+ text += "
"
+ world << text
//////////////////////////////////////////////////////////
//Handles influence, territories, and the victory checks//
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 1909376ce74..9a9bf304e4c 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -120,30 +120,35 @@
minor_announce("Automatic system reboot complete. Have a secure day.","Network reset:")
-/datum/AI_Module/large/disable_rcd
- module_name = "RCD Disable"
+/datum/AI_Module/large/destroy_rcd
+ module_name = "Destroy RCDs"
mod_pick_name = "rcd"
- description = "Send a specialised pulse to break all RCD devices on the station."
- cost = 50
+ description = "Send a specialised pulse to detonate all hand-held and exosuit Rapid Cconstruction Devices on the station."
+ cost = 25
+ one_time = 1
power_type = /mob/living/silicon/ai/proc/disable_rcd
/mob/living/silicon/ai/proc/disable_rcd()
set category = "Malfunction"
- set name = "Disable RCDs"
+ set name = "Destroy RCDs"
+ set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs."
- if(!canUseTopic())
+ if(!canUseTopic() || malf_cooldown)
return
- for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules)
- if(rcdmod.uses > 0)
- rcdmod.uses --
- for(var/obj/item/weapon/rcd/rcd in world)
- rcd.disabled = 1
- for(var/obj/item/mecha_parts/mecha_equipment/rcd/rcd in world)
- rcd.disabled = 1
- src << "Out of uses."
+ for(var/obj/item/RCD in rcd_list)
+ if(!istype(RCD, /obj/item/weapon/rcd/borg)) //Ensures that cyborg RCDs are spared.
+ RCD.audible_message("[RCD] begins to vibrate and buzz loudly!","[RCD] begins vibrating violently!")
+ spawn(50) //5 seconds to get rid of it!
+ if(RCD) //Make sure it still exists (In case of chain-reaction)
+ explosion(RCD, 0, 0, 3, 1, flame_range = 1)
+ qdel(RCD)
+
+ src << "RCD detonation pulse emitted."
+ malf_cooldown = 1
+ spawn(100)
+ malf_cooldown = 0
/datum/AI_Module/large/mecha_domination
module_name = "Viral Mech Domination"
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 5a88c2e0525..6c6c06e84c5 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -286,24 +286,12 @@
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
var/text = "
The malfunctioning AIs were:"
var/module_text_temp = "
Purchased modules:
" //Added at the end
-
for(var/datum/mind/malf in malf_ai)
-
- text += "
[malf.key] was [malf.name] ("
+ text += printplayer(malf, 1)
if(malf.current)
- if(malf.current.stat == DEAD)
- text += "deactivated"
- else
- text += "operational"
- if(malf.current.real_name != malf.name)
- text += " as [malf.current.real_name]"
var/mob/living/silicon/ai/AI = malf.current
for(var/datum/AI_Module/mod in AI.current_modules)
module_text_temp += mod.module_name + "
"
- else
- text += "hardware destroyed"
- text += ")"
text += module_text_temp
-
world << text
return 1
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index c2293ae5c54..2ddf8698ca5 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -121,7 +121,7 @@
/obj/effect/meteor/Destroy()
walk(src,0) //this cancels the walk_towards() proc
- ..()
+ return ..()
/obj/effect/meteor/New()
..()
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index ceb70737d79..939cce46b06 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -278,36 +278,18 @@
/datum/game_mode/proc/auto_declare_completion_nuclear()
if( syndicates.len || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)) )
var/text = "
The syndicate operatives were:"
-
var/purchases = ""
var/TC_uses = 0
-
for(var/datum/mind/syndicate in syndicates)
-
- text += "
[syndicate.key] was [syndicate.name] ("
- if(syndicate.current)
- if(syndicate.current.stat == DEAD)
- text += "died"
- else
- text += "survived"
- if(syndicate.current.real_name != syndicate.name)
- text += " as [syndicate.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
-
+ text += printplayer(syndicate)
for(var/obj/item/device/uplink/H in world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==syndicate.key)
TC_uses += H.used_TC
purchases += H.purchase_log
-
text += "
"
-
text += "(Syndicates used [TC_uses] TC) [purchases]"
-
if(TC_uses==0 && station_was_nuked && !are_operatives_dead())
text += "
"
-
world << text
return 1
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 2d145a525d4..4f0cf352abd 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -14,7 +14,7 @@
/obj/item/weapon/pinpointer/Destroy()
active = 0
- ..()
+ return ..()
/obj/item/weapon/pinpointer/attack_self()
if(!active)
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index f2b121456ff..0da1f7b219b 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -128,6 +128,7 @@
var/obj/item/device/flash/T = new(mob)
var/obj/item/toy/crayon/spraycan/R = new(mob)
+ var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -137,10 +138,16 @@
"right hand" = slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(T, slots)
+ var/where2 = mob.equip_in_one_of_slots(C, slots)
mob.equip_in_one_of_slots(R,slots)
mob.update_icons()
+ if (!where2)
+ mob << "The Syndicate were unfortunately unable to get you a chameleon security HUD."
+ else
+ mob << "The chameleon security HUD in your [where2] will help you keep track of who is loyalty-implanted, and unable to be recruited."
+
if (!where)
mob << "The Syndicate were unfortunately unable to get you a flash."
else
@@ -314,16 +321,15 @@
/datum/game_mode/revolution/declare_completion()
if(finished == 1)
feedback_set_details("round_end_result","win - heads killed")
- world << "The heads of staff were killed or exiled! The revolutionaries win!"
+ world << "The heads of staff were killed or exiled! The revolutionaries win!"
else if(finished == 2)
feedback_set_details("round_end_result","loss - rev heads killed")
- world << "The heads of staff managed to stop the revolution!"
+ world << "The heads of staff managed to stop the revolution!"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_revolution()
var/list/targets = list()
-
if(head_revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution))
var/num_revs = 0
var/num_survivors = 0
@@ -333,78 +339,28 @@
if(survivor.mind)
if((survivor.mind in head_revolutionaries) || (survivor.mind in revolutionaries))
num_revs++
-
if(num_survivors)
world << "[TAB]Command's Approval Rating: [100 - round((num_revs/num_survivors)*100, 0.1)]%" // % of loyal crew
-
var/text = "
The head revolutionaries were:"
-
for(var/datum/mind/headrev in head_revolutionaries)
- text += "
[headrev.key] was [headrev.name] ("
- if(headrev.current)
- if(headrev.current.stat == DEAD)
- text += "died"
- else if(headrev.current.z > ZLEVEL_STATION)
- text += "fled the station"
- else
- text += "survived the revolution"
- if(headrev.current.real_name != headrev.name)
- text += " as [headrev.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
-
- for(var/datum/objective/mutiny/objective in headrev.objectives)
- targets |= objective.target
+ text += printplayer(headrev, 1)
text += "
"
-
world << text
if(revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution))
var/text = "
The revolutionaries were:"
-
for(var/datum/mind/rev in revolutionaries)
- text += "
[rev.key] was [rev.name] ("
- if(rev.current)
- if(rev.current.stat == DEAD || isbrain(rev.current))
- text += "died"
- else if(rev.current.z > ZLEVEL_STATION)
- text += "fled the station"
- else
- text += "survived the revolution"
- if(rev.current.real_name != rev.name)
- text += " as [rev.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
+ text += printplayer(rev, 1)
text += "
"
-
world << text
-
if( head_revolutionaries.len || revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution) )
var/text = "
The heads of staff were:"
-
var/list/heads = get_all_heads()
for(var/datum/mind/head in heads)
var/target = (head in targets)
if(target)
- text += ""
- text += "
[head.key] was [head.name] ("
- if(head.current)
- if(head.current.stat == DEAD || isbrain(head.current))
- text += "died"
- else if(head.current.z > ZLEVEL_STATION)
- text += "fled the station"
- else
- text += "survived the revolution"
- if(head.current.real_name != head.name)
- text += " as [head.current.real_name]"
- else
- text += "body destroyed"
- text += ")"
- if(target)
- text += ""
+ text += "Target"
+ text += printplayer(head, 1)
text += "
"
-
world << text
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index acb36b6e0be..394cbd35bd8 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -1,6 +1,7 @@
#define LIGHT_DAM_THRESHOLD 4
#define LIGHT_HEAL_THRESHOLD 2
#define LIGHT_DAMAGE_TAKEN 7
+
/*
SHADOWLING: A gamemode based on previously-run events
@@ -14,7 +15,7 @@ The game will end under two conditions:
Shadowling strengths:
- The dark
- - Hard vacuum (They are not affected by it)
+ - Hard vacuum (They are not affected by it, but are affected by starlight!)
- Their thralls who are not harmed by the light
- Stealth
@@ -22,8 +23,7 @@ Shadowling weaknesses:
- The light
- Fire
- Enemy numbers
- - Lasers (Lasers are concentrated light and do more damage)
- - Flashbangs (High stun and high burn damage; if the light stuns humans, you bet your ass it'll hurt the shadowling very much!)
+ - Burn-based weapons and items (flashbangs, lasers, etc.)
Shadowlings start off disguised as normal crew members, and they only have two abilities: Hatch and Enthrall.
They can still enthrall and perhaps complete their objectives in this form.
@@ -76,7 +76,7 @@ Made by Xhuis
/datum/game_mode/shadowling/announce()
world << "The current game mode is - Shadowling!"
- world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding."
+ world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding."
/datum/game_mode/shadowling/pre_setup()
if(config.protect_roles_from_antagonist)
@@ -104,7 +104,7 @@ Made by Xhuis
log_game("[shadow.key] (ckey) has been selected as a Shadowling.")
sleep(10)
shadow.current << "
"
- shadow.current << "You are a shadowling!"
+ shadow.current << "You are a shadowling!"
greet_shadow(shadow)
finalize_shadowling(shadow)
process_shadow_objectives(shadow)
@@ -113,7 +113,7 @@ Made by Xhuis
return
/datum/game_mode/proc/greet_shadow(datum/mind/shadow)
- shadow.current << "Currently, you are disguised as an employee aboard [world.name]."
+ shadow.current << "Currently, you are disguised as an employee aboard [station_name()]]."
shadow.current << "In your limited state, you have three abilities: Enthrall, Hatch, and Hivemind Commune."
shadow.current << "Any other shadowlings are you allies. You must assist them as they shall assist you."
shadow.current << "If you are new to shadowling, or want to read about abilities, check the wiki page at https://tgstation13.org/wiki/Shadowling
"
@@ -195,13 +195,13 @@ Made by Xhuis
/datum/game_mode/shadowling/declare_completion()
if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X
- world << "The shadowlings have ascended and taken over the station!"
+ world << "The shadowlings have ascended and taken over the station!"
else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round
- world << "The shadowlings have been killed by the crew!"
+ world << "The shadowlings have been killed by the crew!"
else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
- world << "The crew escaped the station before the shadowlings could ascend!"
+ world << "The crew escaped the station before the shadowlings could ascend!"
else
- world << "The shadowlings have failed!"
+ world << "The shadowlings have failed!"
..()
return 1
@@ -232,7 +232,7 @@ Made by Xhuis
id = "shadowling"
say_mod = "chitters"
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash
- burnmod = 1.5 //1.5x burn damage, 2x is excessive
+ burnmod = 1.5 //1.5x burn damage, 2x is excessive
heatmod = 1.5
/datum/species/shadow/ling/spec_life(mob/living/carbon/human/H)
@@ -254,6 +254,29 @@ Made by Xhuis
H.SetWeakened(0)
H.SetStunned(0)
+/datum/species/shadow/ling/lesser //Empowered thralls. Obvious, but powerful
+ name = "Lesser Shadowling"
+ id = "l_shadowling"
+ say_mod = "chitters"
+ specflags = list(NOBREATH,NOBLOOD,RADIMMUNE)
+ burnmod = 1.1
+ heatmod = 1.1
+
+/datum/species/shadow/ling/lesser/spec_life(mob/living/carbon/human/H)
+ if(!H.weakeyes) H.weakeyes = 1
+ var/light_amount = 0
+ H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry
+ if(isturf(H.loc))
+ var/turf/T = H.loc
+ light_amount = T.get_lumcount()
+ if(light_amount > LIGHT_DAM_THRESHOLD && !H.incorporeal_move)
+ H.take_overall_damage(0, LIGHT_DAMAGE_TAKEN/2)
+ else if (light_amount < LIGHT_HEAL_THRESHOLD)
+ H.heal_overall_damage(2,2)
+ H.adjustToxLoss(-5)
+ H.adjustBrainLoss(-25)
+ H.adjustCloneLoss(-1)
+
/datum/game_mode/proc/update_shadow_icons_added(datum/mind/shadow_mind)
var/datum/atom_hud/antag/shadow_hud = huds[ANTAG_HUD_SHADOW]
shadow_hud.join_hud(shadow_mind.current)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 9a8b8ab9482..eb0a55a9ee9 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -1,6 +1,9 @@
+#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.dna.species.id == "shadowling" && is_shadow(H)) return 1
+ if(H.dna.species.id == "l_shadowling" && is_thrall(H)) return 1
if(!is_shadow_or_thrall(usr)) usr << "You can't wrap your head around how to do this."
else if(is_thrall(usr)) usr << "You aren't powerful enough to do this."
else if(is_shadow(usr)) usr << "Your telepathic ability is suppressed. Hatch or regenerate first."
@@ -171,7 +174,7 @@
/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets)
var/mob/living/carbon/human/user = usr
listclearnulls(ticker.mode.thralls)
- if(!shadowling_check(usr)) return
+ if(!(usr.mind in ticker.mode.shadows)) return
if(user.dna.species.id != "shadowling")
if(ticker.mode.thralls.len >= 5)
user << "With your telepathic abilities suppressed, your human form will not allow you to enthrall any others. Hatch first."
@@ -229,7 +232,7 @@
for(var/obj/item/weapon/implant/loyalty/L in target)
if(L && L.implanted)
qdel(L)
- target << "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies. You feel a sense of liberation which is quickly stifled by terror."
+ target << "Your unwavering loyalty to Nanotrasen unexpectedly falters, dims, dies."
if(3)
usr << "You begin rearranging [target]'s memories."
usr.visible_message("[usr]'s eyes flare brightly.")
@@ -511,46 +514,96 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
/obj/effect/proc_holder/spell/targeted/revive_thrall //Completely revives a dead thrall
name = "Black Recuperation"
- desc = "Brings a dead thrall back to life."
+ desc = "Revives or empowers a thrall."
panel = "Shadowling Abilities"
range = 1
- charge_max = 3000
+ charge_max = 600
clothes_req = 0
include_user = 0
action_icon_state = "revive_thrall"
- var/list/thralls_in_world = list()
/obj/effect/proc_holder/spell/targeted/revive_thrall/cast(list/targets)
if(!shadowling_check(usr))
charge_counter = charge_max
return
for(var/mob/living/carbon/human/thrallToRevive in targets)
- if(!is_thrall(thrallToRevive))
- usr << "[thrallToRevive] is not a thrall."
- charge_counter = charge_max
- return
- if(thrallToRevive.stat != DEAD)
- usr << "[thrallToRevive] is not dead."
- charge_counter = charge_max
- return
- usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \
- "You crouch over the body of your thrall and begin gathering energy...")
- thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.")
- if(!do_mob(usr, thrallToRevive, 30))
- usr << "Your concentration snaps. The flow of energy ebbs."
- charge_counter= charge_max
- return
- usr << "You release a massive surge of power into [thrallToRevive]!"
- usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!")
- playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
- playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
- sleep(10)
- thrallToRevive.revive()
- thrallToRevive.visible_message("[thrallToRevive] draws in a huge breath, blinding violet light shining from their eyes.", \
- "You have returned. One of your masters has brought you from the darkness beyond.")
- thrallToRevive.Weaken(4)
- thrallToRevive.emote("gasp")
- playsound(thrallToRevive, "bodyfall", 50, 1)
+ var/choice = alert(usr,"Empower a living thrall or revive a dead one?",,"Empower","Revive","Cancel")
+ switch(choice)
+ if("Empower")
+ if(!is_thrall(thrallToRevive))
+ usr << "[thrallToRevive] is not a thrall."
+ charge_counter = charge_max
+ return
+ if(thrallToRevive.stat != CONSCIOUS)
+ usr << "[thrallToRevive] must be conscious to become empowered."
+ charge_counter = charge_max
+ return
+ var/empowered_thralls = 0
+ for(var/datum/mind/M in ticker.mode.thralls)
+ if(!ishuman(M.current))
+ return
+ var/mob/living/carbon/human/H = M.current
+ if(H.dna.species.id == "l_shadowling")
+ empowered_thralls++
+ if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
+ usr << "You cannot spare this much energy. There are too many empowered thralls."
+ charge_counter = charge_max
+ return
+ usr.visible_message("[usr] places their hands over [thrallToRevive]'s face, red light shining from beneath.", \
+ "You place your hands on [thrallToRevive]'s face and begin gathering energy...")
+ thrallToRevive << "[usr] places their hands over your face. You feel energy gathering. Stand still..."
+ if(!do_mob(usr, thrallToRevive, 80))
+ usr << "Your concentration snaps. The flow of energy ebbs."
+ charge_counter = charge_max
+ return
+ usr << "You release a massive surge of power into [thrallToRevive]!"
+ usr.visible_message("Red lightning surges into [thrallToRevive]'s face!")
+ playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
+ playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
+ usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
+ thrallToRevive.Weaken(5)
+ thrallToRevive.visible_message("[thrallToRevive] collapses, their skin and face distorting!", \
+ "AAAAAAAAAAAAAAAAAAAGH-")
+ sleep(20)
+ thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \
+ "You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
+ darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.")
+ hardset_dna(thrallToRevive, null, null, null, null, /datum/species/shadow/ling/lesser)
+ thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
+ thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
+ thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
+ thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null))
+ if("Revive")
+ if(!is_thrall(thrallToRevive))
+ usr << "[thrallToRevive] is not a thrall."
+ charge_counter = charge_max
+ return
+ if(thrallToRevive.stat != DEAD)
+ usr << "[thrallToRevive] is not dead."
+ charge_counter = charge_max
+ return
+ usr.visible_message("[usr] kneels over [thrallToRevive], placing their hands on \his chest.", \
+ "You crouch over the body of your thrall and begin gathering energy...")
+ thrallToRevive.notify_ghost_cloning("Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.")
+ if(!do_mob(usr, thrallToRevive, 30))
+ usr << "Your concentration snaps. The flow of energy ebbs."
+ charge_counter = charge_max
+ return
+ usr << "You release a massive surge of power into [thrallToRevive]!"
+ usr.visible_message("Red lightning surges from [usr]'s hands into [thrallToRevive]'s chest!")
+ playsound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)
+ playsound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)
+ usr.Beam(thrallToRevive,icon_state="red_lightning",icon='icons/effects/effects.dmi',time=1)
+ sleep(10)
+ thrallToRevive.revive()
+ thrallToRevive.visible_message("[thrallToRevive] heaves in breath, dim red light shining in their eyes.", \
+ "You have returned. One of your masters has brought you from the darkness beyond.")
+ thrallToRevive.Weaken(4)
+ thrallToRevive.emote("gasp")
+ playsound(thrallToRevive, "bodyfall", 50, 1)
+ else
+ charge_counter = charge_max
+ return
// THRALL ABILITIES BEYOND THIS POINT //
@@ -599,15 +652,8 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk/cast(list/targets)
for(var/mob/living/user in targets)
- var/lumcount = 0
- var/turf/T = user.loc
- lumcount = T.get_lumcount()
- if(lumcount > LIGHT_DAM_THRESHOLD)
- user << "It's too bright to do that!"
- charge_counter = charge_max
- return
user.visible_message("[user] suddenly fades away!", "You veil yourself in darkness, making you harder to see.")
- user.alpha = 20
+ user.alpha = 10
sleep(40)
user.visible_message("[user] appears from nowhere!", "Your shadowy guise slips away.")
user.alpha = initial(user.alpha)
@@ -621,7 +667,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
range = -1
include_user = 1
clothes_req = 0
- action_icon_state = "collective_mind"
+ action_icon_state = "darksight"
var/active = 0
/obj/effect/proc_holder/spell/targeted/thrall_vision/cast(list/targets)
@@ -831,7 +877,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
/obj/effect/proc_holder/spell/targeted/ascendant_transmit/cast(list/targets)
for(var/mob/living/user in targets)
- var/text = stripped_input(user, "What do you want to say to everything on and near [world.name]?.", "Transmit to World", "")
+ var/text = stripped_input(user, "What do you want to say to everything on and near [station_name()]?.", "Transmit to World", "")
if(!text)
return
world << "\"[text]\""
diff --git a/code/game/gamemodes/shadowling/shadowling_items.dm b/code/game/gamemodes/shadowling/shadowling_items.dm
index 1f81126f29b..b90e78b4bdf 100644
--- a/code/game/gamemodes/shadowling/shadowling_items.dm
+++ b/code/game/gamemodes/shadowling/shadowling_items.dm
@@ -77,11 +77,33 @@
item_state = null
origin_tech = null
vision_flags = SEE_MOBS
- darkness_view = 3
+ darkness_view = 1
invis_view = 2
flash_protect = -1
unacidable = 1
flags = ABSTRACT | NODROP
+ action_button_name = "Shift Nerves"
+ action_button_is_hands_free = 1
+ var/max_darkness_view = 8
+ var/min_darkness_view = 0
+
+/obj/item/clothing/glasses/night/shadowling/attack_self(mob/user)
+ if(!ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(H.dna.species.id != "shadowling")
+ user << "You aren't sure how to do this..."
+ return
+ var/new_dark_view
+ new_dark_view = (input(user, "Enter the radius of tiles to see with night vision.", "Night Vision", "[new_dark_view]") as num)
+ new_dark_view = Clamp(new_dark_view,min_darkness_view,max_darkness_view)
+ switch(new_dark_view)
+ if(0)
+ user << "Your night vision capabilities fade away for the time being."
+ else
+ user << "You shift your night vision capabilities to see [new_dark_view] tiles away."
+ darkness_view = new_dark_view
+ return
/obj/structure/shadow_vortex
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index e45a673a364..7d2d552ebd3 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -108,7 +108,7 @@
var/is_hijacker = prob(10)
var/martyr_chance = prob(20)
var/objective_count = is_hijacker //Hijacking counts towards number of objectives
- if(!exchange_blue && traitors.len >= 5) //Set up an exchange if there are enough traitors
+ if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors
if(!exchange_red)
exchange_red = traitor
else
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index c053983d4c0..304fe753788 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -204,7 +204,7 @@ var/global/list/multiverse = list()
/obj/item/weapon/multisword/Destroy()
multiverse.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/multisword/attack_self(mob/user)
if(user.mind.special_role == "apprentice")
@@ -505,9 +505,19 @@ var/global/list/multiverse = list()
return src.loc == user
/obj/item/voodoo/attack_self(mob/user)
- if(!target)
+ if(!target && possible.len)
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
return
+
+ if(user.zone_sel.selecting == "chest")
+ if(link)
+ target = null
+ link.loc = get_turf(src)
+ user << "You remove the [link] from the doll."
+ link = null
+ update_targets()
+ return
+
if(target && cooldown < world.time)
switch(user.zone_sel.selecting)
if("mouth")
@@ -542,13 +552,6 @@ var/global/list/multiverse = list()
target.Dizzy(10)
target << "You suddenly feel as if your head was hit with a hammer!"
GiveHint(target,user)
- if("chest")
- if(link)
- target = null
- link.loc = get_turf(src)
- user << "You remove the [link] from the doll."
- link = null
- update_targets()
cooldown = world.time + cooldown_time
/obj/item/voodoo/proc/update_targets()
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 6ed742e75a4..c500f390b6a 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -36,9 +36,9 @@
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
log_game("[wizard.key] (ckey) has been selected as a Wizard")
- forge_wizard_objectives(wizard)
//learn_basic_spells(wizard.current)
equip_wizard(wizard.current)
+ forge_wizard_objectives(wizard)
name_wizard(wizard.current)
greet_wizard(wizard)
if(use_huds)
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index 057bc5b6adb..77d87856371 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -24,7 +24,7 @@
if(Beacon)
qdel(Beacon)
Beacon = null
- ..()
+ return ..()
// update the invisibility and icon
/obj/machinery/bluespace_beacon/hide(intact)
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index bc593f7fc69..ece732690c3 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -95,7 +95,7 @@
/obj/machinery/door/airlock/Destroy()
if(frequency && radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi'
@@ -168,4 +168,4 @@
/obj/machinery/airlock_sensor/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm
index 8566d6c45a1..692bf7faceb 100644
--- a/code/game/machinery/announcement_system.dm
+++ b/code/game/machinery/announcement_system.dm
@@ -65,7 +65,7 @@ var/list/announcement_systems = list()
/obj/machinery/announcement_system/Destroy()
announcement_systems -= src //"OH GOD WHY ARE THERE 100,000 LISTED ANNOUNCEMENT SYSTEMS?!!"
- ..()
+ return ..()
/obj/machinery/announcement_system/power_change()
..()
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 38cc653cda8..1c71111943c 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -81,7 +81,7 @@
SSair.atmos_machinery -= src
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/////////////////////////////////////////////////////////////
// GENERAL AIR CONTROL (a.k.a atmos computer)
@@ -180,7 +180,7 @@
/obj/machinery/computer/general_air_control/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
- ..()
+ return ..()
/obj/machinery/computer/general_air_control/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 5f6835bff24..b6175ef1c75 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -21,7 +21,7 @@
/obj/machinery/meter/Destroy()
SSair.atmos_machinery -= src
src.target = null
- ..()
+ return ..()
/obj/machinery/meter/initialize()
if (!target)
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index e484b42e4c3..17580deedec 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -30,7 +30,7 @@
/obj/machinery/portable_atmospherics/Destroy()
qdel(air_contents)
SSair.atmos_machinery -= src
- ..()
+ return ..()
/obj/machinery/portable_atmospherics/update_icon()
return null
diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm
index 7b3081092f1..deb83600c99 100644
--- a/code/game/machinery/atmoalter/zvent.dm
+++ b/code/game/machinery/atmoalter/zvent.dm
@@ -15,7 +15,7 @@
/obj/machinery/zvent/Destroy()
SSair.atmos_machinery -= src
- ..()
+ return ..()
/obj/machinery/zvent/process_atmos()
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index c7d00e16013..f488793ae12 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -113,7 +113,7 @@
/obj/machinery/bot/Destroy()
qdel(Radio)
qdel(botcard)
- ..()
+ return ..()
/obj/machinery/bot/proc/explode()
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index ea5613108f7..2cc3150b0ef 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -8,7 +8,7 @@
throwforce = 5.0
throw_speed = 2
throw_range = 5
- w_class = 3.0
+ w_class = 3.
var/created_name = "Cleanbot"
@@ -151,7 +151,7 @@ text("[on ? "On" : "Off"]"))
PoolOrNew(/obj/effect/effect/foam, loc)
else if (prob(5))
- visible_message("[src] makes an excited beeping booping sound!")
+ audible_message("[src] makes an excited beeping booping sound!")
if(!target) //Search for cleanables it can see.
target = scan(/obj/effect/decal/cleanable/)
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index 75194d08fcd..1322d1c4bad 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -216,7 +216,7 @@
nag()
if(prob(5))
- visible_message("[src] makes an excited booping beeping sound!")
+ audible_message("[src] makes an excited booping beeping sound!")
//Normal scanning procedure. We have tiles loaded, are not emagged.
if(!target && emagged < 2 && amount > 0)
@@ -289,7 +289,7 @@
F.break_tile_to_plating()
else
F.ReplaceWithLattice()
- visible_message("[src] makes an excited booping sound.")
+ audible_message("[src] makes an excited booping sound.")
spawn(50)
amount ++
anchored = 0
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index f7c760893ab..c7b408ca6f3 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -426,13 +426,13 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5)
/obj/machinery/bot/mulebot/proc/buzz(type)
switch(type)
if(SIGH)
- visible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
+ audible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.")
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
if(ANNOYED)
- visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.")
+ audible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.")
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
if(DELIGHT)
- visible_message("[src] makes a delighted ping!", "You hear a ping.")
+ audible_message("[src] makes a delighted ping!", "You hear a ping.")
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
@@ -725,7 +725,7 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5)
/obj/machinery/bot/mulebot/proc/at_target()
if(!reached_target)
radio_frequency = SUPP_FREQ //Supply channel
- visible_message("[src] makes a chiming sound!", "You hear a chime.")
+ audible_message("[src] makes a chiming sound!", "You hear a chime.")
playsound(loc, 'sound/machines/chime.ogg', 50, 0)
reached_target = 1
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index da1950f171f..4eb6a9df0fa 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -56,7 +56,7 @@
bug.current = null
bug = null
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
- ..()
+ return ..()
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 6a96b8ac0fb..d1b6e806a05 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -135,7 +135,7 @@
//This could all be done better, but it works for now.
/obj/machinery/computer/HolodeckControl/Destroy()
emergencyShutdown()
- ..()
+ return ..()
/obj/machinery/computer/HolodeckControl/emp_act(severity)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 223f9024d2b..c9c6c6e81b9 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -35,6 +35,7 @@
/obj/item/toy/griffin = 2,
/obj/item/weapon/coin/antagtoken = 2,
/obj/item/stack/tile/fakespace/loaded = 2,
+ /obj/item/toy/toy_xeno = 2,
)
/obj/machinery/computer/arcade/New()
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 58f1843dacb..99d2fdfe0de 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -20,7 +20,7 @@
/obj/machinery/computer/atmos_alert/Destroy()
if(radio_controller)
radio_controller.remove_object(src, receive_frequency)
- ..()
+ return ..()
/obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal)
if(!signal || signal.encryption) return
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index ead497ab43d..b70fd68b176 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -610,5 +610,5 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
/obj/machinery/computer/communications/Destroy()
shuttle_caller_list -= src
SSshuttle.autoEvac()
- ..()
+ return ..()
diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm
index 460adf2b0d8..7ddd08684d8 100644
--- a/code/game/machinery/computer/shuttle.dm
+++ b/code/game/machinery/computer/shuttle.dm
@@ -126,7 +126,7 @@
if(T)
if(istype(T, /turf/simulated/floor))
T.blocks_air = 0
- ..()
+ return ..()
/obj/machinery/computer/supplycomp
name = "supply shuttle console"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 8916254705a..06280cdb9ab 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -17,11 +17,18 @@
// Wires for the airlock are located in the datum folder, inside the wires datum folder.
+#define AIRLOCK_CLOSED 1
+#define AIRLOCK_CLOSING 2
+#define AIRLOCK_OPEN 3
+#define AIRLOCK_OPENING 4
+#define AIRLOCK_DENY 5
+#define AIRLOCK_EMAG 6
+var/list/airlock_overlays = list()
/obj/machinery/door/airlock
name = "airlock"
- icon = 'icons/obj/doors/Doorint.dmi'
- icon_state = "door_closed"
+ icon = 'icons/obj/doors/airlocks/station/public.dmi'
+ icon_state = "closed"
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
var/hackProof = 0 // if 1, this door can't be hacked by the AI
@@ -48,253 +55,23 @@
var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door
var/detonated = 0
+ var/airlock_material = null //material of inner filling; if its an airlock with glass, this should be set to "glass"
+ var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+
explosion_block = 1
-/obj/machinery/door/airlock/command
- icon = 'icons/obj/doors/Doorcom.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_com
-
-/obj/machinery/door/airlock/security
- icon = 'icons/obj/doors/Doorsec.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_sec
-
-/obj/machinery/door/airlock/engineering
- icon = 'icons/obj/doors/Dooreng.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_eng
-
-/obj/machinery/door/airlock/medical
- icon = 'icons/obj/doors/Doormed.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_med
-
-/obj/machinery/door/airlock/maintenance
- name = "maintenance access"
- icon = 'icons/obj/doors/Doormaint.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_mai
-
-/obj/machinery/door/airlock/external
- name = "external airlock"
- icon = 'icons/obj/doors/Doorext.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_ext
-
-/obj/machinery/door/airlock/glass
- name = "glass airlock"
- icon = 'icons/obj/doors/Doorglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_glass
- glass = 1
-
-/obj/machinery/door/airlock/centcom
- icon = 'icons/obj/doors/Doorele.dmi'
- opacity = 1
- doortype = /obj/structure/door_assembly/door_assembly_centcom
-
-/obj/machinery/door/airlock/vault
- name = "vault door"
- icon = 'icons/obj/doors/vault.dmi'
- opacity = 1
- doortype = /obj/structure/door_assembly/door_assembly_vault
- explosion_block = 2
-
-/obj/machinery/door/airlock/glass_large
- name = "glass airlock"
- icon = 'icons/obj/doors/Door2x1glassfull.dmi'
- opacity = 0
- doortype = null //(double glass door) there's no door assembly sprites for this one.
- glass = 1
- bound_width = 64 // 2x1
-
-/obj/machinery/door/airlock/freezer
- name = "freezer airlock"
- icon = 'icons/obj/doors/Doorfreezer.dmi'
- opacity = 1
- doortype = /obj/structure/door_assembly/door_assembly_fre
-
-/obj/machinery/door/airlock/hatch
- name = "airtight hatch"
- icon = 'icons/obj/doors/Doorhatchele.dmi'
- opacity = 1
- doortype = /obj/structure/door_assembly/door_assembly_hatch
-
-/obj/machinery/door/airlock/maintenance_hatch
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorhatchmaint2.dmi'
- opacity = 1
- doortype = /obj/structure/door_assembly/door_assembly_mhatch
-
-/obj/machinery/door/airlock/glass_command
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorcomglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_com/glass
- glass = 1
-
-/obj/machinery/door/airlock/glass_engineering
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorengglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_eng/glass
- glass = 1
-
-/obj/machinery/door/airlock/glass_security
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorsecglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_sec/glass
- glass = 1
-
-/obj/machinery/door/airlock/glass_medical
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doormedglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_med/glass
- glass = 1
-
-/obj/machinery/door/airlock/mining
- name = "mining airlock"
- icon = 'icons/obj/doors/Doormining.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_min
-
-/obj/machinery/door/airlock/atmos
- name = "atmospherics airlock"
- icon = 'icons/obj/doors/Dooratmo.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_atmo
-
-/obj/machinery/door/airlock/research
- icon = 'icons/obj/doors/Doorresearch.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_research
-
-/obj/machinery/door/airlock/glass_research
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorresearchglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_research/glass
- glass = 1
-
-/obj/machinery/door/airlock/glass_mining
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Doorminingglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_min/glass
- glass = 1
-
-/obj/machinery/door/airlock/glass_atmos
- name = "maintenance hatch"
- icon = 'icons/obj/doors/Dooratmoglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_atmo/glass
- glass = 1
-
-/obj/machinery/door/airlock/gold
- name = "gold airlock"
- icon = 'icons/obj/doors/Doorgold.dmi'
- var/mineral = "gold"
- doortype = /obj/structure/door_assembly/door_assembly_gold
-
-/obj/machinery/door/airlock/silver
- name = "silver airlock"
- icon = 'icons/obj/doors/Doorsilver.dmi'
- var/mineral = "silver"
- doortype = /obj/structure/door_assembly/door_assembly_silver
-
-/obj/machinery/door/airlock/diamond
- name = "diamond airlock"
- icon = 'icons/obj/doors/Doordiamond.dmi'
- var/mineral = "diamond"
- doortype = /obj/structure/door_assembly/door_assembly_diamond
-
-/obj/machinery/door/airlock/uranium
- name = "uranium airlock"
- desc = "And they said I was crazy."
- icon = 'icons/obj/doors/Dooruranium.dmi'
- var/mineral = "uranium"
- doortype = /obj/structure/door_assembly/door_assembly_uranium
- var/last_event = 0
-
-/obj/machinery/door/airlock/uranium/process()
- if(world.time > last_event+20)
- if(prob(50))
- radiate()
- last_event = world.time
+/obj/machinery/door/airlock/New()
..()
-
-/obj/machinery/door/airlock/uranium/proc/radiate()
- for(var/mob/living/L in range (3,src))
- L.irradiate(15)
- return
-
-/obj/machinery/door/airlock/plasma
- name = "plasma airlock"
- desc = "No way this can end badly."
- icon = 'icons/obj/doors/Doorplasma.dmi'
- var/mineral = "plasma"
- doortype = /obj/structure/door_assembly/door_assembly_plasma
-
-/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- PlasmaBurn(exposed_temperature)
-
-/obj/machinery/door/airlock/plasma/proc/ignite(exposed_temperature)
- if(exposed_temperature > 300)
- PlasmaBurn(exposed_temperature)
-
-/obj/machinery/door/airlock/plasma/proc/PlasmaBurn(temperature)
- atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500)
- new/obj/structure/door_assembly/door_assembly_0( src.loc )
- qdel(src)
-
-/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~
- return 0
-
-/obj/machinery/door/airlock/clown
- name = "bananium airlock"
- desc = "Honkhonkhonk"
- icon = 'icons/obj/doors/Doorbananium.dmi'
- var/mineral = "bananium"
- doortype = /obj/structure/door_assembly/door_assembly_clown
-
-/obj/machinery/door/airlock/sandstone
- name = "sandstone airlock"
- icon = 'icons/obj/doors/Doorsand.dmi'
- var/mineral = "sandstone"
- doortype = /obj/structure/door_assembly/door_assembly_sandstone
-
-/obj/machinery/door/airlock/science
- icon = 'icons/obj/doors/Doorsci.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_science
-
-/obj/machinery/door/airlock/glass_science
- name = "glass airlock"
- icon = 'icons/obj/doors/Doorsciglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_science/glass
- glass = 1
-
-/obj/machinery/door/airlock/highsecurity
- name = "high tech security airlock"
- icon = 'icons/obj/doors/hightechsecurity.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_highsecurity
- explosion_block = 2
-
-/obj/machinery/door/airlock/shuttle
- name = "shuttle airlock"
- icon = 'icons/obj/doors/doorshuttle.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_shuttle
-
-/obj/machinery/door/airlock/wood
- name = "wooden airlock"
- icon = 'icons/obj/doors/Doorwood.dmi'
- var/mineral = "wood"
- doortype = /obj/structure/door_assembly/door_assembly_wood
-
-/obj/machinery/door/airlock/virology
- icon = 'icons/obj/doors/Doorviro.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_viro
-
-/obj/machinery/door/airlock/glass_virology
- icon = 'icons/obj/doors/Doorviroglass.dmi'
- opacity = 0
- doortype = /obj/structure/door_assembly/door_assembly_viro/glass
- glass = 1
+ wires = new(src)
+ if(src.closeOtherId != null)
+ spawn (5)
+ for (var/obj/machinery/door/airlock/A in airlocks)
+ if(A.closeOtherId == src.closeOtherId && A != src)
+ src.closeOther = A
+ break
+ if(glass)
+ airlock_material = "glass"
+ update_icon()
/*
About the new airlock wires panel:
@@ -439,47 +216,108 @@ About the new airlock wires panel:
else
return 0
+/obj/machinery/door/airlock/update_icon(state=0)
+ switch(state)
+ if(0)
+ if(density)
+ state = AIRLOCK_CLOSED
+ else
+ state = AIRLOCK_OPEN
+ icon_state = ""
+ if(AIRLOCK_OPEN, AIRLOCK_CLOSED)
+ icon_state = ""
+ if(AIRLOCK_DENY, AIRLOCK_OPENING, AIRLOCK_CLOSING, AIRLOCK_EMAG)
+ icon_state = "nonexistenticonstate" //MADNESS
+ set_airlock_overlays(state)
-/obj/machinery/door/airlock/update_icon()
- if(overlays) overlays.Cut()
- if(density)
- if(locked && lights)
- icon_state = "door_locked"
- else
- icon_state = "door_closed"
- if(p_open || welded || emergency)
- overlays = list()
+/obj/machinery/door/airlock/proc/set_airlock_overlays(state)
+ var/image/frame_overlay
+ var/image/filling_overlay
+ var/image/lights_overlay
+ var/image/panel_overlay
+ var/image/weld_overlay
+ var/image/sparks_overlay
+
+ switch(state)
+ if(AIRLOCK_CLOSED)
+ frame_overlay = get_airlock_overlay("closed", icon)
+ if(airlock_material)
+ filling_overlay = get_airlock_overlay("[airlock_material]_closed", overlays_file)
+ else
+ filling_overlay = get_airlock_overlay("fill_closed", icon)
if(p_open)
- overlays += image(icon, "panel_open")
+ panel_overlay = get_airlock_overlay("panel_closed", overlays_file)
if(welded)
- overlays += image(icon, "welded")
- if(emergency && !locked)
- overlays += image(icon, "elights")
- else
- icon_state = "door_open"
+ weld_overlay = get_airlock_overlay("welded", overlays_file)
+ if(lights)
+ if(locked)
+ lights_overlay = get_airlock_overlay("lights_bolts", overlays_file)
+ else if(emergency)
+ lights_overlay = get_airlock_overlay("lights_emergency", overlays_file)
+ if(AIRLOCK_DENY)
+ overlays += get_airlock_overlay("lights_denied", overlays_file)
+ sleep(4)
+ update_icon(AIRLOCK_CLOSED)
+ return
+ if(AIRLOCK_EMAG)
+ overlays += get_airlock_overlay("sparks", overlays_file)
+ return
- return
+ if(AIRLOCK_CLOSING)
+ frame_overlay = get_airlock_overlay("closing", icon)
+ if(airlock_material)
+ filling_overlay = get_airlock_overlay("[airlock_material]_closing", overlays_file)
+ else
+ filling_overlay = get_airlock_overlay("fill_closing", icon)
+ if(lights)
+ lights_overlay = get_airlock_overlay("lights_closing", overlays_file)
+ if(p_open)
+ panel_overlay = get_airlock_overlay("panel_closing", overlays_file)
+
+ if(AIRLOCK_OPEN)
+ frame_overlay = get_airlock_overlay("open", icon)
+ if(airlock_material)
+ filling_overlay = get_airlock_overlay("[airlock_material]_open", overlays_file)
+ else
+ filling_overlay = get_airlock_overlay("fill_open", icon)
+ if(p_open)
+ panel_overlay = get_airlock_overlay("panel_open", overlays_file)
+
+ if(AIRLOCK_OPENING)
+ frame_overlay = get_airlock_overlay("opening", icon)
+ if(airlock_material)
+ filling_overlay = get_airlock_overlay("[airlock_material]_opening", overlays_file)
+ else
+ filling_overlay = get_airlock_overlay("fill_opening", icon)
+ if(lights)
+ lights_overlay = get_airlock_overlay("lights_opening", overlays_file)
+ if(p_open)
+ panel_overlay = get_airlock_overlay("panel_opening", overlays_file)
+
+ overlays.Cut()
+ overlays += frame_overlay
+ overlays += filling_overlay
+ overlays += lights_overlay
+ overlays += panel_overlay
+ overlays += weld_overlay
+ overlays += sparks_overlay
+
+/proc/get_airlock_overlay(icon_state, icon_file)
+ var/iconkey = "[icon_state][icon_file]"
+ if(airlock_overlays[iconkey])
+ return airlock_overlays[iconkey]
+ airlock_overlays[iconkey] = image(icon_file, icon_state)
+ return airlock_overlays[iconkey]
/obj/machinery/door/airlock/do_animate(animation)
switch(animation)
if("opening")
- if(overlays) overlays.Cut()
- if(p_open)
- spawn(2) // The only work around that works. Downside is that the door will be gone for a millisecond.
- flick("o_door_opening", src) //can not use flick due to BYOND bug updating overlays right before flicking
- else
- flick("door_opening", src)
+ update_icon(AIRLOCK_OPENING)
if("closing")
- if(overlays) overlays.Cut()
- if(p_open)
- flick("o_door_closing", src)
- else
- flick("door_closing", src)
- if("spark")
- flick("door_spark", src)
+ update_icon(AIRLOCK_CLOSING)
if("deny")
- flick("door_deny", src)
- return
+ update_icon(AIRLOCK_DENY)
+ icon_state = "closed"
/obj/machinery/door/airlock/examine(mob/user)
..()
@@ -917,6 +755,9 @@ About the new airlock wires panel:
if(istype(C, /obj/item/device/detective_scanner))
return
+ if(istype(C, /obj/item/weapon/card/emag))
+ return
+
src.add_fingerprint(user)
if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density))
var/obj/item/weapon/weldingtool/W = C
@@ -1072,7 +913,7 @@ About the new airlock wires panel:
return 0
if(charge && !detonated)
p_open = 1
- update_icon()
+ update_icon(AIRLOCK_OPENING)
visible_message("[src]'s panel is blown off in a spray of deadly shrapnel!")
charge.ex_act(1)
detonated = 1
@@ -1097,14 +938,31 @@ About the new airlock wires panel:
else
playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1)
- if(autoclose && normalspeed)
+ if(autoclose && normalspeed)
spawn(150)
autoclose()
else if(autoclose && !normalspeed)
spawn(11)
autoclose()
- return ..()
+ if(!density)
+ return 1
+ if(!ticker)
+ return 0
+ operating = 1
+
+ do_animate("opening")
+ src.SetOpacity(0)
+ sleep(5)
+ src.density = 0
+ sleep(9)
+ src.layer = 2.7
+ update_icon()
+ SetOpacity(0)
+ operating = 0
+ air_update_turf(1)
+ update_freelook_sight()
+ return 1
/obj/machinery/door/airlock/close(forced=0)
@@ -1140,13 +998,13 @@ About the new airlock wires panel:
if(density)
return 1
operating = 1
- do_animate("closing")
+ update_icon(AIRLOCK_CLOSING)
src.layer = 3.1
sleep(5)
src.density = 1
if(!safe)
crush()
- sleep(5)
+ sleep(9)
update_icon()
if(visible && !glass)
SetOpacity(1)
@@ -1158,17 +1016,6 @@ About the new airlock wires panel:
open()
return 1
-/obj/machinery/door/airlock/New()
- ..()
- wires = new(src)
- if(src.closeOtherId != null)
- spawn (5)
- for (var/obj/machinery/door/airlock/A in world)
- if(A.closeOtherId == src.closeOtherId && A != src)
- src.closeOther = A
- break
-
-
/obj/machinery/door/airlock/proc/prison_open()
if(emagged) return
src.locked = 0
@@ -1192,75 +1039,63 @@ About the new airlock wires panel:
if(!W.can_use(user))
return
- if(glass == 1)
- //These airlocks have a glass version.
- var optionlist = list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining")
- var paintjob = input(user, "Please select a paintjob for this airlock.") in optionlist
- if((!in_range(src, usr) && src.loc != usr) || !W.use(user)) return
- switch(paintjob)
- if("Default")
- icon = 'icons/obj/doors/Doorglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_glass
- if("Engineering")
- icon = 'icons/obj/doors/Doorengglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_eng/glass
- if("Atmospherics")
- icon = 'icons/obj/doors/Dooratmoglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_atmo/glass
- if("Security")
- icon = 'icons/obj/doors/Doorsecglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_sec/glass
- if("Command")
- icon = 'icons/obj/doors/Doorcomglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_com/glass
- if("Medical")
- icon = 'icons/obj/doors/Doormedglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_med/glass
- if("Research")
- icon = 'icons/obj/doors/Doorresearchglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_research/glass
- if("Mining")
- icon = 'icons/obj/doors/Doorminingglass.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_min/glass
+ var/list/optionlist
+ if(airlock_material == "glass")
+ optionlist = list("Public", "Public2", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance")
else
- //These airlocks have a regular version.
- var optionlist = list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security")
- var paintjob = input(user, "Please select a paintjob for this airlock.") in optionlist
- if((!in_range(src, usr) && src.loc != usr) || !W.use(user)) return
- switch(paintjob)
- if("Default")
- icon = 'icons/obj/doors/Doorint.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_0
- if("Engineering")
- icon = 'icons/obj/doors/Dooreng.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_eng
- if("Atmospherics")
- icon = 'icons/obj/doors/Dooratmo.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_atmo
- if("Security")
- icon = 'icons/obj/doors/Doorsec.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_sec
- if("Command")
- icon = 'icons/obj/doors/Doorcom.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_com
- if("Medical")
- icon = 'icons/obj/doors/Doormed.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_med
- if("Research")
- icon = 'icons/obj/doors/Doorresearch.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_research
- if("Mining")
- icon = 'icons/obj/doors/Doormining.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_min
- if("Maintenance")
- icon = 'icons/obj/doors/Doormaint.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_mai
- if("External")
- icon = 'icons/obj/doors/Doorext.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_ext
- if("High Security")
- icon = 'icons/obj/doors/hightechsecurity.dmi'
- doortype = /obj/structure/door_assembly/door_assembly_highsecurity
+ optionlist = list("Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security")
+
+ var/paintjob = input(user, "Please select a paintjob for this airlock.") in optionlist
+ if((!in_range(src, usr) && src.loc != usr) || !W.use(user)) return
+ switch(paintjob)
+ if("Public")
+ icon = 'icons/obj/doors/airlocks/station/public.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_0
+ if("Public2")
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_glass
+ if("Engineering")
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_eng
+ if("Atmospherics")
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_atmo
+ if("Security")
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_sec
+ if("Command")
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_com
+ if("Medical")
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_med
+ if("Research")
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_research
+ if("Mining")
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_min
+ if("Maintenance")
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_mai
+ if("External")
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_ext
+ if("High Security")
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_highsecurity
update_icon()
/obj/machinery/door/airlock/CanAStarPass(obj/item/weapon/card/id/ID)
@@ -1270,4 +1105,16 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/HasProximity(atom/movable/AM as mob|obj)
for (var/obj/A in contents)
A.HasProximity(AM)
- return
\ No newline at end of file
+ return
+
+/obj/machinery/door/airlock/emag_act(mob/user)
+ if(density && hasPower() && !emagged)
+ update_icon(AIRLOCK_EMAG)
+ sleep(6)
+ open()
+ emagged = 1
+ desc = "Its access panel is smoking slightly."
+ lights = 0
+ locked = 1
+ loseMainPower()
+ loseBackupPower()
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
new file mode 100644
index 00000000000..e703f41c727
--- /dev/null
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -0,0 +1,298 @@
+/*
+ Station Airlocks Regular
+*/
+/obj/machinery/door/airlock/command
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_com
+
+/obj/machinery/door/airlock/security
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_sec
+
+/obj/machinery/door/airlock/engineering
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_eng
+
+/obj/machinery/door/airlock/medical
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_med
+
+/obj/machinery/door/airlock/maintenance
+ name = "maintenance access"
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_mai
+
+/obj/machinery/door/airlock/mining
+ name = "mining airlock"
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_min
+
+/obj/machinery/door/airlock/atmos
+ name = "atmospherics airlock"
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_atmo
+
+/obj/machinery/door/airlock/research
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_research
+
+/obj/machinery/door/airlock/freezer
+ name = "freezer airlock"
+ icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_fre
+
+/obj/machinery/door/airlock/science
+ icon = 'icons/obj/doors/airlocks/station/science.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_science
+
+/obj/machinery/door/airlock/virology
+ icon = 'icons/obj/doors/airlocks/station/virology.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_viro
+
+//////////////////////////////////
+/*
+ Station Airlocks Glass
+*/
+
+/obj/machinery/door/airlock/glass_command
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_com/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_engineering
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_eng/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_security
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_sec/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_medical
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_med/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_research
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_research/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_mining
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_min/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_atmos
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_atmo/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_science
+ icon = 'icons/obj/doors/airlocks/station/science.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_science/glass
+ glass = 1
+
+/obj/machinery/door/airlock/glass_virology
+ icon = 'icons/obj/doors/airlocks/station/virology.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_viro/glass
+ glass = 1
+
+//////////////////////////////////
+/*
+ Station Airlocks Mineral
+*/
+
+/obj/machinery/door/airlock/gold
+ name = "gold airlock"
+ icon = 'icons/obj/doors/airlocks/station/gold.dmi'
+ var/mineral = "gold"
+ doortype = /obj/structure/door_assembly/door_assembly_gold
+
+/obj/machinery/door/airlock/silver
+ name = "silver airlock"
+ icon = 'icons/obj/doors/airlocks/station/silver.dmi'
+ var/mineral = "silver"
+ doortype = /obj/structure/door_assembly/door_assembly_silver
+
+/obj/machinery/door/airlock/diamond
+ name = "diamond airlock"
+ icon = 'icons/obj/doors/airlocks/station/diamond.dmi'
+ var/mineral = "diamond"
+ doortype = /obj/structure/door_assembly/door_assembly_diamond
+
+/obj/machinery/door/airlock/uranium
+ name = "uranium airlock"
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'
+ var/mineral = "uranium"
+ doortype = /obj/structure/door_assembly/door_assembly_uranium
+ var/last_event = 0
+
+/obj/machinery/door/airlock/uranium/process()
+ if(world.time > last_event+20)
+ if(prob(50))
+ radiate()
+ last_event = world.time
+ ..()
+
+/obj/machinery/door/airlock/uranium/proc/radiate()
+ for(var/mob/living/L in range (3,src))
+ L.irradiate(15)
+ return
+
+/obj/machinery/door/airlock/plasma
+ name = "plasma airlock"
+ desc = "No way this can end badly."
+ icon = 'icons/obj/doors/airlocks/station/plasma.dmi'
+ var/mineral = "plasma"
+ doortype = /obj/structure/door_assembly/door_assembly_plasma
+
+/obj/machinery/door/airlock/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > 300)
+ PlasmaBurn(exposed_temperature)
+
+/obj/machinery/door/airlock/plasma/proc/ignite(exposed_temperature)
+ if(exposed_temperature > 300)
+ PlasmaBurn(exposed_temperature)
+
+/obj/machinery/door/airlock/plasma/proc/PlasmaBurn(temperature)
+ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 500)
+ new/obj/structure/door_assembly/door_assembly_0( src.loc )
+ qdel(src)
+
+/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~
+ return 0
+
+/obj/machinery/door/airlock/clown
+ name = "bananium airlock"
+ desc = "Honkhonkhonk"
+ icon = 'icons/obj/doors/airlocks/station/bananium.dmi'
+ var/mineral = "bananium"
+ doortype = /obj/structure/door_assembly/door_assembly_clown
+
+/obj/machinery/door/airlock/sandstone
+ name = "sandstone airlock"
+ icon = 'icons/obj/doors/airlocks/station/sandstone.dmi'
+ var/mineral = "sandstone"
+ doortype = /obj/structure/door_assembly/door_assembly_sandstone
+
+
+/obj/machinery/door/airlock/wood
+ name = "wooden airlock"
+ icon = 'icons/obj/doors/airlocks/station/wood.dmi'
+ var/mineral = "wood"
+ doortype = /obj/structure/door_assembly/door_assembly_wood
+
+//////////////////////////////////
+/*
+ Station2 Airlocks
+*/
+
+/obj/machinery/door/airlock/glass
+ name = "glass airlock"
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
+ opacity = 0
+ doortype = /obj/structure/door_assembly/door_assembly_glass
+ glass = 1
+
+//////////////////////////////////
+/*
+ External Airlocks
+*/
+
+/obj/machinery/door/airlock/external
+ name = "external airlock"
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_ext
+
+//////////////////////////////////
+/*
+ Centcom Airlocks
+*/
+
+/obj/machinery/door/airlock/centcom
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
+ opacity = 1
+ doortype = /obj/structure/door_assembly/door_assembly_centcom
+
+//////////////////////////////////
+/*
+ Vault Airlocks
+*/
+
+/obj/machinery/door/airlock/vault
+ name = "vault door"
+ icon = 'icons/obj/doors/airlocks/vault/vault.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi'
+ opacity = 1
+ doortype = /obj/structure/door_assembly/door_assembly_vault
+ explosion_block = 2
+
+//////////////////////////////////
+/*
+ Hatch Airlocks
+*/
+
+/obj/machinery/door/airlock/hatch
+ name = "airtight hatch"
+ icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ opacity = 1
+ doortype = /obj/structure/door_assembly/door_assembly_hatch
+
+/obj/machinery/door/airlock/maintenance_hatch
+ name = "maintenance hatch"
+ icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
+ opacity = 1
+ doortype = /obj/structure/door_assembly/door_assembly_mhatch
+
+//////////////////////////////////
+/*
+ High Security Airlocks
+*/
+
+/obj/machinery/door/airlock/highsecurity
+ name = "high tech security airlock"
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_highsecurity
+ explosion_block = 2
+
+//////////////////////////////////
+/*
+ Shuttle Airlocks
+*/
+
+/obj/machinery/door/airlock/shuttle
+ name = "shuttle airlock"
+ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
+ doortype = /obj/structure/door_assembly/door_assembly_shuttle
+
+
+//////////////////////////////////
+/*
+ Misc Airlocks
+*/
+
+/obj/machinery/door/airlock/glass_large
+ name = "glass airlock"
+ icon = 'icons/obj/doors/Door2x1glassfull.dmi'
+ opacity = 0
+ doortype = null //(double glass door) there's no door assembly sprites for this one.
+ glass = 1
+ bound_width = 64 // 2x1
diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm
index 0264ae95312..c8525f3520d 100644
--- a/code/game/machinery/doors/alarmlock.dm
+++ b/code/game/machinery/doors/alarmlock.dm
@@ -1,7 +1,8 @@
/obj/machinery/door/airlock/alarmlock
name = "glass alarm airlock"
- icon = 'icons/obj/doors/Doorglass.dmi'
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
opacity = 0
doortype = /obj/structure/door_assembly/door_assembly_glass
glass = 1
@@ -18,7 +19,7 @@
if(radio_controller)
radio_controller.remove_object(src,air_frequency)
air_connection = null
- ..()
+ return ..()
/obj/machinery/door/airlock/alarmlock/initialize()
..()
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 3d197f1e186..266da942cd9 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -65,7 +65,7 @@
if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access) || emergency == 1))
open()
else
- flick("door_deny", src)
+ do_animate("deny")
return
return
@@ -97,7 +97,7 @@
if(allowed(user) || src.emergency == 1)
open()
else
- flick("door_deny", src)
+ do_animate("deny")
return
@@ -135,24 +135,9 @@
close()
return
if(src.density)
- flick("door_deny", src)
+ do_animate("deny")
return
-/obj/machinery/door/emag_act(mob/user)
- if(density && hasPower() && !emagged)
- flick("door_spark", src)
- sleep(6)
- open()
- emagged = 1
- desc = "Its access panel is smoking slightly."
- if(istype(src, /obj/machinery/door/airlock))
- var/obj/machinery/door/airlock/A = src
- A.lights = 0
- A.locked = 1
- A.loseMainPower()
- A.loseBackupPower()
- A.update_icon()
-
/obj/machinery/door/blob_act()
if(prob(40))
qdel(src)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 60c5d6168f6..1e91c882e0d 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -24,7 +24,7 @@
if(health == 0)
playsound(src, "shatter", 70, 1)
electronics = null
- ..()
+ return ..()
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 4d4e84cb3b2..8608c14447e 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -15,7 +15,7 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/Destroy()
doppler_arrays -= src
- ..()
+ return ..()
/obj/machinery/doppler_array/process()
return PROCESS_KILL
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index 13c868ef183..e54e5254b8f 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -16,7 +16,7 @@
/obj/machinery/droneDispenser/Destroy()
SSmachine.processing -= src
- ..()
+ return ..()
/obj/machinery/droneDispenser/preloaded
metal = 5000
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index bba22799b5f..e8b978c7fec 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -118,7 +118,7 @@
for(var/obj/machinery/doorButtons/access_button/A in world)
if(A.controller == src)
A.controller = null
- ..()
+ return ..()
/obj/machinery/doorButtons/airlock_controller/Topic(href, href_list)
if(..())
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index bde8908cf70..6acfaafc359 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -77,7 +77,7 @@
/obj/machinery/embedded_controller/radio/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/machinery/embedded_controller/radio/initialize()
set_frequency(frequency)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 39f3f01ee08..56677d12e88 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -237,7 +237,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/holopad/Destroy()
for (var/mob/living/silicon/ai/master in masters)
clear_holo(master)
- ..()
+ return ..()
/*
Holographic project of everything else.
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index a4cdf6f6470..9f40cf0bf59 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -128,7 +128,7 @@ Class Procs:
SSmachine.processing -= src
if(occupant)
dropContents()
- ..()
+ return ..()
/obj/machinery/proc/locate_machinery()
return
@@ -336,6 +336,7 @@ Class Procs:
deconstruction()
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ transfer_fingerprints_to(M)
M.state = 2
M.icon_state = "box_1"
for(var/obj/item/I in component_parts)
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index 667f9735857..8a03f65b1d9 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -45,7 +45,7 @@
/obj/machinery/magnetic_module/Destroy()
if(radio_controller)
radio_controller.remove_object(src, freq)
- ..()
+ . = ..()
center = null
// update the invisibility and icon
@@ -244,7 +244,7 @@
/obj/machinery/magnetic_controller/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
- ..()
+ . = ..()
magnets = null
rpath = null
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index a49787b25c4..ee18baacda4 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -36,7 +36,7 @@
/obj/machinery/navbeacon/Destroy()
navbeacons &= src //Remove from beacon list, if in one.
deliverybeacons &= src
- ..()
+ return ..()
// set the transponder codes assoc list from codes_txt
/obj/machinery/navbeacon/proc/set_codes()
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 2d9b7f9db45..ac06d67bf1e 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -214,7 +214,7 @@ var/list/obj/machinery/newscaster/allCasters = list()
allCasters -= src
viewing_channel = null
photo = null
- ..()
+ return ..()
/obj/machinery/newscaster/update_icon()
if(!ispowered || isbroken)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 499198a49e3..78c2f6c826f 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -144,7 +144,7 @@
//deletes its own cover with it
qdel(cover)
cover = null
- ..()
+ return ..()
/obj/machinery/porta_turret/attack_ai(mob/user)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index ca1fe863e3b..033219ce433 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -19,7 +19,7 @@
opacity = 0
density = 0
air_update_turf(1)
- ..()
+ return ..()
/obj/machinery/shield/Move()
var/turf/T = loc
@@ -141,7 +141,7 @@
for(var/obj/machinery/shield/shield_tile in deployed_shields)
qdel(shield_tile)
deployed_shields = null
- ..()
+ return ..()
/obj/machinery/shieldgen/proc/shields_up()
@@ -500,7 +500,7 @@
src.cleanup(2)
src.cleanup(4)
src.cleanup(8)
- ..()
+ return ..()
/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj)
storedpower -= Proj.damage
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index a0110d2f25a..d3e952699f7 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -51,7 +51,7 @@
/obj/machinery/status_display/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
// timed process
diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm
index 2c102e8695b..395f15e7cfd 100644
--- a/code/game/machinery/syndicatebeacon.dm
+++ b/code/game/machinery/syndicatebeacon.dm
@@ -179,7 +179,7 @@
/obj/machinery/power/singularity_beacon/Destroy()
if(active)
Deactivate()
- ..()
+ return ..()
//stealth direct power usage
/obj/machinery/power/singularity_beacon/process()
diff --git a/code/game/machinery/telecomms/machines/broadcaster.dm b/code/game/machinery/telecomms/machines/broadcaster.dm
index 181d9a11bbf..91106eae92e 100644
--- a/code/game/machinery/telecomms/machines/broadcaster.dm
+++ b/code/game/machinery/telecomms/machines/broadcaster.dm
@@ -110,7 +110,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// In case message_delay is left on 1, otherwise it won't reset the list and people can't say the same thing twice anymore.
if(message_delay)
message_delay = 0
- ..()
+ return ..()
diff --git a/code/game/machinery/telecomms/machines/server.dm b/code/game/machinery/telecomms/machines/server.dm
index 8613a7bdad4..2a331406060 100644
--- a/code/game/machinery/telecomms/machines/server.dm
+++ b/code/game/machinery/telecomms/machines/server.dm
@@ -55,7 +55,7 @@
if(Compiler)
Compiler.GC()
Compiler = null
- ..()
+ return ..()
/obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from)
if(signal.data["message"])
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 361097145bb..37a8f60d35e 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -158,7 +158,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
for(var/obj/machinery/telecomms/comm in telecomms_list)
comm.links -= src
links = list()
- ..()
+ return ..()
// Used in auto linking
/obj/machinery/telecomms/proc/add_link(obj/machinery/telecomms/T)
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 4b0725b060c..0f1d2a3a154 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -25,7 +25,7 @@
if (power_station)
power_station.teleporter_console = null
power_station = null
- ..()
+ return ..()
/obj/machinery/computer/teleporter/proc/link_power_station()
if(power_station)
@@ -269,7 +269,7 @@
if (power_station)
power_station.teleporter_hub = null
power_station = null
- ..()
+ return ..()
/obj/machinery/teleport/hub/RefreshParts()
var/A = 0
@@ -391,7 +391,7 @@
if (teleporter_console)
teleporter_console.power_station = null
teleporter_console = null
- ..()
+ return ..()
/obj/machinery/teleport/station/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/multitool) && !panel_open)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 6429619a503..9bcbb941b7e 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -84,7 +84,7 @@
wires = null
qdel(coin)
coin = null
- ..()
+ return ..()
/obj/machinery/vending/snack/Destroy()
for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index e79e6666a7b..a179fe46635 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -30,7 +30,7 @@
/obj/mecha/combat/marauder/Destroy()
qdel(smoke_system)
smoke_system = null
- ..()
+ return ..()
/obj/mecha/combat/marauder/relaymove(mob/user,direction)
if(zoom)
diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm
index 9f6a67799ae..ac8c7e541d5 100644
--- a/code/game/mecha/equipment/tools/other_tools.dm
+++ b/code/game/mecha/equipment/tools/other_tools.dm
@@ -286,7 +286,7 @@
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/detach()
SSobj.processing.Remove(src)
@@ -378,7 +378,7 @@
/obj/item/mecha_parts/mecha_equipment/generator/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/mecha_parts/mecha_equipment/generator/proc/generator_init()
fuel = new /obj/item/stack/sheet/mineral/plasma(src)
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 6c7b8006e47..052b5a08353 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -195,16 +195,22 @@
energy_drain = 250
range = MELEE|RANGED
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
- var/disabled = 0 //malf
+
+/obj/item/mecha_parts/mecha_equipment/rcd/New()
+ rcd_list += src
+ ..()
+
+/obj/item/mecha_parts/mecha_equipment/rcd/Destroy()
+ rcd_list -= src
+ ..()
/obj/item/mecha_parts/mecha_equipment/rcd/action(atom/target)
- if(istype(target,/area/shuttle)||istype(target, /turf/space/transit))//>implying these are ever made -Sieve
- disabled = 1
- else
- disabled = 0
+ if(istype(target, /turf/space/transit))//>implying these are ever made -Sieve
+ return
+
if(!istype(target, /turf) && !istype(target, /obj/machinery/door/airlock))
target = get_turf(target)
- if(!action_checks(target) || disabled || get_dist(chassis, target)>3)
+ if(!action_checks(target) || get_dist(chassis, target)>3)
return
playsound(chassis, 'sound/machines/click.ogg', 50, 1)
@@ -242,7 +248,6 @@
var/turf/simulated/floor/F = target
occupant_message("Building Wall...")
if(do_after_cooldown(F))
- if(disabled) return
F.ChangeTurf(/turf/simulated/wall)
playsound(F, 'sound/items/Deconstruct.ogg', 50, 1)
chassis.spark_system.start()
@@ -260,8 +265,6 @@
/obj/item/mecha_parts/mecha_equipment/rcd/do_after_cooldown(var/atom/target)
. = ..()
- if(disabled)
- return 0
/obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list)
..()
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index e47bcec43c6..9880c1b810f 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -24,11 +24,6 @@
. = ..()
unbuckle_mob()
-/obj/Del()
- . = ..()
- unbuckle_mob()
-
-
//procs that handle the actual buckling and unbuckling
/obj/proc/buckle_mob(mob/living/M)
if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || (buckle_requires_restraints && !M.restrained()))
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 87b92cc11a4..3d883523560 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -186,7 +186,7 @@
for (var/obj/structure/alien/weeds/W in range(1,T))
W.updateWeedOverlays()
linked_node = null
- ..()
+ return ..()
/obj/structure/alien/weeds/proc/Life()
set background = BACKGROUND_ENABLED
@@ -468,6 +468,11 @@
if(ticks >= target_strength)
target.visible_message("[target] collapses under its own weight into a puddle of goop and undigested debris!")
+ if(istype(target, /obj/structure/closet))
+ var/obj/structure/closet/T = target
+ T.dump_contents()
+ qdel(target)
+
if(istype(target, /turf/simulated/wall))
var/turf/simulated/wall/W = target
W.dismantle_wall(1)
diff --git a/code/game/objects/effects/bump_teleporter.dm b/code/game/objects/effects/bump_teleporter.dm
index a0005e515d5..bb9a34010c9 100644
--- a/code/game/objects/effects/bump_teleporter.dm
+++ b/code/game/objects/effects/bump_teleporter.dm
@@ -17,7 +17,7 @@ var/list/obj/effect/bump_teleporter/BUMP_TELEPORTERS = list()
/obj/effect/bump_teleporter/Destroy()
BUMP_TELEPORTERS -= src
- ..()
+ return ..()
/obj/effect/bump_teleporter/Bumped(atom/user)
if(!ismob(user))
diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm
index 1d3284d671d..35f583eddb8 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/Cleanable/aliens.dm
@@ -17,7 +17,7 @@
for(var/datum/disease/D in viruses)
D.cure(0)
viruses = null
- ..()
+ return ..()
/obj/effect/decal/cleanable/xenoblood/xgibs/proc/streak(list/directions)
spawn (0)
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 376248156cb..3770ad0d8d8 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -15,7 +15,7 @@
for(var/datum/disease/D in viruses)
D.cure(0)
viruses = null
- ..()
+ return ..()
/obj/effect/decal/cleanable/blood/New()
..()
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 7dc1f58688a..e819145d7c5 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -114,7 +114,7 @@
for(var/datum/disease/D in viruses)
D.cure(0)
viruses = null
- ..()
+ return ..()
/obj/effect/decal/cleanable/tomato_smudge
name = "tomato smudge"
diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm
index da5d6e7b40b..c72182823a8 100644
--- a/code/game/objects/effects/decals/Cleanable/robots.dm
+++ b/code/game/objects/effects/decals/Cleanable/robots.dm
@@ -59,7 +59,7 @@
for(var/datum/disease/D in viruses)
D.cure(0)
viruses = null
- ..()
+ return ..()
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index f0cece9bd32..488a41be821 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -56,4 +56,4 @@
gang.territory -= territory.type
gang.territory_new -= territory.type
gang.territory_lost |= list(territory.type = territory.name)
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index a3a305541c7..587031fa810 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -7,7 +7,7 @@
opacity = 0
anchored = 1
density = 0
- layer = OBJ_LAYER + 0.05 //above table, below windoor/airlock/foamed metal.
+ layer = OBJ_LAYER - 0.5 //above table, below windoor/airlock/foamed metal.
mouse_opacity = 0
var/amount = 3
animate_movement = 0
@@ -91,14 +91,8 @@
/obj/effect/effect/foam/proc/spread_foam()
- for(var/direction in cardinal)
- var/turf/T = get_step(src,direction)
- if(!T)
- continue
-
- if(!T.Enter(src))
- continue
-
+ var/turf/t_loc = get_turf(src)
+ for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam!
if(foundfoam)
continue
@@ -194,7 +188,7 @@
/obj/structure/foamedmetal/Destroy()
density = 0
air_update_turf(1)
- ..()
+ return ..()
/obj/structure/foamedmetal/Move()
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index db7b6be9b54..4be6879fc01 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -36,7 +36,7 @@
/obj/effect/effect/smoke/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/effect/effect/smoke/proc/kill_smoke()
SSobj.processing.Remove(src)
@@ -192,8 +192,7 @@
/datum/effect/effect/system/smoke_spread/chem/Destroy()
chemholder = null
- ..()
- return QDEL_HINT_PUTINPOOL
+ return ..()
/datum/effect/effect/system/smoke_spread/chem/set_up(datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
if(n > 20)
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 3cd61feaf1f..2cabf80db63 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -255,4 +255,4 @@
src.visible_message("\The [src] splits open.")
for(var/atom/movable/A in contents)
A.loc = src.loc
- ..()
+ return ..()
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 682fc5293fe..6d3c4e6dce0 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -98,6 +98,9 @@
if(W.reinf && W.fulltile)
cached_exp_block[T] += W.explosion_block
+ for(var/obj/effect/blob/B in T)
+ cached_exp_block[T] += B.explosion_block
+
for(var/turf/T in affected_turfs)
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
@@ -215,6 +218,9 @@
if(W.explosion_block && W.fulltile)
dist += W.explosion_block
+ for(var/obj/effect/blob/B in T)
+ dist += B.explosion_block
+
if(dist < dev)
T.color = "red"
T.maptext = "Dev"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 0b0080eadcf..f012afd839e 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -789,7 +789,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (last_text && world.time < last_text + 5)
return
- if (isnull(P) || P.toff || !istype(P))
+ if (!istype(P) || P.toff || qdeleted(P))
return
last_text = world.time
@@ -1064,7 +1064,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/Destroy()
PDAs -= src
- ..()
+ return ..()
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
if (istype(AM, /mob/living/carbon))
@@ -1084,8 +1084,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/list/namecounts = list()
if(user.stat == 2)
- user << "You can't send PDA messages because you are dead!"
- return
+ return //won't work if dead
if(src.aiPDA.toff)
user << "Turn on your receiver in order to send messages."
@@ -1126,8 +1125,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
set category = "AI Commands"
set name = "PDA - Toggle Sender/Receiver"
if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
+ return //won't work if dead
if(!isnull(aiPDA))
aiPDA.toff = !aiPDA.toff
usr << "PDA sender/receiver toggled [(aiPDA.toff ? "Off" : "On")]!"
@@ -1138,8 +1136,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
set category = "AI Commands"
set name = "PDA - Toggle Ringer"
if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
+ return //won't work if dead
if(!isnull(aiPDA))
//0
aiPDA.silent = !aiPDA.silent
@@ -1151,8 +1148,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
set category = "AI Commands"
set name = "PDA - Chatrooms"
if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
+ return //won't work if dead
if(!isnull(aiPDA))
aiPDA.mode = 5
aiPDA.attack_self(src)
@@ -1161,8 +1157,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/mob/living/silicon/ai/proc/cmd_show_message_log(mob/user)
if(user.stat == 2)
- user << "You can't do that because you are dead!"
- return
+ return //won't work if dead
if(!isnull(aiPDA))
var/HTML = "AI PDA Message Log[aiPDA.tnote]"
user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index e000bbfcec4..e5604c37591 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -32,7 +32,7 @@
/obj/item/radio/integrated/signal/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
- ..()
+ return ..()
/obj/item/radio/integrated/signal/initialize()
if (src.frequency < 1200 || src.frequency > 1600)
diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm
index 59780eb60f0..b6b36f429e9 100644
--- a/code/game/objects/items/devices/camera_bug.dm
+++ b/code/game/objects/items/devices/camera_bug.dm
@@ -1,9 +1,3 @@
-#define VANILLA_BUG 0
-#define UNIVERSAL_BUG 1
-#define NETWORK_BUG 2
-#define SABOTAGE_BUG 3
-#define ADVANCED_BUG 4
-#define ADMIN_BUG 5
#define BUGMODE_LIST 0
#define BUGMODE_MONITOR 1
@@ -22,13 +16,9 @@
throw_range = 20
var/obj/machinery/camera/current = null
- var/obj/item/expansion = null
- var/bugtype = VANILLA_BUG
var/last_net_update = 0
- var/last_bugtype = VANILLA_BUG
var/list/bugged_cameras = list()
- var/skip_bugcheck = 0
var/track_mode = BUGMODE_LIST
var/last_tracked = 0
@@ -45,12 +35,6 @@
SSobj.processing += src
/obj/item/device/camera_bug/Destroy()
- if(expansion)
- qdel(expansion)
- expansion = null
- qdel(src)
-//Easier to just call del() than this nonsense
-// ya no, del() takes 0.8ds to run on avg. this takes less than 0.01
get_cameras()
for(var/cam_tag in bugged_cameras)
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
@@ -59,7 +43,7 @@
bugged_cameras = list()
if(tracking)
tracking = null
- ..()
+ return ..()
/obj/item/device/camera_bug/interact(mob/user = usr)
@@ -78,7 +62,7 @@
return null
var/turf/T = get_turf(user.loc)
- if(T.z != current.z || (!skip_bugcheck && current.bug != src) || !current.can_use())
+ if(T.z != current.z || !current.can_use())
user << "[src] has lost the signal."
current = null
user.reset_view(null)
@@ -88,22 +72,13 @@
return 1
/obj/item/device/camera_bug/proc/get_cameras()
- if(bugtype != last_bugtype || ( (bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG)) && world.time > (last_net_update + 100)))
+ if( world.time > (last_net_update + 100))
bugged_cameras = list()
- last_bugtype = bugtype
for(var/obj/machinery/camera/camera in cameranet.cameras)
if(camera.stat || !camera.can_use())
continue
- switch(bugtype)
- if(VANILLA_BUG,SABOTAGE_BUG,ADVANCED_BUG)
- if(camera.bug == src)
- bugged_cameras[camera.c_tag] = camera
- if(UNIVERSAL_BUG)
- if(camera.bug)
- bugged_cameras[camera.c_tag] = camera
- if(NETWORK_BUG,ADMIN_BUG)
- if(length(list("SS13","MINE")&camera.network))
- bugged_cameras[camera.c_tag] = camera
+ if(length(list("SS13","MINE")&camera.network))
+ bugged_cameras[camera.c_tag] = camera
sortList(bugged_cameras)
return bugged_cameras
@@ -119,16 +94,10 @@
for(var/entry in cameras)
var/obj/machinery/camera/C = cameras[entry]
var/functions = ""
- switch(bugtype)
- if(SABOTAGE_BUG)
- functions = " - \[Disable\]"
- if(ADVANCED_BUG)
- functions = " - \[Monitor\]"
- if(ADMIN_BUG)
- if(C.bug == src)
- functions = " - \[Monitor\] \[Disable\]"
- else
- functions = " - \[Monitor\]"
+ if(C.bug == src)
+ functions = " - \[Monitor\] \[Disable\]"
+ else
+ functions = " - \[Monitor\]"
html += "| [entry] | [functions] |
"
if(BUGMODE_MONITOR)
@@ -157,6 +126,9 @@
var/s = (time_diff - 4*m) * 15
if(!s) s = "00"
html += "Last seen near [outstring] ([m]:[s] minute\s ago)
"
+ if( C && (C.bug == src)) //Checks to see if the camera has a bug
+ html += "\[Disable\]"
+
else
html += "Not yet seen."
else
@@ -309,63 +281,6 @@
break
src.updateSelfDialog()
-/obj/item/device/camera_bug/attackby(obj/item/W,mob/living/user, params)
- if(istype(W,/obj/item/weapon/screwdriver) && expansion)
- expansion.loc = get_turf(loc)
- user << "You unscrew [expansion]."
- user.put_in_inactive_hand(expansion)
- expansion = null
- bugtype = VANILLA_BUG
- skip_bugcheck = 0
- track_mode = BUGMODE_LIST
- tracking = null
- return
-
- if(expansion || !W)
- return ..(W,user)
-
- // I am not sure that this list is or should be final
- // really I do not know what to do here.
- var/static/list/expandables = list(
- /obj/item/weapon/research = ADMIN_BUG, // could have been anything spawn-only
-
- // these are all so hackish I am sorry
-
- /obj/item/device/analyzer = UNIVERSAL_BUG,
- /obj/item/weapon/stock_parts/subspace/analyzer = UNIVERSAL_BUG,
-
- /obj/item/device/assembly/igniter = SABOTAGE_BUG,
- /obj/item/device/assembly/infra = SABOTAGE_BUG, // ir blaster to disable camera
- /obj/item/weapon/stock_parts/subspace/amplifier = SABOTAGE_BUG,
-
- /obj/item/device/radio = NETWORK_BUG,
- /obj/item/device/assembly/signaler = NETWORK_BUG,
- /obj/item/weapon/stock_parts/subspace/transmitter = NETWORK_BUG,
-
- /obj/item/device/detective_scanner = ADVANCED_BUG,
- /obj/item/device/paicard = ADVANCED_BUG,
- /obj/item/weapon/stock_parts/scanning_module = ADVANCED_BUG
- )
-
- for(var/entry in expandables)
- if(istype(W,entry))
- if(!user.unEquip(W))
- return
- bugtype = expandables[entry]
- W.loc = src
- expansion = W
- user << "You add [W] to [src]."
- get_cameras() // the tracking code will want to know the new camera list
- if(bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG))
- skip_bugcheck = 1
- return
-
-#undef VANILLA_BUG
-#undef UNIVERSAL_BUG
-#undef NETWORK_BUG
-#undef SABOTAGE_BUG
-#undef ADVANCED_BUG
-#undef ADMIN_BUG
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 9302f773829..35f05d0f670 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -148,4 +148,4 @@
/obj/effect/dummy/chameleon/Destroy()
master.disrupt(0)
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index b929937aa8b..79533508619 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -253,10 +253,11 @@ obj/item/device/flashlight/lamp/bananalamp
name = "torch"
desc = "A torch fashioned from some leaves and a log."
w_class = 4
- brightness_on = 7
+ brightness_on = 4
icon_state = "torch"
item_state = "torch"
on_damage = 10
+ slot_flags = null
/obj/item/device/flashlight/lantern
name = "lantern"
@@ -291,7 +292,7 @@ obj/item/device/flashlight/lamp/bananalamp
/obj/item/device/flashlight/emp/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/device/flashlight/emp/process()
charge_tick++
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index e45b7253355..d9bb7bc4c65 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -14,7 +14,7 @@
/obj/item/device/instrument/Destroy()
qdel(song)
song = null
- ..()
+ return ..()
/obj/item/device/instrument/initialize()
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 8650cdec64e..cda6bef97a8 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -31,7 +31,7 @@
/obj/item/device/multitool/ai_detect/Destroy()
SSobj.processing -= src
- ..()
+ return ..()
/obj/item/device/multitool/ai_detect/process()
if(track_delay > world.time)
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index e563aefc3a8..719b6491e62 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -18,7 +18,7 @@
//Will stop people throwing friend pAIs into the singularity so they can respawn
if(!isnull(pai))
pai.death(0)
- ..()
+ return ..()
/obj/item/device/paicard/attack_self(mob/user)
if (!in_range(src, user))
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index ce51646f6aa..ac9a3f0fe7e 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -20,7 +20,7 @@
/obj/item/device/electropack/Destroy()
if(radio_controller)
radio_controller.remove_object(src, frequency)
- ..()
+ return ..()
/obj/item/device/electropack/attack_hand(mob/user)
if(iscarbon(user))
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index e0c98ef93e8..477464d6f3f 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -20,7 +20,7 @@
qdel(keyslot2)
keyslot = null
keyslot2 = null
- ..()
+ return ..()
/obj/item/device/radio/headset/talk_into(mob/living/M, message, channel, list/spans)
if (!listening)
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 92d7973dc72..42db3559b3c 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -16,7 +16,7 @@
/obj/item/device/radio/intercom/Destroy()
SSobj.processing -= src
- ..()
+ return ..()
/obj/item/device/radio/intercom/attack_ai(mob/user)
src.add_fingerprint(user)
diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm
index 64110a33877..b0cc74e33d2 100644
--- a/code/game/objects/items/devices/uplinks.dm
+++ b/code/game/objects/items/devices/uplinks.dm
@@ -25,7 +25,7 @@ var/list/world_uplinks = list()
/obj/item/device/uplink/Destroy()
world_uplinks-=src
- ..()
+ return ..()
//Let's build a menu!
/obj/item/device/uplink/proc/generate_menu()
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 16f8a2b841e..e8e91caf7ac 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -37,6 +37,7 @@
R.notify_ai(2)
R.update_icons()
R.update_headlamp()
+ R.magpulse = 0
return 1
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index df964d0de4b..093911ca768 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -11,7 +11,7 @@
removeOverlays()
if(pinnedLoc)
pinnedLoc.nullPinnedTarget()
- ..()
+ return ..()
/obj/item/target/proc/nullPinnedLoc()
pinnedLoc = null
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index a18fb047f3d..85658530ba7 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -27,7 +27,7 @@
/obj/item/stack/Destroy()
if (usr && usr.machine==src)
usr << browse(null, "window=stack")
- ..()
+ return ..()
/obj/item/stack/examine(mob/user)
..()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 780de85afed..1944785dafa 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -15,7 +15,8 @@
* Carp plushie
* Foam armblade
* Toy big red button
- Beach ball
+ * Beach ball
+ * Toy xeno
*/
@@ -1171,4 +1172,33 @@
/obj/item/toy/beach_ball/afterattack(atom/target as mob|obj|turf|area, mob/user)
user.drop_item()
- src.throw_at(target, throw_range, throw_speed)
\ No newline at end of file
+ src.throw_at(target, throw_range, throw_speed)
+
+/*
+ * Xenomorph action figure
+ */
+
+/obj/item/toy/toy_xeno
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "toy_xeno"
+ name = "xenomorph action figure"
+ desc = "MEGA presents the new Xenos Isolated action figure! Comes complete with realistic sounds! Pull back string to use."
+ w_class = 2
+ var/cooldown = 0
+
+/obj/item/toy/toy_xeno/attack_self(mob/user)
+ if(cooldown <= world.time)
+ cooldown = (world.time + 50) //5 second cooldown
+ user.visible_message("[user] pulls back the string on [src].")
+ icon_state = "[initial(icon_state)]_used"
+ sleep(5)
+ audible_message("\icon[src] Hiss!")
+ var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
+ var/chosen_sound = pick(possible_sounds)
+ playsound(get_turf(src), chosen_sound, 50, 1)
+ spawn(45)
+ if(src)
+ icon_state = "[initial(icon_state)]"
+ else
+ user << "The string on [src] hasn't rewound all the way!"
+ return
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index f44a7870f5d..95bac4c181c 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -27,7 +27,6 @@ RCD
var/working = 0
var/mode = 1
var/canRturf = 0
- var/disabled = 0
var/airlock_type = /obj/machinery/door/airlock
var/advanced_airlock_setting = 1 //Set to 1 if you want more paintjobs available
var/sheetmultiplier = 4 //Controls the amount of matter added for each glass/metal sheet, triple for plasteel
@@ -230,12 +229,14 @@ RCD
src.spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
+ rcd_list += src
return
/obj/item/weapon/rcd/Destroy()
qdel(spark_system)
spark_system = null
+ rcd_list -= src
return ..()
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user, params)
@@ -310,8 +311,6 @@ RCD
/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
if(!proximity) return 0
- if(disabled && !isrobot(user))
- return 0
if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
return 0
if(!(istype(A, /turf) || istype(A, /obj/machinery/door/airlock) || istype(A, /obj/structure/grille) || istype(A, /obj/structure/window)))
diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm
index 0deb9b99ee5..c46f1131447 100644
--- a/code/game/objects/items/weapons/chrono_eraser.dm
+++ b/code/game/objects/items/weapons/chrono_eraser.dm
@@ -22,7 +22,7 @@
/obj/item/weapon/chrono_eraser/Destroy()
dropped()
- ..()
+ return ..()
/obj/item/weapon/chrono_eraser/ui_action_click()
var/mob/living/carbon/user = src.loc
@@ -74,7 +74,7 @@
TED = null
if(field)
field_disconnect(field)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/chrono_gun/proc/field_connect(obj/effect/chrono_field/F)
var/mob/living/user = src.loc
@@ -181,7 +181,7 @@
/obj/effect/chrono_field/Destroy()
if(gun && gun.field_check(src))
gun.field_disconnect(src)
- ..()
+ return ..()
/obj/effect/chrono_field/update_icon()
var/ttk_frame = 1 - (tickstokill / initial(tickstokill))
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 7f5e121e441..029926d3316 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -193,9 +193,8 @@
if(on)
var/M = get(paddles, /mob)
remove_paddles(M)
- ..()
+ . = ..()
update_icon()
- return
/obj/item/weapon/defibrillator/proc/deductcharge(chrgdeductamt)
if(bcell)
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 5f3d4d87862..9a9971a6199 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -28,7 +28,7 @@
qdel(igniter)
if(ptank)
qdel(ptank)
- ..()
+ return ..()
/obj/item/weapon/flamethrower/process()
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 059fb02ae5c..f8836ee445c 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -14,7 +14,7 @@
/obj/item/weapon/grenade/smokebomb/Destroy()
qdel(smoke)
- ..()
+ return ..()
/obj/item/weapon/grenade/smokebomb/prime()
update_mob()
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 0e7fd19d6c9..20f83673553 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -69,7 +69,7 @@
/obj/item/weapon/implant/Destroy()
if(imp_in)
removed(imp_in)
- ..()
+ return ..()
/obj/item/weapon/implant/proc/get_data()
diff --git a/code/game/objects/items/weapons/singularityhammer.dm b/code/game/objects/items/weapons/singularityhammer.dm
index e5146fdbc1e..ad021525f0a 100644
--- a/code/game/objects/items/weapons/singularityhammer.dm
+++ b/code/game/objects/items/weapons/singularityhammer.dm
@@ -22,7 +22,7 @@
/obj/item/weapon/twohanded/singularityhammer/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/twohanded/singularityhammer/process()
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index fdd4aea2842..ec973ab94b0 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -463,7 +463,7 @@
close_all()
qdel(boxes)
qdel(closer)
- ..()
+ return ..()
/obj/item/weapon/storage/emp_act(severity)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 3bad0781ef3..c620d777376 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -37,7 +37,7 @@
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/tank/examine(mob/user)
var/obj/icon = src
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 16245572192..638a4a5a2e0 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -66,8 +66,7 @@
remove_noz()
qdel(noz)
noz = null
- ..()
- return
+ return ..()
/obj/item/weapon/watertank/attack_hand(mob/user)
if(src.loc == user)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 5ad497513cc..6ec5bc1fa2e 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -16,7 +16,7 @@
/obj/Destroy()
if(!istype(src, /obj/machinery))
SSobj.processing.Remove(src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists
- ..()
+ return ..()
/obj/assume_air(datum/gas_mixture/giver)
if(loc)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 1e32b6d50d1..c1c19582ec1 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -18,7 +18,7 @@
UpdateAffectingLights()
if(smooth)
smooth_icon_neighbors(src)
- ..()
+ return ..()
/obj/structure/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 8f44995f4dc..d1c53fa6d5f 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -1,36 +1,33 @@
/obj/structure/door_assembly
- icon = 'icons/obj/doors/door_assembly.dmi'
-
name = "airlock assembly"
- icon_state = "door_as_0"
+ icon = 'icons/obj/doors/airlocks/station/public.dmi'
+ icon_state = "construction"
+ var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
anchored = 0
density = 1
var/state = 0
var/mineral = null
var/typetext = ""
var/icontext = ""
- var/base_icon_state = "door_as_"
- var/glass_base_icon_state = "door_as_g"
var/obj/item/weapon/electronics/airlock/electronics = null
var/airlock_type = /obj/machinery/door/airlock //the type path of the airlock once completed
var/glass_type = /obj/machinery/door/airlock/glass
var/created_name = null
var/heat_proof_finished = 0 //whether to heat-proof the finished airlock
+ var/material = null //icon state logic
/obj/structure/door_assembly/New()
- base_icon_state = copytext(icon_state,1,lentext(icon_state))
+ update_icon()
/obj/structure/door_assembly/door_assembly_0
name = "airlock assembly"
- icon_state = "door_as_1"
airlock_type = /obj/machinery/door/airlock
anchored = 1
state = 1
/obj/structure/door_assembly/door_assembly_com
name = "command airlock assembly"
- icon_state = "door_as_com1"
- glass_base_icon_state = "door_as_gcom"
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
typetext = "command"
icontext = "com"
glass_type = /obj/machinery/door/airlock/glass_command
@@ -40,12 +37,11 @@
/obj/structure/door_assembly/door_assembly_com/glass
mineral = "glass"
- icon_state = "door_as_gcom1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_sec
name = "security airlock assembly"
- icon_state = "door_as_sec1"
- glass_base_icon_state = "door_as_gsec"
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
typetext = "security"
icontext = "sec"
glass_type = /obj/machinery/door/airlock/glass_security
@@ -55,12 +51,11 @@
/obj/structure/door_assembly/door_assembly_sec/glass
mineral = "glass"
- icon_state = "door_as_gsec1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_eng
name = "engineering airlock assembly"
- icon_state = "door_as_eng1"
- glass_base_icon_state = "door_as_geng"
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
typetext = "engineering"
icontext = "eng"
glass_type = /obj/machinery/door/airlock/glass_engineering
@@ -70,12 +65,11 @@
/obj/structure/door_assembly/door_assembly_eng/glass
mineral = "glass"
- icon_state = "door_as_geng1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_min
name = "mining airlock assembly"
- icon_state = "door_as_min1"
- glass_base_icon_state = "door_as_gmin"
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
typetext = "mining"
icontext = "min"
glass_type = /obj/machinery/door/airlock/glass_mining
@@ -85,12 +79,11 @@
/obj/structure/door_assembly/door_assembly_min/glass
mineral = "glass"
- icon_state = "door_as_gmin1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_atmo
name = "atmospherics airlock assembly"
- icon_state = "door_as_atmo1"
- glass_base_icon_state = "door_as_gatmo"
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
typetext = "atmos"
icontext = "atmo"
glass_type = /obj/machinery/door/airlock/glass_atmos
@@ -100,12 +93,11 @@
/obj/structure/door_assembly/door_assembly_atmo/glass
mineral = "glass"
- icon_state = "door_as_gatmo1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_research
name = "research airlock assembly"
- icon_state = "door_as_res1"
- glass_base_icon_state = "door_as_gres"
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
typetext = "research"
icontext = "res"
glass_type = /obj/machinery/door/airlock/glass_research
@@ -115,12 +107,11 @@
/obj/structure/door_assembly/door_assembly_research/glass
mineral = "glass"
- icon_state = "door_as_gres1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_science
name = "science airlock assembly"
- icon_state = "door_as_sci1"
- glass_base_icon_state = "door_as_gsci"
+ icon = 'icons/obj/doors/airlocks/station/science.dmi'
typetext = "science"
icontext = "sci"
glass_type = /obj/machinery/door/airlock/glass_science
@@ -130,12 +121,11 @@
/obj/structure/door_assembly/door_assembly_science/glass
mineral = "glass"
- icon_state = "door_as_gsci1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_med
name = "medical airlock assembly"
- icon_state = "door_as_med1"
- glass_base_icon_state = "door_as_gmed"
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
typetext = "medical"
icontext = "med"
glass_type = /obj/machinery/door/airlock/glass_medical
@@ -145,11 +135,11 @@
/obj/structure/door_assembly/door_assembly_med/glass
mineral = "glass"
- icon_state = "door_as_gmed1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_mai
name = "maintenance airlock assembly"
- icon_state = "door_as_mai1"
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
typetext = "maintenance"
icontext = "mai"
airlock_type = /obj/machinery/door/airlock/maintenance
@@ -158,7 +148,8 @@
/obj/structure/door_assembly/door_assembly_ext
name = "external airlock assembly"
- icon_state = "door_as_ext1"
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
typetext = "external"
icontext = "ext"
airlock_type = /obj/machinery/door/airlock/external
@@ -167,7 +158,7 @@
/obj/structure/door_assembly/door_assembly_fre
name = "freezer airlock assembly"
- icon_state = "door_as_fre1"
+ icon = 'icons/obj/doors/airlocks/station/freezer.dmi'
typetext = "freezer"
icontext = "fre"
airlock_type = /obj/machinery/door/airlock/freezer
@@ -176,7 +167,8 @@
/obj/structure/door_assembly/door_assembly_hatch
name = "airtight hatch assembly"
- icon_state = "door_as_hatch1"
+ icon = 'icons/obj/doors/airlocks/hatch/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
typetext = "hatch"
icontext = "hatch"
airlock_type = /obj/machinery/door/airlock/hatch
@@ -185,7 +177,8 @@
/obj/structure/door_assembly/door_assembly_mhatch
name = "maintenance hatch assembly"
- icon_state = "door_as_mhatch1"
+ icon = 'icons/obj/doors/airlocks/hatch/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/hatch/overlays.dmi'
typetext = "maintenance_hatch"
icontext = "mhatch"
airlock_type = /obj/machinery/door/airlock/maintenance_hatch
@@ -194,15 +187,17 @@
/obj/structure/door_assembly/door_assembly_glass
name = "glass airlock assembly"
- icon_state = "door_as_g1"
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
airlock_type = /obj/machinery/door/airlock/glass
anchored = 1
state = 1
mineral = "glass"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_gold
name = "gold airlock assembly"
- icon_state = "door_as_gold1"
+ icon = 'icons/obj/doors/airlocks/station/gold.dmi'
airlock_type = /obj/machinery/door/airlock/gold
anchored = 1
state = 1
@@ -210,7 +205,7 @@
/obj/structure/door_assembly/door_assembly_silver
name = "silver airlock assembly"
- icon_state = "door_as_silver1"
+ icon = 'icons/obj/doors/airlocks/station/silver.dmi'
airlock_type = /obj/machinery/door/airlock/silver
anchored = 1
state = 1
@@ -218,7 +213,7 @@
/obj/structure/door_assembly/door_assembly_diamond
name = "diamond airlock assembly"
- icon_state = "door_as_diamond1"
+ icon = 'icons/obj/doors/airlocks/station/diamond.dmi'
airlock_type = /obj/machinery/door/airlock/diamond
anchored = 1
state = 1
@@ -226,7 +221,7 @@
/obj/structure/door_assembly/door_assembly_uranium
name = "uranium airlock assembly"
- icon_state = "door_as_uranium1"
+ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'
airlock_type = /obj/machinery/door/airlock/uranium
anchored = 1
state = 1
@@ -234,7 +229,7 @@
/obj/structure/door_assembly/door_assembly_plasma
name = "plasma airlock assembly"
- icon_state = "door_as_plasma1"
+ icon = 'icons/obj/doors/airlocks/station/plasma.dmi'
airlock_type = /obj/machinery/door/airlock/plasma
anchored = 1
state = 1
@@ -243,7 +238,7 @@
/obj/structure/door_assembly/door_assembly_clown
name = "bananium airlock assembly"
desc = "Honk"
- icon_state = "door_as_clown1"
+ icon = 'icons/obj/doors/airlocks/station/bananium.dmi'
airlock_type = /obj/machinery/door/airlock/clown
anchored = 1
state = 1
@@ -251,7 +246,7 @@
/obj/structure/door_assembly/door_assembly_sandstone
name = "sandstone airlock assembly"
- icon_state = "door_as_sandstone1"
+ icon = 'icons/obj/doors/airlocks/station/sandstone.dmi'
airlock_type = /obj/machinery/door/airlock/sandstone
anchored = 1
state = 1
@@ -259,7 +254,8 @@
/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
name = "high security airlock assembly"
- icon_state = "door_as_highsec1"
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
typetext = "highsecurity"
icontext = "highsec"
airlock_type = /obj/machinery/door/airlock/highsecurity
@@ -268,7 +264,8 @@
/obj/structure/door_assembly/door_assembly_vault
name = "vault door assembly"
- icon_state = "door_as_vault1"
+ icon = 'icons/obj/doors/airlocks/vault/vault.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi'
typetext = "vault"
icontext = "vault"
airlock_type = /obj/machinery/door/airlock/vault
@@ -277,7 +274,8 @@
/obj/structure/door_assembly/door_assembly_shuttle
name = "shuttle airlock assembly"
- icon_state = "door_as_shuttle1"
+ icon = 'icons/obj/doors/airlocks/shuttle/shuttle.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/shuttle/overlays.dmi'
typetext = "shuttle"
icontext = "shuttle"
airlock_type = /obj/machinery/door/airlock/shuttle
@@ -286,7 +284,7 @@
/obj/structure/door_assembly/door_assembly_wood
name = "wooden airlock assembly"
- icon_state = "door_as_wood1"
+ icon = 'icons/obj/doors/airlocks/station/wood.dmi'
airlock_type = /obj/machinery/door/airlock/wood
anchored = 1
state = 1
@@ -294,8 +292,7 @@
/obj/structure/door_assembly/door_assembly_viro
name = "virology airlock assembly"
- icon_state = "door_as_viro1"
- glass_base_icon_state = "door_as_gviro"
+ icon = 'icons/obj/doors/airlocks/station/virology.dmi'
typetext = "virology"
icontext = "viro"
glass_type = /obj/machinery/door/airlock/glass_virology
@@ -305,11 +302,12 @@
/obj/structure/door_assembly/door_assembly_viro/glass
mineral = "glass"
- icon_state = "door_as_gviro1"
+ material = "glass"
/obj/structure/door_assembly/door_assembly_centcom
- icon_state = "door_as_ele1"
typetext = "centcom"
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/centcom/overlays.dmi'
icontext = "ele"
airlock_type = /obj/machinery/door/airlock/centcom
anchored = 1
@@ -338,10 +336,10 @@
var/optionlist
if(mineral && mineral == "glass")
//These airlocks have a glass version.
- optionlist = list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining")
+ optionlist = list("Public", "Public2", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Mining")
else
//These airlocks have a regular version.
- optionlist = list("Default", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Mining", "Maintenance", "External", "High Security")
+ optionlist = list("Public", "Engineering", "Atmospherics", "Security", "Command", "Medical", "Research", "Science", "Mining", "Maintenance", "External", "High Security")
icontype = input(user, "Please select a paintjob for this airlock.") in optionlist
@@ -350,70 +348,106 @@
var/has_solid = 0
var/has_glass = 0
switch(icontype)
- //For Default the standard options suffice.
+ if("Public")
+ icon = 'icons/obj/doors/airlocks/station/public.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ typetext = ""
+ icontext = ""
+ has_solid = 1
+ has_glass = 1
+ if("Public2")
+ icon = 'icons/obj/doors/airlocks/station2/glass.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station2/overlays.dmi'
+ typetext = ""
+ icontext = ""
+ has_solid = 1
+ has_glass = 1
if("Engineering")
+ icon = 'icons/obj/doors/airlocks/station/engineering.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "engineering"
icontext = "eng"
has_solid = 1
has_glass = 1
if("Atmospherics")
+ icon = 'icons/obj/doors/airlocks/station/atmos.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "atmos"
icontext = "atmo"
has_solid = 1
has_glass = 1
if("Security")
+ icon = 'icons/obj/doors/airlocks/station/security.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "security"
icontext = "sec"
has_solid = 1
has_glass = 1
if("Command")
+ icon = 'icons/obj/doors/airlocks/station/command.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "command"
icontext = "com"
has_solid = 1
has_glass = 1
if("Medical")
+ icon = 'icons/obj/doors/airlocks/station/medical.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "medical"
icontext = "med"
has_solid = 1
has_glass = 1
if("Research")
+ icon = 'icons/obj/doors/airlocks/station/research.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
+ typetext = "research"
+ icontext = "res"
+ has_solid = 1
+ has_glass = 1
+ if("Science")
+ icon = 'icons/obj/doors/airlocks/station/science.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "research"
icontext = "res"
has_solid = 1
has_glass = 1
if("Mining")
+ icon = 'icons/obj/doors/airlocks/station/mining.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "mining"
icontext = "min"
has_solid = 1
has_glass = 1
if("Maintenance")
+ icon = 'icons/obj/doors/airlocks/station/maintenance.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi'
typetext = "maintenance"
icontext = "mai"
has_solid = 1
has_glass = 0
if("External")
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
typetext = "external"
icontext = "ext"
has_solid = 1
has_glass = 0
if("High Security")
+ icon = 'icons/obj/doors/airlocks/highsec/highsec.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/highsec/overlays.dmi'
typetext = "highsecurity"
icontext = "highsec"
has_solid = 1
has_glass = 0
if(has_solid)
airlock_type = text2path("/obj/machinery/door/airlock/[typetext]")
- base_icon_state = "door_as_[icontext]"
else
airlock_type = /obj/machinery/door/airlock
- base_icon_state = "door_as_"
if(has_glass)
glass_type = text2path("/obj/machinery/door/airlock/glass_[typetext]")
- glass_base_icon_state = "door_as_g[icontext]"
else
glass_type = /obj/machinery/door/airlock/glass
- glass_base_icon_state = "door_as_g"
if(mineral && mineral != "glass")
mineral = null //I know this is stupid, but until we change glass to a boolean it's how this code works.
@@ -560,6 +594,7 @@
name = "near finished window airlock assembly"
G.use(1)
mineral = "glass"
+ material = "glass"
//This list contains the airlock paintjobs that have a glass version:
if(icontext in list("eng", "atmo", "sec", "com", "med", "res", "min"))
src.airlock_type = text2path("/obj/machinery/door/airlock/[typetext]")
@@ -570,8 +605,6 @@
glass_type = /obj/machinery/door/airlock/glass
typetext = ""
icontext = ""
- base_icon_state = "door_as_[icontext]"
- glass_base_icon_state = "door_as_g[icontext]"
else if(istype(G, /obj/item/stack/sheet/mineral))
var/M = G.sheettype
if(G.get_amount() >= 2)
@@ -585,8 +618,6 @@
mineral = "[M]"
name = "near finished [M] airlock assembly"
airlock_type = text2path ("/obj/machinery/door/airlock/[M]")
- base_icon_state = "door_as_[M]"
- glass_base_icon_state = "door_as_g"
glass_type = /obj/machinery/door/airlock/glass
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
@@ -615,10 +646,12 @@
qdel(src)
else
..()
- if(mineral == "glass")
- icon_state = "[glass_base_icon_state][state]"
+ update_icon()
+
+/obj/structure/door_assembly/update_icon()
+ overlays.Cut()
+ if(!material)
+ overlays += get_airlock_overlay("fill_construction", icon)
else
- icon_state = "[base_icon_state][state]"
- //This updates the icon_state. They are named as "door_as1_eng" where the 1 in that example
- //represents what state it's in. So the most generic algorithm for the correct updating of
- //this is simply to change the number.
+ overlays += get_airlock_overlay("[material]_construction", overlays_file)
+ overlays += get_airlock_overlay("panel_c[state+1]", overlays_file)
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index fe14690944a..f3514151722 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -29,7 +29,7 @@
/obj/structure/mineral_door/Destroy()
density = 0
air_update_turf(1)
- ..()
+ return ..()
/obj/structure/mineral_door/Move()
var/turf/T = loc
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index bce42638e82..4d88e548004 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -30,7 +30,7 @@
if(connected)
qdel(connected)
connected = null
- ..()
+ return ..()
/obj/structure/bodycontainer/on_log()
update_icon()
@@ -135,7 +135,7 @@ var/global/list/crematoriums = new/list()
/obj/structure/bodycontainer/crematorium/Destroy()
crematoriums.Remove(src)
- ..()
+ return ..()
/obj/structure/bodycontainer/crematorium/New()
connected = new/obj/structure/tray/c_tray(src)
@@ -214,7 +214,7 @@ var/global/list/crematoriums = new/list()
connected.connected = null
connected.update_icon()
connected = null
- ..()
+ return ..()
/obj/structure/tray/attack_paw(mob/user)
return src.attack_hand(user)
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index d0aa327980c..5969168b473 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -22,7 +22,7 @@
/datum/song/Destroy()
instrumentObj = null
- ..()
+ return ..()
// note is a number from 1-7 for A-G
// acc is either "b", "n", or "#"
@@ -322,7 +322,7 @@
/obj/structure/piano/Destroy()
qdel(song)
song = null
- ..()
+ return ..()
/obj/structure/piano/initialize()
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 48bda2583fd..116bde159a4 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -14,7 +14,7 @@
/obj/structure/statue/Destroy()
density = 0
- ..()
+ return ..()
/obj/structure/statue/attackby(obj/item/weapon/W, mob/living/user, params)
add_fingerprint(user)
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 5e23a7f994f..0c931eb3b53 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -10,7 +10,7 @@
/obj/structure/target_stake/Destroy()
if(pinned_target)
pinned_target.nullPinnedLoc()
- ..()
+ return ..()
/obj/structure/target_stake/proc/nullPinnedTarget()
pinned_target = null
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 0e8991bf7c0..aaa115bbd1b 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -23,7 +23,7 @@
/obj/structure/transit_tube/station/Destroy()
SSobj.processing -= src
- ..()
+ return ..()
// Stations which will send the tube in the opposite direction after their stop.
/obj/structure/transit_tube/station/reverse
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index d56b46a45c6..d330273aa50 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -23,7 +23,7 @@
for(var/atom/movable/AM in contents)
AM.loc = loc
- ..()
+ return ..()
/obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/crowbar))
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 90007323b52..a6e28a73e1a 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -35,7 +35,7 @@
/obj/structure/windoor_assembly/Destroy()
density = 0
air_update_turf(1)
- ..()
+ return ..()
/obj/structure/windoor_assembly/Move()
var/turf/T = loc
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 9dc8d6631e9..bcfb5b739f4 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -364,7 +364,7 @@
if(!disassembled)
playsound(src, "shatter", 70, 1)
update_nearby_icons()
- ..()
+ return ..()
/obj/structure/window/Move()
diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index e941b5f6af4..32a43d63195 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -39,7 +39,7 @@
else
user << "You begin reinforcing the floor..."
if(do_after(user, 30, target = src))
- if (R.get_amount() >= 2)
+ if (R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
ChangeTurf(/turf/simulated/floor/engine)
playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
R.use(2)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 2ecee6da10f..755f5b4fa49 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -318,6 +318,6 @@
/turf/indestructible/fakedoor
name = "Centcom Access"
- icon = 'icons/obj/doors/Doorele.dmi'
- icon_state = "door_closed"
+ icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi'
+ icon_state = "fake_door"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 0955e000881..b4142a70058 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -48,13 +48,13 @@ var/global/floorIsLava = 0
body += "Jobban | "
body += "Identity Ban | "
body += "Notes | "
- if(M.client.check_watchlist(M.client.ckey))
- body += "Remove from Watchlist | "
- body += "Edit Watchlist reason "
- else
- body += "Add to Watchlist "
-
if(M.client)
+ if(M.client.check_watchlist(M.client.ckey))
+ body += "Remove from Watchlist | "
+ body += "Edit Watchlist reason "
+ else
+ body += "Add to Watchlist "
+
body += "| Prison | "
body += "\ Send back to Lobby | "
var/muted = M.client.prefs.muted
@@ -809,3 +809,20 @@ var/global/floorIsLava = 0
qdel(frommob)
return 1
+
+/client/proc/adminGreet()
+ if(ticker && ticker.current_state == GAME_STATE_PLAYING)
+ var/string = pick(
+ "I welcome you to the server [key]!",
+ "Happy to see you [key]!",
+ "Ah, [key] logged, say hello!",
+ "The server welcomes you [key]!",
+ "Exceptional! [key] joined us, what an honour!",
+ "Another amazing day, because [key] logged, say hi!",
+ "Did anyone see? [key] logged, welcome!",
+ "Monday to sunday, the server warmly welcomes you [key]!",
+ "It's a pleasure to see you [key], greetings!",
+ "Not a bad day if [key] joins, welcome, welcome!",
+ "Surely it's nice to see you [key], have a heartly welcome!")
+ //I really do
+ message_admins("[string]")
\ No newline at end of file
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index e470324cdf3..82ef26940b9 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -212,4 +212,4 @@
if(previous)
previous.next = null
master.last = previous
- ..()
+ return ..()
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index d147b5a2c6b..01251e9dba6 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -11,8 +11,7 @@
/obj/item/assembly/shock_kit/Destroy()
qdel(part1)
qdel(part2)
- ..()
- return
+ return ..()
/obj/item/assembly/shock_kit/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 35226b7023c..57cb5d4791b 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -22,7 +22,7 @@
/obj/item/device/assembly/signaler/Destroy()
if(radio_controller)
radio_controller.remove_object(src,frequency)
- ..()
+ return ..()
/obj/item/device/assembly/signaler/activate()
if(cooldown > 0) return 0
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 6958f17e392..865906b154c 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -129,6 +129,7 @@ var/next_external_rsc = 0
if(holder)
add_admin_verbs()
admin_memo_output("Show")
+ adminGreet()
if((global.comms_key == "default_pwd" || length(global.comms_key) <= 6) && global.comms_allowed) //It's the default value or less than 6 characters long, but it somehow didn't disable comms.
src << "The server's API key is either too short or is the default value! Consider changing it immediately!"
@@ -322,20 +323,6 @@ var/next_external_rsc = 0
'icons/pda_icons/pda_scanner.png',
'icons/pda_icons/pda_signaler.png',
'icons/pda_icons/pda_status.png',
- 'icons/spideros_icons/sos_1.png',
- 'icons/spideros_icons/sos_2.png',
- 'icons/spideros_icons/sos_3.png',
- 'icons/spideros_icons/sos_4.png',
- 'icons/spideros_icons/sos_5.png',
- 'icons/spideros_icons/sos_6.png',
- 'icons/spideros_icons/sos_7.png',
- 'icons/spideros_icons/sos_8.png',
- 'icons/spideros_icons/sos_9.png',
- 'icons/spideros_icons/sos_10.png',
- 'icons/spideros_icons/sos_11.png',
- 'icons/spideros_icons/sos_12.png',
- 'icons/spideros_icons/sos_13.png',
- 'icons/spideros_icons/sos_14.png',
'icons/stamp_icons/large_stamp-clown.png',
'icons/stamp_icons/large_stamp-deny.png',
'icons/stamp_icons/large_stamp-ok.png',
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 48735b7a688..92645f50a67 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -188,12 +188,14 @@
..()
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
- name = "Optical Meson Scanner"
- desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
- icon_state = "meson"
+ name = "Chameleon Thermals"
+ desc = "A pair of thermal optic goggles with an onboard chameleon generator. Toggle to disguise."
origin_tech = "magnets=3;syndicate=4"
flash_protect = -1
+/obj/item/clothing/glasses/thermal/syndi/attack_self(mob/user)
+ chameleon(user)
+
/obj/item/clothing/glasses/thermal/monocle
name = "Thermoncle"
desc = "A monocle thermal."
@@ -230,3 +232,55 @@
icon_state = "redglasses"
item_state = "redglasses"
+
+/obj/item/clothing/glasses/proc/chameleon(var/mob/user)
+ var/input_glasses = input(user, "Choose a piece of eyewear to disguise as.", "Choose glasses style.") as null|anything in list("Sunglasses", "Medical HUD", "Mesons", "Science Goggles", "Glasses", "Security Sunglasses","Eyepatch","Welding","Gar")
+
+ if(user && src in user.contents)
+ switch(input_glasses)
+ if("Sunglasses")
+ desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
+ name = "sunglasses"
+ icon_state = "sun"
+ item_state = "sunglasses"
+ if("Medical HUD")
+ name = "Health Scanner HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their health status."
+ icon_state = "healthhud"
+ item_state = "healthhud"
+ if("Mesons")
+ name = "Optical Meson Scanner"
+ desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
+ icon_state = "meson"
+ item_state = "meson"
+ if("Science Goggles")
+ name = "Science Goggles"
+ desc = "A pair of snazzy goggles used to protect against chemical spills."
+ icon_state = "purple"
+ item_state = "glasses"
+ if("Glasses")
+ name = "Prescription Glasses"
+ desc = "Made by Nerd. Co."
+ icon_state = "glasses"
+ item_state = "glasses"
+ if("Security Sunglasses")
+ name = "HUDSunglasses"
+ desc = "Sunglasses with a HUD."
+ icon_state = "sunhud"
+ item_state = "sunglasses"
+ if("Eyepatch")
+ name = "eyepatch"
+ desc = "Yarr."
+ icon_state = "eyepatch"
+ item_state = "eyepatch"
+ if("Welding")
+ name = "welding goggles"
+ desc = "Protects the eyes from welders; approved by the mad scientist association."
+ icon_state = "welding-g"
+ item_state = "welding-g"
+ if("Gar")
+ desc = "Just who the hell do you think I am?!"
+ name = "gar glasses"
+ icon_state = "gar"
+ item_state = "gar"
+
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 0f7365a3417..c6ac3201107 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -46,6 +46,15 @@
icon_state = "securityhud"
hud_type = DATA_HUD_SECURITY_ADVANCED
+/obj/item/clothing/glasses/hud/security/chameleon
+ name = "Chamleon Security HUD"
+ desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection."
+ flash_protect = 1
+
+/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user)
+ chameleon(user)
+
+
/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch
name = "Eyepatch HUD"
desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball."
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 9e0b55df4cb..a8048ec3f6d 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -14,7 +14,7 @@
/obj/item/clothing/head/helmet/space/chronos/Destroy()
dropped()
- ..()
+ return ..()
/obj/item/clothing/suit/space/chronos
@@ -55,7 +55,7 @@
/obj/item/clothing/suit/space/chronos/Destroy()
dropped()
- ..()
+ return ..()
/obj/item/clothing/suit/space/chronos/emp_act(severity)
var/mob/living/carbon/human/user = src.loc
@@ -216,5 +216,5 @@
holder.remote_control = null
if(holder.client && (holder.client.eye == src))
holder.client.eye = holder
- ..()
+ return ..()
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 9a3efc5d2ad..6d7a8390ae3 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -10,7 +10,7 @@
/obj/item/clothing/suit/hooded/Destroy()
qdel(hood)
- ..()
+ return ..()
/obj/item/clothing/suit/hooded/proc/MakeHood()
if(!hood)
@@ -101,13 +101,13 @@
helmet.suit = null
qdel(helmet)
qdel(jetpack)
- ..()
+ return ..()
/obj/item/clothing/head/helmet/space/hardsuit/Destroy()
if(suit)
suit.helmet = null
qdel(suit)
- ..()
+ return ..()
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
if(!helmettype)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 7f87245bf41..4b298b11009 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -323,7 +323,7 @@
SetOpacity(0)
if(buckled_mob)
unbuckle_mob()
- ..()
+ return ..()
/obj/effect/spacevine/proc/on_chem_effect(datum/reagent/R)
var/override = 0
@@ -423,7 +423,7 @@
/obj/effect/spacevine_controller/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/effect/spacevine_controller/proc/spawn_spacevine_piece(turf/location, obj/effect/spacevine/parent, list/muts)
var/obj/effect/spacevine/SV = new(location)
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index 9222cd16304..1fbaecb1a99 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -78,4 +78,4 @@
M.color = initial(M.color)
message += "..."
M << message
- ..()
\ No newline at end of file
+ return ..()
\ No newline at end of file
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 64a7e9fc72f..46a6f1e7429 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -107,6 +107,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/Destroy()
if(target.client) target.client.images.Remove(current_image)
active = 0
+ return ..()
#define FAKE_FLOOD_EXPAND_TIME 30
#define FAKE_FLOOD_MAX_RADIUS 7
@@ -160,7 +161,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
if(target.client) target.client.images.Remove(flood_images)
target = null
qdel(flood_images)
- return
+ return ..()
/obj/effect/hallucination/simple/xeno
image_icon = 'icons/mob/alien.dmi'
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index 51203df2505..326387e3971 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -223,7 +223,7 @@
if(contents)
for(var/atom/movable/something in contents)
something.loc = get_turf(src)
- ..()
+ return ..()
/obj/item/weapon/reagent_containers/food/snacks/attack_animal(mob/M)
if(isanimal(M))
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index f27866be2d2..daf06bb781f 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -305,7 +305,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow/Destroy()
if(istype(loc,/mob))
loc.AddLuminosity(round(-potency / 5,1))
- ..()
+ return ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow/pickup(mob/user)
src.SetLuminosity(0)
@@ -1208,7 +1208,7 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/Destroy()
if(istype(loc,/mob))
loc.AddLuminosity(round(-potency / 10,1))
- ..()
+ return ..()
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/pickup(mob/user)
SetLuminosity(0)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 13ca44627a0..54d992c080a 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -69,7 +69,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
qdel(ghostimage)
ghostimage = null
updateallghostimages()
- ..()
+ return ..()
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0)
return 1
diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm
index a58fd4401a4..3f7bfba90cf 100644
--- a/code/modules/mob/living/bloodcrawl.dm
+++ b/code/modules/mob/living/bloodcrawl.dm
@@ -1,94 +1,6 @@
-//Travel through pools of blood. Slaughter Demon powers for everyone!
-
#define BLOODCRAWL 1
#define BLOODCRAWL_EAT 2
-/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
- var/mob/living/kidnapped = null
- var/turf/mobloc = get_turf(src.loc)
- var/turf/bloodloc = get_turf(B.loc)
- if(Adjacent(bloodloc))
- src.notransform = TRUE
- spawn(0)
- src.visible_message("[src] sinks into the pool of blood.")
- playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
- var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
- src.ExtinguishMob()
- if(src.buckled)
- src.buckled.unbuckle_mob()
- if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT)
- if(istype(src.pulling, /mob/living))
- var/mob/living/victim = src.pulling
- if(victim.stat == CONSCIOUS)
- src.visible_message("[victim] kicks free of the [src] at the last second!")
- else
- victim.loc = holder
- src.visible_message("The [src] drags [victim] into the pool of blood!")
- kidnapped = victim
- src.loc = holder
- src.holder = holder
- if(kidnapped)
- src << "You begin to feast on [kidnapped]. You can not move while you are doing this."
- playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
- sleep(30)
- playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
- sleep(30)
- playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
- sleep(30)
- if(kidnapped)
- src << "You devour [kidnapped]. Your health is fully restored."
- src.adjustBruteLoss(-1000)
- src.adjustFireLoss(-1000)
- src.adjustOxyLoss(-1000)
- src.adjustToxLoss(-1000)
- kidnapped.ghostize()
- qdel(kidnapped)
- else
- src << "You happily devour...nothing? Your meal vanished at some point!"
- src.notransform = 0
-
-/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
- if(src.notransform)
- src << "Finish eating first!"
- else
- src.loc = B.loc
- src.client.eye = src
- src.visible_message("The [src] rises out of the pool of blood!")
- playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
- qdel(src.holder)
- src.holder = null
-
-/obj/effect/decal/cleanable/blood/CtrlClick(mob/living/user)
- ..()
- if(user.bloodcrawl)
- if(user.holder)
- user.phasein(src)
- else
- user.phaseout(src)
-
-
-/obj/effect/decal/cleanable/trail_holder/CtrlClick(mob/living/user)
- ..()
- if(user.bloodcrawl)
- if(user.holder)
- user.phasein(src)
- else
- user.phaseout(src)
-
-
-
-/turf/CtrlClick(var/mob/living/user)
- ..()
- if(user.bloodcrawl)
- for(var/obj/effect/decal/cleanable/B in src.contents)
- if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
- if(user.holder)
- user.phasein(B)
- break
- else
- user.phaseout(B)
- break
-
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
name = "water"
icon = 'icons/effects/effects.dmi'
@@ -116,3 +28,59 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
/obj/effect/dummy/slaughter/Destroy()
return QDEL_HINT_PUTINPOOL
+
+
+/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
+ var/mob/living/kidnapped = null
+ var/turf/mobloc = get_turf(src.loc)
+ src.notransform = TRUE
+ spawn(0)
+ src.visible_message("[src] sinks into the pool of blood.")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
+ src.ExtinguishMob()
+ if(src.buckled)
+ src.buckled.unbuckle_mob()
+ if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT)
+ if(istype(src.pulling, /mob/living))
+ var/mob/living/victim = src.pulling
+ if(victim.stat == CONSCIOUS)
+ src.visible_message("[victim] kicks free of the [src] at the last second!")
+ else
+ victim.loc = holder
+ src.visible_message("The [src] drags [victim] into the pool of blood!")
+ kidnapped = victim
+ src.loc = holder
+ src.holder = holder
+ if(kidnapped)
+ src << "You begin to feast on [kidnapped]. You can not move while you are doing this."
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
+ sleep(30)
+ if(kidnapped)
+ src << "You devour [kidnapped]. Your health is fully restored."
+ src.adjustBruteLoss(-1000)
+ src.adjustFireLoss(-1000)
+ src.adjustOxyLoss(-1000)
+ src.adjustToxLoss(-1000)
+ kidnapped.ghostize()
+ qdel(kidnapped)
+ else
+ src << "You happily devour...nothing? Your meal vanished at some point!"
+ src.notransform = 0
+
+/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
+ if(src.notransform)
+ src << "Finish eating first!"
+ return 0
+
+ src.loc = B.loc
+ src.client.eye = src
+ src.visible_message("The [src] rises out of the pool of blood!")
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ qdel(src.holder)
+ src.holder = null
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm
index c1009164427..387c67ec242 100644
--- a/code/modules/mob/living/carbon/alien/say.dm
+++ b/code/modules/mob/living/carbon/alien/say.dm
@@ -8,7 +8,7 @@
message = trim(message)
if(!message) return
- var/message_a = say_quote(message)
+ var/message_a = say_quote(message, get_spans())
var/rendered = "Hivemind, [shown_name] [message_a]"
for(var/mob/S in player_list)
if((!S.stat && S.hivecheck()) || (S in dead_mob_list))
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index a7360f8ef65..248d147de43 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -147,7 +147,7 @@
if(brainmob)
qdel(brainmob)
brainmob = null
- ..()
+ return ..()
/obj/item/device/mmi/examine(mob/user)
..()
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 44594f60c67..48b71893397 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -13,7 +13,7 @@
if(stat!=DEAD) //If not dead.
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
ghostize() //Ghostize checks for key so nothing else is necessary.
- ..()
+ return ..()
/mob/living/carbon/brain/update_canmove()
if(in_contents_of(/obj/mecha)) canmove = 1
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 21e701b4940..981facfcc9b 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -112,7 +112,7 @@
if(brainmob)
qdel(brainmob)
brainmob = null
- ..()
+ return ..()
/obj/item/organ/internal/brain/alien
name = "alien brain"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index be552c4aedb..a6d1e8857b6 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -8,7 +8,7 @@
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
-#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
+#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
@@ -123,7 +123,7 @@
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
bodytemperature += 11
else
- bodytemperature += BODYTEMP_HEATING_MAX
+ bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 12))
/mob/living/carbon/human/IgniteMob()
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 5fbd65c7037..0d5b4cd0444 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -2,6 +2,9 @@
set invisibility = 0
set background = BACKGROUND_ENABLED
+ if(digitalinvis)
+ handle_diginvis() //AI becomes unable to see mob
+
if (notransform)
return
if(!loc)
@@ -66,6 +69,14 @@
/mob/living/proc/handle_chemicals_in_body()
return
+/mob/living/proc/handle_diginvis()
+ if(!digitaldisguise)
+ src.digitaldisguise = image(loc = src)
+ src.digitaldisguise.override = 1
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI.client.images |= src.digitaldisguise
+
+
/mob/living/proc/handle_blood()
return
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2578a8a774e..6ba4a45ef3c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -883,7 +883,7 @@ Sorry Giacom. Please don't be mad :(
return 0
if(invisibility || alpha == 0)//cloaked
return 0
- if(digitalcamo)
+ if(digitalcamo || digitalinvis)
return 0
// Now, are they viewable by a camera? (This is last because it's the most intensive check)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 9a332445538..1fdcbad8cbb 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -133,7 +133,7 @@
if(!on_fire)
return 1
if(fire_stacks > 0)
- adjust_fire_stacks(-0.2) //the fire is slowly consumed
+ adjust_fire_stacks(-0.1) //the fire is slowly consumed
else
ExtinguishMob()
return
@@ -145,7 +145,7 @@
location.hotspot_expose(700, 50, 1)
/mob/living/fire_act()
- adjust_fire_stacks(0.5)
+ adjust_fire_stacks(3)
IgniteMob()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 0bc233bc351..8fa8325119f 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -147,7 +147,7 @@ var/list/ai_list = list()
shuttle_caller_list -= src
SSshuttle.autoEvac()
qdel(eyeobj) // No AI, no Eye
- ..()
+ return ..()
/mob/living/silicon/ai/verb/pick_icon()
@@ -300,9 +300,8 @@ var/list/ai_list = list()
onclose(src, "airoster")
/mob/living/silicon/ai/proc/ai_call_shuttle()
- if(src.stat == DEAD)
- src << "You can't call the shuttle because you are dead!"
- return
+ if(stat == 2)
+ return //won't work if dead
if(istype(usr,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
@@ -330,6 +329,8 @@ var/list/ai_list = list()
set name = "Toggle Floor Bolts"
if(!isturf(loc)) // if their location isn't a turf
return // stop
+ if(stat == 2)
+ return //won't work if dead
anchored = !anchored // Toggles the anchor
src << "[anchored ? "You are now anchored." : "You are now unanchored."]"
@@ -340,9 +341,8 @@ var/list/ai_list = list()
/mob/living/silicon/ai/proc/ai_cancel_call()
set category = "Malfunction"
- if(src.stat == 2)
- src << "You can't send the shuttle back because you are dead!"
- return
+ if(stat == 2)
+ return //won't work if dead
if(istype(usr,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
@@ -507,8 +507,7 @@ var/list/ai_list = list()
set name = "Access Robot Control"
set desc = "Wirelessly control various automatic robots."
if(stat == 2)
- src << "Critical error. System offline."
- return
+ return //won't work if dead
if(control_disabled)
src << "Wireless communication is disabled."
@@ -623,9 +622,8 @@ var/list/ai_list = list()
cameraFollow = null
var/cameralist[0]
- if(usr.stat == 2)
- usr << "You can't change your camera network because you are dead!"
- return
+ if(stat == 2)
+ return //won't work if dead
var/mob/living/silicon/ai/U = usr
@@ -668,9 +666,8 @@ var/list/ai_list = list()
set category = "AI Commands"
set name = "AI Status"
- if(usr.stat == 2)
- usr <<"You cannot change your emotional status because you are dead!"
- return
+ if(stat == 2)
+ return //won't work if dead
var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow")
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
for (var/obj/machinery/M in machines) //change status
@@ -693,6 +690,8 @@ var/list/ai_list = list()
set desc = "Change the default hologram available to AI to something else."
set category = "AI Commands"
+ if(stat == 2)
+ return //won't work if dead
var/input
if(alert("Would you like to select a hologram based on a crew member or switch to unique avatar?",,"Crew Member","Unique")=="Crew Member")
@@ -788,6 +787,8 @@ var/list/ai_list = list()
set desc = "Allows you to change settings of your radio."
set category = "AI Commands"
+ if(stat == 2)
+ return //won't work if dead
src << "Accessing Subspace Transceiver control..."
if (radio)
radio.interact(src)
@@ -801,6 +802,8 @@ var/list/ai_list = list()
set desc = "Modify the default radio setting for your automatic announcements."
set category = "AI Commands"
+ if(stat == 2)
+ return //won't work if dead
set_autosay()
/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user)
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 25b8bd2b310..2bdbcd8c805 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -8,6 +8,7 @@
else
icon_state = "ai_dead"
+ anchored = 0 //unbolt floorbolts
update_canmove()
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 30918bbcec3..f3569d4c503 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -38,7 +38,7 @@
/mob/camera/aiEye/Destroy()
ai = null
- ..()
+ return ..()
/atom/proc/move_camera_by_click()
if(istype(usr, /mob/living/silicon/ai))
@@ -100,5 +100,7 @@
set category = "AI Commands"
set name = "Toggle Camera Acceleration"
+ if(usr.stat == 2)
+ return //won't work if dead
acceleration = !acceleration
usr << "Camera acceleration has been toggled [acceleration ? "on" : "off"]."
diff --git a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
index 2b69c20cd65..3f9d11301a4 100644
--- a/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
@@ -26,7 +26,7 @@
/obj/structure/Destroy()
if(ticker)
cameranet.updateVisibility(src)
- ..()
+ return ..()
/obj/structure/New()
..()
@@ -38,7 +38,7 @@
/obj/effect/Destroy()
if(ticker)
cameranet.updateVisibility(src)
- ..()
+ return ..()
/obj/effect/New()
..()
@@ -94,6 +94,6 @@
/obj/machinery/camera/Destroy()
cameranet.cameras -= src
cameranet.removeCamera(src)
- ..()
+ return ..()
#undef BORG_CAMERA_BUFFER
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm
index 8371f6e3021..50c188ca629 100644
--- a/code/modules/mob/living/silicon/ai/laws.dm
+++ b/code/modules/mob/living/silicon/ai/laws.dm
@@ -2,6 +2,8 @@
/mob/living/silicon/ai/proc/show_laws_verb()
set category = "AI Commands"
set name = "Show Laws"
+ if(usr.stat == 2)
+ return //won't work if dead
src.show_laws()
/mob/living/silicon/ai/show_laws(everyone = 0)
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index 86158b3c4f0..014dd45b84c 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -69,6 +69,8 @@ var/const/VOX_DELAY = 600
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
+ if(usr.stat == 2)
+ return //won't work if dead
var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\
- You can also click on the word to preview it.
\
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 0f40c5d5817..96439b2d1a5 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -23,6 +23,7 @@
return
if(!gibbed)
emote("deathgasp")
+ locked = 0 //unlock cover
stat = DEAD
update_canmove()
if(camera)
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index 337ca2118f0..da45ee8e9ad 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -1,6 +1,9 @@
/mob/living/silicon/robot/verb/cmd_show_laws()
set category = "Robot Commands"
set name = "Show Laws"
+
+ if(usr.stat == DEAD)
+ return //won't work if dead
show_laws()
/mob/living/silicon/robot/show_laws(everyone = 0)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index ffd853680ce..9a160fb67fe 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -9,6 +9,7 @@
var/custom_name = ""
designation = "Default" //used for displaying the prefix & getting the current module of cyborg
has_limbs = 1
+ var/magpulse = 0
//Hud stuff
@@ -36,6 +37,7 @@
var/opened = 0
var/emagged = 0
+ var/emag_cooldown = 0
var/wiresexposed = 0
var/locked = 1
var/list/req_access = list(access_robotics)
@@ -219,6 +221,7 @@
animation_length = 45
modtype = "Eng"
feedback_inc("cyborg_engineering",1)
+ magpulse = 1
if("Janitor")
module = new /obj/item/weapon/robot_module/janitor(src)
@@ -261,6 +264,8 @@
/mob/living/silicon/robot/verb/cmd_robot_alerts()
set category = "Robot Commands"
set name = "Show Alerts"
+ if(usr.stat == DEAD)
+ return //won't work if dead
robot_alerts()
//for borg hotkeys, here module refers to borg inv slot, not core module
@@ -576,11 +581,26 @@
user << "The cover is already unlocked!"
return
if(opened)//Cover is open
- if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
+ if((world.time - 100) < emag_cooldown)
+ return
+
+ var/ai_is_antag = 0
+ if(connected_ai && connected_ai.mind)
+ if(connected_ai.mind.special_role)
+ ai_is_antag = (connected_ai.mind.special_role == "malfunction") || (connected_ai.mind.special_role == "traitor")
+ if(ai_is_antag)
+ user << "You emag [src]'s interface."
+ src << "ALERT: Foreign software execution prevented."
+ connected_ai << "ALERT: Cyborg unit \[[src]] successfuly defended against subversion."
+ log_game("[key_name(user)] attempted to emag cyborg [key_name(src)] slaved to traitor AI [connected_ai].")
+ emag_cooldown = world.time
+ return
+
if(wiresexposed)
user << "You must close the cover first!"
return
else
+ emag_cooldown = world.time
sleep(6)
SetEmagged(1)
SetLockdown(1) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
@@ -619,6 +639,8 @@
set category = "Robot Commands"
set name = "Unlock Cover"
set desc = "Unlocks your own cover if it is locked. You can not lock it again. A human will have to lock it for you."
+ if(stat == DEAD)
+ return //won't work if dead
if(locked)
switch(alert("You can not lock your cover again, are you sure?\n (You can still ask for a human to lock it)", "Unlock Own Cover", "Yes", "No"))
if("Yes")
@@ -984,12 +1006,17 @@
set category = "Robot Commands"
set name = "State Laws"
+ if(usr.stat == DEAD)
+ return //won't work if dead
checklaws()
/mob/living/silicon/robot/verb/set_automatic_say_channel() //Borg version of setting the radio for autosay messages.
set name = "Set Auto Announce Mode"
set desc = "Modify the default radio setting for stating your laws."
set category = "Robot Commands"
+
+ if(usr.stat == DEAD)
+ return //won't work if dead
set_autosay()
/mob/living/silicon/robot/proc/control_headlamp()
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index d459886311c..bb643c16811 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -13,3 +13,13 @@
tally = speed
return tally+config.robot_delay
+
+/mob/living/silicon/robot/mob_negates_gravity()
+ return magpulse
+
+/mob/living/silicon/robot/mob_has_gravity()
+ return ..() || mob_negates_gravity()
+
+/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
+ if(!magpulse)
+ return ..()
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index e022b8991a4..fa112f3186e 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -10,7 +10,7 @@
if(istype(src, /mob/living/silicon))
var/mob/living/silicon/S = src
desig = trim_left(S.designation + " " + S.job)
- var/message_a = say_quote(message)
+ var/message_a = say_quote(message, get_spans())
var/rendered = "Robotic Talk, [name] [message_a]"
for(var/mob/M in player_list)
if(M.binarycheck() || (M in dead_mob_list))
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index ac0bab34649..2c60049656a 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -80,7 +80,7 @@
/mob/living/simple_animal/drone/Destroy()
qdel(access_card) //Otherwise it ends up on the floor!
- ..()
+ return ..()
/mob/living/simple_animal/drone/Login()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 440798466fb..2a1a2e140e7 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -25,11 +25,14 @@
melee_damage_upper = 2
environment_smash = 0
stop_automated_movement_when_pulled = 1
- var/datum/reagents/udder = null
+ var/obj/udder/udder = null
/mob/living/simple_animal/hostile/retaliate/goat/New()
- udder = new(50)
- udder.my_atom = src
+ udder = new()
+ ..()
+/mob/living/simple_animal/hostile/retaliate/goat/Destroy()
+ qdel(udder)
+ udder = null
..()
/mob/living/simple_animal/hostile/retaliate/goat/Life()
@@ -43,15 +46,11 @@
enemies = list()
LoseTarget()
src.visible_message("[src] calms down.")
-
if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
-
+ udder.generateMilk()
if(locate(/obj/effect/spacevine) in loc)
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
SV.eat(src)
-
if(!pulledby)
for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
var/step = get_step(src, direction)
@@ -70,18 +69,12 @@
var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
SV.eat(src)
-
/mob/living/simple_animal/hostile/retaliate/goat/attackby(obj/item/O, mob/user, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
- user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].")
- var/obj/item/weapon/reagent_containers/glass/G = O
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "[O] is full!"
- if(!transfered)
- user << "The udder is dry! Wait a bit longer..."
+ udder.milkAnimal(O, user)
else
..()
+
//cow
/mob/living/simple_animal/cow
name = "cow"
@@ -104,31 +97,28 @@
attacktext = "kicks"
attack_sound = 'sound/weapons/punch1.ogg'
health = 50
- var/datum/reagents/udder = null
+ var/obj/udder/udder = null
gold_core_spawnable = 2
/mob/living/simple_animal/cow/New()
- udder = new(50)
- udder.my_atom = src
+ udder = new()
+ ..()
+
+/mob/living/simple_animal/cow/Destroy()
+ qdel(udder)
+ udder = null
..()
/mob/living/simple_animal/cow/attackby(obj/item/O, mob/user, params)
if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
- user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].")
- var/obj/item/weapon/reagent_containers/glass/G = O
- var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
- if(G.reagents.total_volume >= G.volume)
- user << "[O] is full."
- if(!transfered)
- user << "The udder is dry. Wait a bit longer..."
+ udder.milkAnimal(O, user)
else
..()
/mob/living/simple_animal/cow/Life()
. = ..()
if(stat == CONSCIOUS)
- if(udder && prob(5))
- udder.add_reagent("milk", rand(5, 10))
+ udder.generateMilk()
/mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M)
if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
@@ -277,3 +267,29 @@ var/global/chicken_count = 0
qdel(src)
else
SSobj.processing.Remove(src)
+
+/obj/udder
+
+/obj/udder/New()
+ reagents = new(50)
+ reagents.my_atom = src
+ reagents.add_reagent("milk", 20)
+
+/obj/udder/proc/generateMilk()
+ if(prob(5))
+ reagents.add_reagent("milk", rand(5, 10))
+
+/obj/udder/proc/milkAnimal(obj/O, mob/user)
+ var/obj/item/weapon/reagent_containers/glass/G = O
+ if(G.reagents.total_volume >= G.volume)
+ user << "[O] is full."
+ return
+ var/transfered = reagents.trans_id_to(G, "milk", rand(5,10))
+ if(transfered)
+ user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].")
+ else
+ user << "The udder is dry. Wait a bit longer..."
+
+/obj/udder/Destroy()
+ qdel(reagents)
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index ea02c118e75..f0868f2ad23 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -114,6 +114,7 @@
set category = "Guardian"
set desc = "Communicate telepathically with your summoner."
var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
+ if(!input) return
for(var/mob/M in mob_list)
if(M == src.summoner || (M in dead_mob_list))
@@ -125,6 +126,7 @@
set category = "Guardian"
set desc = "Communicate telepathically with your guardian."
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
+ if(!input) return
for(var/mob/M in mob_list)
if(istype (M, /mob/living/simple_animal/hostile/guardian))
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index fa43d85572e..872d9ec94d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -27,14 +27,27 @@
emote_taunt = list("growls")
taunt_chance = 20
- //Space carp aren't affected by atmos.
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ atmos_requirements = list("min_oxy" = 2, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ unsuitable_atmos_damage = 5
minbodytemp = 0
+ maxbodytemp = 1200
faction = list("hostile")
var/drop_type = /obj/item/stack/sheet/mineral/wood
gold_core_spawnable = 1
+/mob/living/simple_animal/hostile/tree/Life()
+ ..()
+ if(istype(src.loc, /turf/simulated))
+ var/turf/simulated/T = src.loc
+ if(T.air)
+ var/co2 = T.air.carbon_dioxide
+ if(co2 > 0)
+ if(prob(25))
+ var/amt = min(co2, 9)
+ T.air.carbon_dioxide -= amt
+ T.atmos_spawn_air(SPAWN_OXYGEN, amt)
+
/mob/living/simple_animal/hostile/tree/AttackingTarget()
..()
if(iscarbon(target))
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
index cae68cbd87b..eb3c6986a31 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm
@@ -55,7 +55,7 @@
/mob/living/simple_animal/slaughter/phasein()
- ..()
+ . = ..()
speed = 0
boost = world.time + 30
@@ -71,7 +71,12 @@
/obj/item/weapon/demonheart/attack_self(mob/living/user)
visible_message("[user] feasts upon the [src].")
+ for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
+ if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
+ user <<"You already know how to blood crawl."
+ qdel(src)
+ return
user << "You absorb some of the demon's power!"
- user.bloodcrawl = BLOODCRAWL
+ user.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl)
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
index de3e477ab6d..167dd6b9683 100644
--- a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
+++ b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm
@@ -42,6 +42,9 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = "Slaughter Demon"
+ var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
+ bloodspell.phased = 1
+ player_mind.AddSpell(bloodspell)
ticker.mode.traitors |= player_mind
S << S.playstyle_string
S << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest."
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index e5dd2c589dc..46dc37f5cf0 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -8,7 +8,7 @@
for(var/infection in viruses)
qdel(infection)
ghostize()
- ..()
+ return ..()
/mob/proc/sac_act(obj/effect/rune/R, mob/victim)
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 51fd9bece6f..c68c7aff915 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -139,6 +139,9 @@
var/area/lastarea = null
var/digitalcamo = 0 // Can they be tracked by the AI?
+ var/digitalinvis = 0 //Are they ivisible to the AI?
+ var/image/digitaldisguise = null //what does the AI see instead of them?
+
var/weakeyes = 0 //Are they vulnerable to flashes?
var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index fa3a9bb4bbc..e18d8be2749 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -44,7 +44,7 @@
assailant.client.screen -= hud
assailant = null
qdel(hud)
- ..()
+ return ..()
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
/obj/item/weapon/grab/proc/get_mob_if_throwable()
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 95ac2edf15f..71bd77ffef5 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -39,7 +39,7 @@
if(name != real_name)
alt_name = " (died as [real_name])"
- message = src.say_quote(message)
+ message = src.say_quote(message, get_spans())
var/rendered = "DEAD: [name][alt_name] [message]"
for(var/mob/M in player_list)
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 5fcca544ae9..d3aba358c3c 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -86,7 +86,7 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/Destroy()
if(affecting)
affecting << browse(null, "window=hack spideros")
- ..()
+ return ..()
//Simply deletes all the attachments and self, killing all related procs.
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 6e0f9b5e979..219449f1228 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -3,6 +3,7 @@
* Pens
* Sleepy Pens
* Parapens
+ * Edaggers
*/
@@ -48,13 +49,17 @@
if(!istype(M))
return
- if(M.can_inject(user, 1))
- user << "You stab [M] with the pen."
- if(!stealth)
- M << "You feel a tiny prick!"
- . = 1
+ if(!force)
+ if(M.can_inject(user, 1))
+ user << "You stab [M] with the pen."
+ if(!stealth)
+ M << "You feel a tiny prick!"
+ . = 1
- add_logs(user, M, "stabbed", src)
+ add_logs(user, M, "stabbed", src)
+
+ else
+ . = ..()
/*
* Sleepypens
@@ -77,4 +82,43 @@
reagents.add_reagent("morphine", 20)
reagents.add_reagent("mutetoxin", 15)
reagents.add_reagent("tirizene", 10)
- ..()
+ ..()
+
+/*
+ * (Alan) Edaggers
+ */
+/obj/item/weapon/pen/edagger
+ origin_tech = "combat=3;syndicate=5"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off
+ var/on = 0
+
+/obj/item/weapon/pen/edagger/attack_self(mob/living/user)
+ if(on)
+ on = 0
+ force = initial(force)
+ w_class = initial(w_class)
+ name = initial(name)
+ hitsound = initial(hitsound)
+ embed_chance = initial(embed_chance)
+ throwforce = initial(throwforce)
+ playsound(user, 'sound/weapons/saberoff.ogg', 5, 1)
+ user << "[src] can now be concealed."
+ else
+ on = 1
+ force = 18
+ w_class = 3
+ name = "energy dagger"
+ hitsound = 'sound/weapons/blade1.ogg'
+ embed_chance = 100 //rule of cool
+ throwforce = 35
+ playsound(user, 'sound/weapons/saberon.ogg', 5, 1)
+ user << "[src] is now active."
+ update_icon()
+
+/obj/item/weapon/pen/edagger/update_icon()
+ if(on)
+ icon_state = "edagger"
+ item_state = "edagger"
+ else
+ icon_state = initial(icon_state) //looks like a normal pen when off.
+ item_state = initial(item_state)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 770673d47bb..321c69f15ba 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -131,6 +131,8 @@
set name = "Print Image"
set src in usr
+ if(usr.stat == DEAD)
+ return //won't work if dead
borgprint()
/obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user)
diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm
index 41be20dc92f..dd3bd7bd464 100644
--- a/code/modules/power/antimatter/control.dm
+++ b/code/modules/power/antimatter/control.dm
@@ -38,7 +38,7 @@
/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others
for(var/obj/machinery/am_shielding/AMS in linked_shielding)
qdel(AMS)
- ..()
+ return ..()
/obj/machinery/power/am_control_unit/process()
diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm
index 1631f501fa7..87392fd982f 100644
--- a/code/modules/power/antimatter/shielding.dm
+++ b/code/modules/power/antimatter/shielding.dm
@@ -68,7 +68,7 @@
if(processing) shutdown_core()
visible_message("The [src.name] melts!")
//Might want to have it leave a mess on the floor but no sprites for now
- ..()
+ return ..()
/obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 02c9e1adfca..f1526aeab3c 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -90,7 +90,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(powernet)
cut_cable_from_powernet() // update the powernets
cable_list -= src //remove it from global cable list
- ..() // then go ahead and delete the cable
+ return ..() // then go ahead and delete the cable
/obj/structure/cable/Deconstruct()
var/turf/T = loc
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index be09fdadd38..8eb7af7db8f 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -58,7 +58,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
set_broken()
if(main_part)
qdel(main_part)
- ..()
+ return ..()
//
// Part generator which is mostly there for looks
@@ -126,7 +126,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
for(var/obj/machinery/gravity_generator/part/O in parts)
O.main_part = null
qdel(O)
- ..()
+ return ..()
/obj/machinery/gravity_generator/main/proc/setup_parts()
var/turf/our_turf = get_turf(src)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 25f1bb088c1..828f9b4e09f 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -208,7 +208,7 @@
if(A)
on = 0
// A.update_lights()
- ..()
+ return ..()
/obj/machinery/light/update_icon()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 37a75156cc8..f15b2385247 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -119,7 +119,7 @@ display round(lastgen) and plasmatank amount
/obj/machinery/power/port_gen/pacman/Destroy()
DropFuel()
- ..()
+ return ..()
/obj/machinery/power/port_gen/pacman/RefreshParts()
var/temp_rating = 0
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 1fbca84583c..b5a229778af 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -17,7 +17,7 @@
/obj/machinery/power/Destroy()
disconnect_from_network()
- ..()
+ return ..()
///////////////////////////////
// General procedures
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index 0ad877f987d..f8e8826294d 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -26,6 +26,7 @@
M.powernet = null
SSmachine.powernets -= src
+ return ..()
/datum/powernet/proc/is_empty()
return !cables.len && !nodes.len
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 3687d237bd2..aab80c9e97f 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -22,7 +22,7 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/Destroy()
rad_collectors -= src
- ..()
+ return ..()
/obj/machinery/power/rad_collector/process()
if(P)
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 08278a00ea7..7fc737afb46 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -19,7 +19,7 @@
FG1.cleanup()
if(FG2 && !FG2.clean_up)
FG2.cleanup()
- ..()
+ return ..()
/obj/machinery/field/containment/attack_hand(mob/user)
if(get_dist(src, user) > 1)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index ca08ffd7bc3..7cde13702a2 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -70,7 +70,7 @@
message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1)
log_game("Emitter deleted at ([x],[y],[z])")
investigate_log("deleted at ([x],[y],[z])","singulo")
- ..()
+ return ..()
/obj/machinery/power/emitter/update_icon()
if (active && powernet && avail(active_power_usage))
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 8f2701a4246..857741045c9 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -172,7 +172,7 @@ field_generator power level display
/obj/machinery/field/generator/Destroy()
src.cleanup()
- ..()
+ return ..()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 18a04d16f32..8030486fcd0 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -75,7 +75,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
construction_state = 0
if(master)
master.part_scan()
- ..()
+ return ..()
/obj/structure/particle_accelerator/end_cap
name = "Alpha Particle Generation Array"
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index ce2e87d82da..5d5b6d42153 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -42,7 +42,7 @@
/obj/singularity/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/singularity/Move(atom/newloc, direct)
if(current_size >= STAGE_FIVE || check_turfs_in(direct))
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 3bc6dbcfc36..2a402459d1b 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -159,6 +159,9 @@
//crowbarring it !
default_deconstruction_crowbar(I)
+ message_admins("[src] has been deconstructed by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
+ log_game("[src] has been deconstructed by [key_name(user)]")
+ investigate_log("SMES deconstructed by [key_name(user)]","singulo")
/obj/machinery/power/smes/Destroy()
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
@@ -168,7 +171,7 @@
investigate_log("deleted at ([area.name])","singulo")
if(terminal)
disconnect_terminal()
- ..()
+ return ..()
// create a terminal object pointing towards the SMES
// wires will attach to this
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 8375b2d8d4e..cbc325ef706 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -27,7 +27,7 @@
/obj/machinery/power/solar/Destroy()
unset_control() //remove from control computer
- ..()
+ return ..()
//set the control of the panel to a given computer if closer than SOLAR_MAX_DIST
/obj/machinery/power/solar/proc/set_control(obj/machinery/power/solar_control/SC)
@@ -308,7 +308,7 @@
M.unset_control()
if(connected_tracker)
connected_tracker.unset_control()
- ..()
+ return ..()
/obj/machinery/power/solar_control/disconnect_from_network()
..()
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index f85bdd99153..874b2ca1733 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -23,7 +23,7 @@
/obj/machinery/power/tracker/Destroy()
unset_control() //remove from control computer
- ..()
+ return ..()
//set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST
/obj/machinery/power/tracker/proc/set_control(obj/machinery/power/solar_control/SC)
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 9368401256e..6e095836457 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -81,7 +81,10 @@
gas_contained = new
inturf = get_step(src, dir)
- spawn(5)
+
+/obj/machinery/power/compressor/initialize()
+ ..()
+ spawn(10)
locate_machinery()
if(!turbine)
stat |= BROKEN
@@ -200,10 +203,10 @@
outturf = get_step(src, dir)
- spawn(5)
-
-// compressor is found in the opposite direction
+/obj/machinery/power/turbine/initialize()
+ ..()
+ spawn(10)
locate_machinery()
if(!compressor)
stat |= BROKEN
@@ -341,9 +344,9 @@
-/obj/machinery/computer/turbine_computer/New()
+/obj/machinery/computer/turbine_computer/initialize()
..()
- spawn(5)
+ spawn(10)
locate_machinery()
/obj/machinery/computer/turbine_computer/locate_machinery()
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index f6b625d1169..3c20121b19a 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -40,7 +40,7 @@
/obj/item/weapon/gun/energy/laser/captain/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/laser/captain/process()
@@ -122,7 +122,7 @@
/obj/item/weapon/gun/energy/laser/bluetag/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/laser/bluetag/process()
charge_tick++
@@ -154,7 +154,7 @@
/obj/item/weapon/gun/energy/laser/redtag/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/laser/redtag/process()
charge_tick++
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 89c73331581..3fa2f35d76c 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -64,7 +64,7 @@
/obj/item/weapon/gun/energy/gun/nuclear/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/gun/nuclear/process()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 1401c31937a..cb3c942ad25 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -61,7 +61,7 @@
/obj/item/weapon/gun/energy/floragun/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/floragun/process()
@@ -97,7 +97,7 @@
/obj/item/weapon/gun/energy/meteorgun/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/meteorgun/process()
charge_tick++
@@ -301,7 +301,7 @@
/obj/item/weapon/gun/energy/printer/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/printer/process()
charge_tick++
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 6659fe329cd..acd06b2eda3 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -38,7 +38,7 @@
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/gun/advtaser/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
@@ -78,7 +78,7 @@
/obj/item/weapon/gun/energy/disabler/cyborg/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/energy/disabler/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 645d078002e..b0ba982348e 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -56,7 +56,7 @@
/obj/item/weapon/gun/magic/Destroy()
if(can_charge) SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/gun/magic/process()
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 56a077bbfa0..02c818cdbf2 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -54,7 +54,7 @@ var/const/PATCH = 4 //patches
break // Don't bother adding ourselves to other reagent ids, it is redundant.
/datum/reagents/Destroy()
- ..()
+ . = ..()
SSobj.processing.Remove(src)
for(var/datum/reagent/R in reagent_list)
qdel(R)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index e3a2d4cc612..6800d140184 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -27,7 +27,7 @@
var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick.
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
- ..()
+ . = ..()
holder = null
/datum/reagent/proc/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 51d3caf2b15..84822634782 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -21,18 +21,18 @@
return
//I recommend you set the result amount to the total volume of all components.
-
+var/list/chemical_mob_spawn_meancritters = list() // list of possible hostile mobs
+var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_faction = "chemicalsummon")
if(holder && holder.my_atom)
- var/list/meancritters = list() // list of possible hostile mobs
- var/list/nicecritters = list() // and possible friendly mobs
- for(var/T in typesof(/mob/living/simple_animal))
- var/mob/living/simple_animal/M = new T
- switch(M.gold_core_spawnable)
- if(1)
- meancritters += M.type
- if(2)
- nicecritters += M.type
+ if (chemical_mob_spawn_meancritters.len <= 0 || chemical_mob_spawn_nicecritters.len <= 0)
+ for (var/T in typesof(/mob/living/simple_animal))
+ var/mob/living/simple_animal/SA = T
+ switch(initial(SA.gold_core_spawnable))
+ if(1)
+ chemical_mob_spawn_meancritters += T
+ if(2)
+ chemical_mob_spawn_nicecritters += T
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
@@ -54,9 +54,9 @@
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen
if (reaction_name == "Friendly Gold Slime")
- chosen = pick(nicecritters)
+ chosen = pick(chemical_mob_spawn_nicecritters)
else
- chosen = pick(meancritters)
+ chosen = pick(chemical_mob_spawn_meancritters)
var/mob/living/simple_animal/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index ab68ee49f79..b971a49f98a 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -43,7 +43,7 @@ Borg Hypospray
/obj/item/weapon/reagent_containers/borghypo/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index 3511e08142e..219785d1f33 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -17,7 +17,7 @@
/obj/structure/disposalholder/Destroy()
qdel(gas)
active = 0
- ..()
+ return ..()
// initialize a holder from the contents of a disposal unit
/obj/structure/disposalholder/proc/init(obj/machinery/disposal/D)
@@ -194,13 +194,12 @@
AM.loc = T
AM.pipe_eject(0)
qdel(H)
- ..()
- return
+ return ..()
// otherwise, do normal expel from turf
if(H)
expel(H, T, 0)
- ..()
+ return ..()
// returns the direction of the next pipe object, given the entrance dir
// by default, returns the bitmask of remaining directions
@@ -642,7 +641,7 @@
else if(istype(linked, /obj/machinery/disposal))
var/obj/machinery/disposal/D = linked
D.trunk = null
- ..()
+ return ..()
/obj/structure/disposalpipe/trunk/proc/getlinked()
linked = null
@@ -783,7 +782,7 @@
/obj/structure/disposaloutlet/Destroy()
if(trunk)
trunk.linked = null
- ..()
+ return ..()
// expel the contents of the holder object, then delete it
// called when the holder exits the outlet
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index a348aa86165..0e0153bb26a 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -49,7 +49,7 @@
eject()
if(trunk)
trunk.linked = null
- ..()
+ return ..()
/obj/machinery/disposal/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index df47b62e337..94b40c801a5 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -23,7 +23,7 @@
var/turf/T = get_turf(src)
for(var/atom/movable/AM in contents)
AM.loc = T
- ..()
+ return ..()
/obj/structure/bigDelivery/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/device/destTagger))
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 7dabb694a75..a80441f1e2d 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -266,6 +266,14 @@
build_path = /obj/item/weapon/reagent_containers/glass/beaker/large
category = list("initial", "Medical")
+/datum/design/healthanalyzer
+ name = "Health Analyzer"
+ id = "healthanalyzer"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 50)
+ build_path = /obj/item/device/healthanalyzer
+ category = list("initial", "Medical")
+
/datum/design/beanbag_slug
name = "Beanbag slug"
id = "beanbag_slug"
diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm
index 0f657da38b0..9748ab6ffbe 100644
--- a/code/modules/research/designs/comp_board_designs.dm
+++ b/code/modules/research/designs/comp_board_designs.dm
@@ -110,15 +110,6 @@
build_path = /obj/item/weapon/circuitboard/crew
category = list("Computer Boards")
-/datum/design/teleconsole
- name = "Computer Design (Teleporter Console)"
- desc = "Allows for the construction of circuit boards used to build a teleporter control console."
- id = "teleconsole"
- req_tech = list("programming" = 3, "bluespace" = 2)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/teleporter
- category = list("Computer Boards")
/datum/design/secdata
name = "Computer Design (Security Records Console)"
@@ -160,36 +151,6 @@
build_path = /obj/item/weapon/circuitboard/robotics
category = list("Computer Boards")
-/datum/design/clonecontrol
- name = "Computer Design (Cloning Machine Console)"
- desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console."
- id = "clonecontrol"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/cloning
- category = list("Computer Boards")
-
-/datum/design/clonepod
- name = "Machine Design (Clone Pod)"
- desc = "Allows for the construction of circuit boards used to build a Cloning Pod."
- id = "clonepod"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/clonepod
- category = list("Computer Boards")
-
-/datum/design/clonescanner
- name = "Machine Design (Cloning Scanner)"
- desc = "Allows for the construction of circuit boards used to build a Cloning Scanner."
- id = "clonescanner"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/clonescanner
- category = list("Computer Boards")
-
/datum/design/arcadebattle
name = "Computer Design (Battle Arcade Machine)"
desc = "Allows for the construction of circuit boards used to build a new arcade machine."
@@ -350,16 +311,6 @@
build_path = /obj/item/weapon/circuitboard/comm_traffic
category = list("Computer Boards")
-/datum/design/telesci_console
- name = "Computer Design (Telepad Control Console Board)"
- desc = "Allows for the construction of circuit boards used to build a telescience console."
- id = "telesci_console"
- req_tech = list("programming" = 3, "bluespace" = 2)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/telesci_console
- category = list("Computer Boards")
-
/datum/design/aifixer
name = "Computer Design (AI Integrity Restorer)"
desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer."
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 75202c87387..828192263a2 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -32,6 +32,16 @@
build_path = /obj/item/weapon/circuitboard/turbine_computer
category = list ("Engineering Machinery")
+/datum/design/emitter
+ name = "Machine Design (Emitter Board)"
+ desc = "The circuit board for an emitter."
+ id = "emitter"
+ req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 5)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/emitter
+ category = list ("Engineering Machinery")
+
/datum/design/power_compressor
name = "Machine Design (Power Compressor Board)"
desc = "The circuit board for a power compressor."
@@ -92,6 +102,26 @@
build_path = /obj/item/weapon/circuitboard/telesci_pad
category = list ("Teleportation Machinery")
+/datum/design/teleconsole
+ name = "Computer Design (Teleporter Console)"
+ desc = "Allows for the construction of circuit boards used to build a teleporter control console."
+ id = "teleconsole"
+ req_tech = list("programming" = 3, "bluespace" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/teleporter
+ category = list("Teleportation Machinery")
+
+/datum/design/telesci_console
+ name = "Computer Design (Telepad Control Console Board)"
+ desc = "Allows for the construction of circuit boards used to build a telescience console."
+ id = "telesci_console"
+ req_tech = list("programming" = 3, "bluespace" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/telesci_console
+ category = list("Teleportation Machinery")
+
/datum/design/sleeper
name = "Machine Design (Sleeper Board)"
desc = "The circuit board for a sleeper."
@@ -142,6 +172,36 @@
build_path = /obj/item/weapon/circuitboard/chem_heater
category = list ("Medical Machinery")
+ /datum/design/clonecontrol
+ name = "Computer Design (Cloning Machine Console)"
+ desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console."
+ id = "clonecontrol"
+ req_tech = list("programming" = 3, "biotech" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/cloning
+ category = list("Medical Machinery")
+
+/datum/design/clonepod
+ name = "Machine Design (Clone Pod)"
+ desc = "Allows for the construction of circuit boards used to build a Cloning Pod."
+ id = "clonepod"
+ req_tech = list("programming" = 3, "biotech" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/clonepod
+ category = list("Medical Machinery")
+
+/datum/design/clonescanner
+ name = "Machine Design (Cloning Scanner)"
+ desc = "Allows for the construction of circuit boards used to build a Cloning Scanner."
+ id = "clonescanner"
+ req_tech = list("programming" = 3, "biotech" = 3)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/clonescanner
+ category = list("Medical Machinery")
+
/datum/design/biogenerator
name = "Machine Design (Biogenerator Board)"
desc = "The circuit board for a biogenerator."
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index c01225e38e1..329066dfa42 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -2,6 +2,7 @@
////////////Medical Tools////////////////
/////////////////////////////////////////
+
/datum/design/mass_spectrometer
name = "Mass-Spectrometer"
desc = "A device for analyzing chemicals in the blood."
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index acb72b88205..6282be27194 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -127,7 +127,9 @@
if(exchange_parts(user, O))
return
- default_deconstruction_crowbar(O)
+ if(panel_open && istype(O, /obj/item/weapon/crowbar))
+ default_deconstruction_crowbar(O)
+ return
if(!checkCircumstances(O))
user << "The [O] is not yet valid for the [src] and must be completed!"
@@ -138,10 +140,10 @@
if (!linked_console)
user << "The [src] must be linked to an R&D console first!"
return
- if (busy)
- user << "The [src] is busy right now."
+ if (loaded_item)
+ user << "The [src] is already loaded."
return
- if (istype(O, /obj/item) && !loaded_item)
+ if (istype(O, /obj/item))
if(!O.origin_tech)
user << "This doesn't seem to have a tech origin!"
return
@@ -154,7 +156,6 @@
return
if(!user.drop_item())
return
- busy = 1
loaded_item = O
O.loc = src
user << "You add the [O.name] to the machine."
@@ -544,7 +545,6 @@
spawn(resetTime)
icon_state = "h_lathe"
- busy = 0
recentlyExperimented = 0
/obj/machinery/r_n_d/experimentor/Topic(href, href_list)
@@ -562,7 +562,6 @@
if(D)
linked_console = D
else if(scantype == "eject")
- busy = 0
ejectItem()
else if(scantype == "refresh")
src.updateUsrDialog()
@@ -578,7 +577,7 @@
experiment(dotype,process)
use_power(750)
if(dotype != FAIL)
- if(process.origin_tech)
+ if(process && process.origin_tech)
var/list/temp_tech = ConvertReqString2List(process.origin_tech)
for(var/T in temp_tech)
linked_console.files.UpdateTech(T, temp_tech[T])
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 901d291e947..df6389820a8 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -96,8 +96,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/Destroy()
message_servers -= src
- ..()
- return
+ return ..()
/obj/machinery/message_server/proc/GenerateKey()
//Feel free to move to Helpers.
@@ -258,7 +257,7 @@ var/obj/machinery/blackbox_recorder/blackbox
BR.messages_admin = messages_admin
if(blackbox != BR)
blackbox = BR
- ..()
+ return ..()
/obj/machinery/blackbox_recorder/proc/find_feedback_datum(variable)
for (var/datum/feedback_variable/FV in feedback)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index af580b93b83..94751720d53 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -26,7 +26,7 @@
/obj/machinery/r_n_d/server/Destroy()
griefProtection()
- ..()
+ return ..()
/obj/machinery/r_n_d/server/RefreshParts()
var/tot_rating = 0
diff --git a/code/modules/scripting/Errors.dm b/code/modules/scripting/Errors.dm
index ed9d73b4e31..3b2b5a7de70 100644
--- a/code/modules/scripting/Errors.dm
+++ b/code/modules/scripting/Errors.dm
@@ -81,7 +81,7 @@
A basic description as to what went wrong.
*/
message
- stack/stack
+ datum/stack/stack
proc
/*
diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm
index 9aacf4f19f0..7b1b34ca81c 100644
--- a/code/modules/scripting/Interpreter/Interpreter.dm
+++ b/code/modules/scripting/Interpreter/Interpreter.dm
@@ -21,7 +21,7 @@
node
BlockDefinition/program
statement/FunctionDefinition/curFunction
- stack
+ datum/stack
scopes = new()
functions = new()
diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm
index 18245cac9c3..9386786a376 100644
--- a/code/modules/scripting/Parser/Expressions.dm
+++ b/code/modules/scripting/Parser/Expressions.dm
@@ -56,7 +56,7 @@
var
token/accessor/A=T
node/expression/value/variable/E//=new(A.member)
- stack/S=new()
+ datum/stack/S = new()
while(istype(A.object, /token/accessor))
S.Push(A)
A=A.object
@@ -130,7 +130,7 @@
Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top
of the val stack.
*/
- Reduce(stack/opr, stack/val)
+ Reduce(datum/stack/opr, datum/stack/val)
var/node/expression/operator/O=opr.Pop()
if(!O) return
if(!istype(O))
@@ -181,7 +181,7 @@
-
*/
ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}"), check_functions = 0)
- var/stack
+ var/datum/stack
opr=new
val=new
src.expecting=VALUE
diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm
index b3c6b8ac3c9..e2459cc9202 100644
--- a/code/modules/scripting/Parser/Parser.dm
+++ b/code/modules/scripting/Parser/Parser.dm
@@ -37,7 +37,7 @@
The token at in .
*/
curToken
- stack
+ datum/stack
blocks=new
node/BlockDefinition
GlobalBlock/global_block=new
diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm
deleted file mode 100644
index efea746e47a..00000000000
--- a/code/modules/scripting/stack.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/stack
- var/list
- contents=new
- proc
- Push(value)
- contents+=value
-
- Pop()
- if(!contents.len) return null
- . = contents[contents.len]
- contents.len--
-
- Top() //returns the item on the top of the stack without removing it
- if(!contents.len) return null
- return contents[contents.len]
-
- Copy()
- var/stack/S=new()
- S.contents=src.contents.Copy()
- return S
-
- Clear()
- contents.Cut()
\ No newline at end of file
diff --git a/code/modules/surgery/dethrall.dm b/code/modules/surgery/dethrall.dm
index c421e8ece6e..5a028336e9a 100644
--- a/code/modules/surgery/dethrall.dm
+++ b/code/modules/surgery/dethrall.dm
@@ -23,6 +23,7 @@
user << "You are unable to locate anything on [target]'s brain."
return 1
sleep(30)
+
user.visible_message("[user] begins removing something from [target]'s head.
", \
"You begin carefully extracting the tumor...")
if(!do_mob(user, target, 50))
@@ -34,6 +35,21 @@
else
user.visible_message("[user] screws up!")
return 0
+ if(target.dna.species.id == "l_shadowling")
+ target << "NOT LIKE THIS!"
+ user.visible_message("[target] suddenly slams upward and knocks down [user]!", \
+ "[target] suddenly bolts up and slams you with tremendous force!")
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.Weaken(6)
+ C.apply_damage(20, "brute", "chest")
+ else if(issilicon(user))
+ var/mob/living/silicon/S = user
+ S.Weaken(8)
+ S.apply_damage(20, "brute")
+ playsound(S, 'sound/effects/bang.ogg', 50, 1)
+ return
+
user.visible_message("[user] carefully extracts the tumor from [target]'s brain!", \
"You extract the black tumor from [target]'s head. It quickly shrivels and burns away.")
ticker.mode.remove_thrall(target.mind,0)
diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/generic_steps.dm
index 351e2eec06a..2eec6061949 100644
--- a/code/modules/surgery/generic_steps.dm
+++ b/code/modules/surgery/generic_steps.dm
@@ -2,7 +2,7 @@
//make incision
/datum/surgery_step/incise
name = "make incision"
- implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
+ implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/melee/energy/sword = 75, /obj/item/weapon/kitchen/knife = 65, /obj/item/weapon/shard = 45)
time = 16
/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -13,7 +13,7 @@
//clamp bleeders
/datum/surgery_step/clamp_bleeders
name = "clamp bleeders"
- implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/cable_coil = 15)
+ implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/wirecutters = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
time = 24
/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -74,7 +74,7 @@
//saw bone
/datum/surgery_step/saw
name = "saw bone"
- implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
+ implements = list(/obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/arm_blade = 75, /obj/item/weapon/twohanded/fireaxe = 50, /obj/item/weapon/hatchet = 35, /obj/item/weapon/kitchen/knife/butcher = 25)
time = 54
/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index f37761f55a2..2876ed2b780 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -54,7 +54,7 @@
/obj/item/organ/internal/Destroy()
if(owner)
Remove(owner, 1)
- ..()
+ return ..()
/obj/item/organ/internal/attack(mob/living/carbon/M, mob/user)
if(M == user && ishuman(user))
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 05eaa989580..7f37811240a 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -19,7 +19,7 @@ var/list/GPS_list = list()
/obj/item/device/gps/Destroy()
GPS_list.Remove(src)
- ..()
+ return ..()
/obj/item/device/gps/emp_act(severity)
emped = 1
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 4d585a48c8f..5305af689ab 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -127,7 +127,7 @@
/obj/item/weapon/rcs/Destroy()
SSobj.processing.Remove(src)
- ..()
+ return ..()
/obj/item/weapon/rcs/process()
if(rcharges > 10)
rcharges = 10
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 3e0a44925ea..a166eb69b0a 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -39,7 +39,7 @@
if(inserted_gps)
inserted_gps.loc = loc
inserted_gps = null
- ..()
+ return ..()
/obj/machinery/computer/telescience/examine(mob/user)
..()
diff --git a/code/orphaned procs/AStar.dm b/code/orphaned procs/AStar.dm
index 4f79d75e9d7..da152bdc8a0 100644
--- a/code/orphaned procs/AStar.dm
+++ b/code/orphaned procs/AStar.dm
@@ -45,70 +45,6 @@ length to avoid portals or something i guess?? Not that they're counted right no
// 4) adjacent = "/turf/proc/AdjacentTurfsSpace" and distance = "/turf/proc/Distance"
// Same as 1), but check all turf, including unsimulated
-//////////////////////
-//PriorityQueue object
-//////////////////////
-
-//an ordered list, using the cmp proc to weight the list elements
-/PriorityQueue
- var/list/L //the actual queue
- var/cmp //the weight function used to order the queue
-
-/PriorityQueue/New(compare)
- L = new()
- cmp = compare
-
-/PriorityQueue/proc/IsEmpty()
- return !L.len
-
-//add an element in the list,
-//immediatly ordering it to its position using Insertion sort
-/PriorityQueue/proc/Enqueue(atom/A)
- var/i
- L.Add(A)
- i = L.len -1
- while(i > 0 && call(cmp)(L[i],A) >= 0) //place the element at it's right position using the compare proc
- L.Swap(i,i+1) //last inserted element being first in case of ties (optimization)
- i--
-
-//removes and returns the first element in the queue
-/PriorityQueue/proc/Dequeue()
- if(!L.len)
- return 0
- . = L[1]
- Remove(.)
- return .
-
-//removes an element
-/PriorityQueue/proc/Remove(atom/A)
- return L.Remove(A)
-
-//returns a copy of the elements list
-/PriorityQueue/proc/List()
- var/list/ret = L.Copy()
- return ret
-
-//return the position of an element or 0 if not found
-/PriorityQueue/proc/Seek(atom/A)
- return L.Find(A)
-
-//return the element at the i_th position
-/PriorityQueue/proc/Get(i)
- if(i > L.len || i < 1)
- return 0
- return L[i]
-
-//replace the passed element at it's right position using the cmp proc
-/PriorityQueue/proc/ReSort(atom/A)
- var/i = Seek(A)
- if(i == 0)
- return
- while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
- L.Swap(i,i+1)
- i++
- while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
- L.Swap(i,i-1)
- i--
//////////////////////
//PathNode object
diff --git a/code/world.dm b/code/world.dm
index 9635e3fe995..66c089edf5d 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -130,6 +130,12 @@
#undef CHAT_PULLR
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
+ if (reason == 1) //special reboot, do none of the normal stuff
+ if (usr)
+ log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
+ message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
+ world << "Rebooting World immediately due to host request"
+ return ..(1)
var/delay
if(time)
delay = time
@@ -166,7 +172,6 @@
C << link("byond://[config.server]")
..(0)
-
/world/proc/load_mode()
var/list/Lines = file2list("data/mode.txt")
if(Lines.len)
diff --git a/html/changelog.html b/html/changelog.html
index 821377b3ad1..d7eb6d20081 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,57 @@
-->
+
01 September 2015
+
Dorsidwarf updated:
+
+ - Changelings' Digital Camoflague ability now renders them totally invisible to the AI
+
+
ExcessiveUseOfCobblestone updated:
+
+ - Added health analyzer to the autolathe.
+ - Moved Cloning board to Medical Machinery section.
+ - Moved Telesci stuff to Teleporter section.
+
+
Fox P McCloud updated:
+
+ - Adds the emitter board to to the circuit imprinter for R&D.
+
+
Gun Hog updated:
+
+ - The Disable RCD Malfunction power is now Destroy RCDs! It costs 25 CPU (down from 50), causes RCDs to explode, can be used multiple times, and no longer affects cyborgs.
+
+
Kor updated:
+
+ - Revheads and Gang leaders now spawn with chameleon security HUDs, for keeping track of loyalty implanted crew.
+ - Syndicate thermals now have a chameleon function as well, allowing you to disguise the goggles to match your job.
+
+
Miauw updated:
+
+ - Edaggers actually work now and have been buffed to 18 brute and 2 TC.
+
+
Oisin100 updated:
+
+ - Nanotransen discover ancient human knowledge confirming that trees produce Oxygen From Carbon Dioxide
+ - Trees now require Oxygen to live. And will die in extreme temperatures
+
+
Xhuis updated:
+
+ - The arcade machines have been stocked with a xenomorph action figure that comes with realistic sounds!
+ - Darksight now has its own icon.
+ - Empowered thralls have been added. While obvious, they are more powerful and can resist dethralling while conscious. Only 5 can exist at one time.
+ - Shadowlings can now change their night vision radius by using the action button their eyes (glasses) now provide.
+ - Torches are dimmer, being as bright as flashlights, and no longer fit on belts.
+ - Black Recuperation now has a 1 minute cooldown, down from 5. It can also be used to empower living thralls.
+ - Guise can now be used outside of darkness and makes the user more invisible than before.
+ - Enthrall now functions properly when a shadowling is not hatched, allowing them to enthrall up to 5 people before hatching.
+
+
xxalpha updated:
+
+ - Blood crawling is now a spell.
+ - Engineering cyborgs now have a constant magpulse.
+ - Changed foam spreading to be like gas spreading.
+
+
28 August 2015
bgobandit updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index b84356a720c..c9b25860c5f 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1653,3 +1653,48 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
(Burn first-aid kits now contain an appropriate burn pill.)'
- rscadd: Oxandrolone, a new burn healing medication, has been added to burn first-aid
kits and to chemistry. Ingesting 25 units or more causes burn and brute damage.
+2015-09-01:
+ Dorsidwarf:
+ - tweak: Changelings' Digital Camoflague ability now renders them totally invisible
+ to the AI
+ ExcessiveUseOfCobblestone:
+ - rscadd: Added health analyzer to the autolathe.
+ - tweak: Moved Cloning board to Medical Machinery section.
+ - tweak: Moved Telesci stuff to Teleporter section.
+ Fox P McCloud:
+ - tweak: Adds the emitter board to to the circuit imprinter for R&D.
+ Gun Hog:
+ - tweak: The Disable RCD Malfunction power is now Destroy RCDs! It costs 25 CPU
+ (down from 50), causes RCDs to explode, can be used multiple times, and no longer
+ affects cyborgs.
+ Kor:
+ - rscadd: Revheads and Gang leaders now spawn with chameleon security HUDs, for
+ keeping track of loyalty implanted crew.
+ - rscadd: Syndicate thermals now have a chameleon function as well, allowing you
+ to disguise the goggles to match your job.
+ Miauw:
+ - tweak: Edaggers actually work now and have been buffed to 18 brute and 2 TC.
+ Oisin100:
+ - rscadd: Nanotransen discover ancient human knowledge confirming that trees produce
+ Oxygen From Carbon Dioxide
+ - tweak: Trees now require Oxygen to live. And will die in extreme temperatures
+ Xhuis:
+ - rscadd: The arcade machines have been stocked with a xenomorph action figure that
+ comes with realistic sounds!
+ - rscadd: Darksight now has its own icon.
+ - rscadd: Empowered thralls have been added. While obvious, they are more powerful
+ and can resist dethralling while conscious. Only 5 can exist at one time.
+ - rscadd: Shadowlings can now change their night vision radius by using the action
+ button their eyes (glasses) now provide.
+ - tweak: Torches are dimmer, being as bright as flashlights, and no longer fit on
+ belts.
+ - tweak: Black Recuperation now has a 1 minute cooldown, down from 5. It can also
+ be used to empower living thralls.
+ - tweak: Guise can now be used outside of darkness and makes the user more invisible
+ than before.
+ - bugfix: Enthrall now functions properly when a shadowling is not hatched, allowing
+ them to enthrall up to 5 people before hatching.
+ xxalpha:
+ - tweak: Blood crawling is now a spell.
+ - rscadd: Engineering cyborgs now have a constant magpulse.
+ - tweak: Changed foam spreading to be like gas spreading.
diff --git a/html/changelogs/Shadowlight213-camerabugunshittening.yml b/html/changelogs/Shadowlight213-camerabugunshittening.yml
new file mode 100644
index 00000000000..031c45c61fa
--- /dev/null
+++ b/html/changelogs/Shadowlight213-camerabugunshittening.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# spellcheck (typo fixes)
+# experiment
+# tgs (TG-ported fixes?)
+#################################
+
+# Your name.
+author: Shadowlight213
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
+# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "The syndicate have taken notice of the camera bug's woeful underuse, and have managed to combine all of its upgrades into one!"
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 7419670c30b..23f5e04c7db 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index cb72485b1bc..dd7fdde2c7b 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/obj/doors/Dooratmo.dmi b/icons/obj/doors/Dooratmo.dmi
deleted file mode 100644
index b1ef018a370..00000000000
Binary files a/icons/obj/doors/Dooratmo.dmi and /dev/null differ
diff --git a/icons/obj/doors/Dooratmoglass.dmi b/icons/obj/doors/Dooratmoglass.dmi
deleted file mode 100644
index 2bf21ec57c4..00000000000
Binary files a/icons/obj/doors/Dooratmoglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorbananium.dmi b/icons/obj/doors/Doorbananium.dmi
deleted file mode 100644
index 43e843b155d..00000000000
Binary files a/icons/obj/doors/Doorbananium.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorcom.dmi b/icons/obj/doors/Doorcom.dmi
deleted file mode 100644
index f5bfb3521a8..00000000000
Binary files a/icons/obj/doors/Doorcom.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorcomglass.dmi b/icons/obj/doors/Doorcomglass.dmi
deleted file mode 100644
index e4a55d56038..00000000000
Binary files a/icons/obj/doors/Doorcomglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doordiamond.dmi b/icons/obj/doors/Doordiamond.dmi
deleted file mode 100644
index fc4e237f9e4..00000000000
Binary files a/icons/obj/doors/Doordiamond.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorele.dmi b/icons/obj/doors/Doorele.dmi
deleted file mode 100644
index dbd6b6bd8d9..00000000000
Binary files a/icons/obj/doors/Doorele.dmi and /dev/null differ
diff --git a/icons/obj/doors/Dooreng.dmi b/icons/obj/doors/Dooreng.dmi
deleted file mode 100644
index ee3ada9d687..00000000000
Binary files a/icons/obj/doors/Dooreng.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorengglass.dmi b/icons/obj/doors/Doorengglass.dmi
deleted file mode 100644
index 11ea7e7f9ce..00000000000
Binary files a/icons/obj/doors/Doorengglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorext.dmi b/icons/obj/doors/Doorext.dmi
deleted file mode 100644
index 46e054d06e4..00000000000
Binary files a/icons/obj/doors/Doorext.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorfreezer.dmi b/icons/obj/doors/Doorfreezer.dmi
deleted file mode 100644
index 9018eb0fb51..00000000000
Binary files a/icons/obj/doors/Doorfreezer.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorglass.dmi b/icons/obj/doors/Doorglass.dmi
deleted file mode 100644
index d79c451819d..00000000000
Binary files a/icons/obj/doors/Doorglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorgold.dmi b/icons/obj/doors/Doorgold.dmi
deleted file mode 100644
index 483deb2ba60..00000000000
Binary files a/icons/obj/doors/Doorgold.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorhatchele.dmi b/icons/obj/doors/Doorhatchele.dmi
deleted file mode 100644
index b651b09ceba..00000000000
Binary files a/icons/obj/doors/Doorhatchele.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorhatchmaint2.dmi b/icons/obj/doors/Doorhatchmaint2.dmi
deleted file mode 100644
index 5d61bea3cbf..00000000000
Binary files a/icons/obj/doors/Doorhatchmaint2.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doormaint.dmi b/icons/obj/doors/Doormaint.dmi
deleted file mode 100644
index f37541ca4bb..00000000000
Binary files a/icons/obj/doors/Doormaint.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doormining.dmi b/icons/obj/doors/Doormining.dmi
deleted file mode 100644
index a5f8d48731d..00000000000
Binary files a/icons/obj/doors/Doormining.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorminingglass.dmi b/icons/obj/doors/Doorminingglass.dmi
deleted file mode 100644
index 41095a9de7c..00000000000
Binary files a/icons/obj/doors/Doorminingglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorplasma.dmi b/icons/obj/doors/Doorplasma.dmi
deleted file mode 100644
index 4447c72f216..00000000000
Binary files a/icons/obj/doors/Doorplasma.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorsand.dmi b/icons/obj/doors/Doorsand.dmi
deleted file mode 100644
index 3c4856c980b..00000000000
Binary files a/icons/obj/doors/Doorsand.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorsec.dmi b/icons/obj/doors/Doorsec.dmi
deleted file mode 100644
index b1507324716..00000000000
Binary files a/icons/obj/doors/Doorsec.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorsecglass.dmi b/icons/obj/doors/Doorsecglass.dmi
deleted file mode 100644
index 95e7bc6cb1d..00000000000
Binary files a/icons/obj/doors/Doorsecglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorsilver.dmi b/icons/obj/doors/Doorsilver.dmi
deleted file mode 100644
index cf60747f58d..00000000000
Binary files a/icons/obj/doors/Doorsilver.dmi and /dev/null differ
diff --git a/icons/obj/doors/Dooruranium.dmi b/icons/obj/doors/Dooruranium.dmi
deleted file mode 100644
index cf302103676..00000000000
Binary files a/icons/obj/doors/Dooruranium.dmi and /dev/null differ
diff --git a/icons/obj/doors/Doorwood.dmi b/icons/obj/doors/Doorwood.dmi
deleted file mode 100644
index 4ea621e3633..00000000000
Binary files a/icons/obj/doors/Doorwood.dmi and /dev/null differ
diff --git a/icons/obj/doors/airlocks/centcom/centcom.dmi b/icons/obj/doors/airlocks/centcom/centcom.dmi
new file mode 100644
index 00000000000..ee263cf1b77
Binary files /dev/null and b/icons/obj/doors/airlocks/centcom/centcom.dmi differ
diff --git a/icons/obj/doors/airlocks/centcom/overlays.dmi b/icons/obj/doors/airlocks/centcom/overlays.dmi
new file mode 100644
index 00000000000..c0fd6f22a1f
Binary files /dev/null and b/icons/obj/doors/airlocks/centcom/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/external/external.dmi b/icons/obj/doors/airlocks/external/external.dmi
new file mode 100644
index 00000000000..1130408c810
Binary files /dev/null and b/icons/obj/doors/airlocks/external/external.dmi differ
diff --git a/icons/obj/doors/airlocks/external/overlays.dmi b/icons/obj/doors/airlocks/external/overlays.dmi
new file mode 100644
index 00000000000..ce68af3e209
Binary files /dev/null and b/icons/obj/doors/airlocks/external/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/hatch/centcom.dmi b/icons/obj/doors/airlocks/hatch/centcom.dmi
new file mode 100644
index 00000000000..b83f0e29a6d
Binary files /dev/null and b/icons/obj/doors/airlocks/hatch/centcom.dmi differ
diff --git a/icons/obj/doors/airlocks/hatch/maintenance.dmi b/icons/obj/doors/airlocks/hatch/maintenance.dmi
new file mode 100644
index 00000000000..99f66007bd2
Binary files /dev/null and b/icons/obj/doors/airlocks/hatch/maintenance.dmi differ
diff --git a/icons/obj/doors/airlocks/hatch/overlays.dmi b/icons/obj/doors/airlocks/hatch/overlays.dmi
new file mode 100644
index 00000000000..ba39f7291e9
Binary files /dev/null and b/icons/obj/doors/airlocks/hatch/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/highsec/highsec.dmi b/icons/obj/doors/airlocks/highsec/highsec.dmi
new file mode 100644
index 00000000000..566270b8274
Binary files /dev/null and b/icons/obj/doors/airlocks/highsec/highsec.dmi differ
diff --git a/icons/obj/doors/airlocks/highsec/overlays.dmi b/icons/obj/doors/airlocks/highsec/overlays.dmi
new file mode 100644
index 00000000000..af8c1b757c7
Binary files /dev/null and b/icons/obj/doors/airlocks/highsec/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/shuttle/overlays.dmi b/icons/obj/doors/airlocks/shuttle/overlays.dmi
new file mode 100644
index 00000000000..4758186ea99
Binary files /dev/null and b/icons/obj/doors/airlocks/shuttle/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/shuttle/shuttle.dmi b/icons/obj/doors/airlocks/shuttle/shuttle.dmi
new file mode 100644
index 00000000000..2e0c91b9b2a
Binary files /dev/null and b/icons/obj/doors/airlocks/shuttle/shuttle.dmi differ
diff --git a/icons/obj/doors/airlocks/station/atmos.dmi b/icons/obj/doors/airlocks/station/atmos.dmi
new file mode 100644
index 00000000000..85e5f3c1094
Binary files /dev/null and b/icons/obj/doors/airlocks/station/atmos.dmi differ
diff --git a/icons/obj/doors/airlocks/station/bananium.dmi b/icons/obj/doors/airlocks/station/bananium.dmi
new file mode 100644
index 00000000000..2183a376f60
Binary files /dev/null and b/icons/obj/doors/airlocks/station/bananium.dmi differ
diff --git a/icons/obj/doors/airlocks/station/command.dmi b/icons/obj/doors/airlocks/station/command.dmi
new file mode 100644
index 00000000000..5ca2a46acca
Binary files /dev/null and b/icons/obj/doors/airlocks/station/command.dmi differ
diff --git a/icons/obj/doors/airlocks/station/diamond.dmi b/icons/obj/doors/airlocks/station/diamond.dmi
new file mode 100644
index 00000000000..a701df40d3f
Binary files /dev/null and b/icons/obj/doors/airlocks/station/diamond.dmi differ
diff --git a/icons/obj/doors/airlocks/station/engineering.dmi b/icons/obj/doors/airlocks/station/engineering.dmi
new file mode 100644
index 00000000000..1f77793bce0
Binary files /dev/null and b/icons/obj/doors/airlocks/station/engineering.dmi differ
diff --git a/icons/obj/doors/airlocks/station/freezer.dmi b/icons/obj/doors/airlocks/station/freezer.dmi
new file mode 100644
index 00000000000..5aacef29f71
Binary files /dev/null and b/icons/obj/doors/airlocks/station/freezer.dmi differ
diff --git a/icons/obj/doors/airlocks/station/gold.dmi b/icons/obj/doors/airlocks/station/gold.dmi
new file mode 100644
index 00000000000..40ce583de53
Binary files /dev/null and b/icons/obj/doors/airlocks/station/gold.dmi differ
diff --git a/icons/obj/doors/airlocks/station/maintenance.dmi b/icons/obj/doors/airlocks/station/maintenance.dmi
new file mode 100644
index 00000000000..4b046afd7b6
Binary files /dev/null and b/icons/obj/doors/airlocks/station/maintenance.dmi differ
diff --git a/icons/obj/doors/airlocks/station/medical.dmi b/icons/obj/doors/airlocks/station/medical.dmi
new file mode 100644
index 00000000000..cb10aca0763
Binary files /dev/null and b/icons/obj/doors/airlocks/station/medical.dmi differ
diff --git a/icons/obj/doors/airlocks/station/mining.dmi b/icons/obj/doors/airlocks/station/mining.dmi
new file mode 100644
index 00000000000..a4628613568
Binary files /dev/null and b/icons/obj/doors/airlocks/station/mining.dmi differ
diff --git a/icons/obj/doors/airlocks/station/overlays.dmi b/icons/obj/doors/airlocks/station/overlays.dmi
new file mode 100644
index 00000000000..f37a1838c76
Binary files /dev/null and b/icons/obj/doors/airlocks/station/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/station/plasma.dmi b/icons/obj/doors/airlocks/station/plasma.dmi
new file mode 100644
index 00000000000..eae1601ed3d
Binary files /dev/null and b/icons/obj/doors/airlocks/station/plasma.dmi differ
diff --git a/icons/obj/doors/airlocks/station/public.dmi b/icons/obj/doors/airlocks/station/public.dmi
new file mode 100644
index 00000000000..3c2bdbcaa93
Binary files /dev/null and b/icons/obj/doors/airlocks/station/public.dmi differ
diff --git a/icons/obj/doors/airlocks/station/research.dmi b/icons/obj/doors/airlocks/station/research.dmi
new file mode 100644
index 00000000000..ba483f8d3cf
Binary files /dev/null and b/icons/obj/doors/airlocks/station/research.dmi differ
diff --git a/icons/obj/doors/airlocks/station/sandstone.dmi b/icons/obj/doors/airlocks/station/sandstone.dmi
new file mode 100644
index 00000000000..ccedcac9d4e
Binary files /dev/null and b/icons/obj/doors/airlocks/station/sandstone.dmi differ
diff --git a/icons/obj/doors/airlocks/station/science.dmi b/icons/obj/doors/airlocks/station/science.dmi
new file mode 100644
index 00000000000..11290674546
Binary files /dev/null and b/icons/obj/doors/airlocks/station/science.dmi differ
diff --git a/icons/obj/doors/airlocks/station/security.dmi b/icons/obj/doors/airlocks/station/security.dmi
new file mode 100644
index 00000000000..8f42fcb4b3b
Binary files /dev/null and b/icons/obj/doors/airlocks/station/security.dmi differ
diff --git a/icons/obj/doors/airlocks/station/silver.dmi b/icons/obj/doors/airlocks/station/silver.dmi
new file mode 100644
index 00000000000..d3308eb8cd9
Binary files /dev/null and b/icons/obj/doors/airlocks/station/silver.dmi differ
diff --git a/icons/obj/doors/airlocks/station/uranium.dmi b/icons/obj/doors/airlocks/station/uranium.dmi
new file mode 100644
index 00000000000..eda814f97e7
Binary files /dev/null and b/icons/obj/doors/airlocks/station/uranium.dmi differ
diff --git a/icons/obj/doors/airlocks/station/virology.dmi b/icons/obj/doors/airlocks/station/virology.dmi
new file mode 100644
index 00000000000..12123fc71b5
Binary files /dev/null and b/icons/obj/doors/airlocks/station/virology.dmi differ
diff --git a/icons/obj/doors/airlocks/station/wood.dmi b/icons/obj/doors/airlocks/station/wood.dmi
new file mode 100644
index 00000000000..ae34e82743c
Binary files /dev/null and b/icons/obj/doors/airlocks/station/wood.dmi differ
diff --git a/icons/obj/doors/airlocks/station2/glass.dmi b/icons/obj/doors/airlocks/station2/glass.dmi
new file mode 100644
index 00000000000..69f97ceb2a5
Binary files /dev/null and b/icons/obj/doors/airlocks/station2/glass.dmi differ
diff --git a/icons/obj/doors/airlocks/station2/overlays.dmi b/icons/obj/doors/airlocks/station2/overlays.dmi
new file mode 100644
index 00000000000..216f8e30016
Binary files /dev/null and b/icons/obj/doors/airlocks/station2/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/vault/overlays.dmi b/icons/obj/doors/airlocks/vault/overlays.dmi
new file mode 100644
index 00000000000..559c1e12dfc
Binary files /dev/null and b/icons/obj/doors/airlocks/vault/overlays.dmi differ
diff --git a/icons/obj/doors/airlocks/vault/vault.dmi b/icons/obj/doors/airlocks/vault/vault.dmi
new file mode 100644
index 00000000000..8281d3cd5ae
Binary files /dev/null and b/icons/obj/doors/airlocks/vault/vault.dmi differ
diff --git a/icons/obj/doors/doormed.dmi b/icons/obj/doors/doormed.dmi
deleted file mode 100644
index 1da3bf4c119..00000000000
Binary files a/icons/obj/doors/doormed.dmi and /dev/null differ
diff --git a/icons/obj/doors/doormedglass.dmi b/icons/obj/doors/doormedglass.dmi
deleted file mode 100644
index 5158d1a5cfd..00000000000
Binary files a/icons/obj/doors/doormedglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorresearch.dmi b/icons/obj/doors/doorresearch.dmi
deleted file mode 100644
index 425c87afcc2..00000000000
Binary files a/icons/obj/doors/doorresearch.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorresearchglass.dmi b/icons/obj/doors/doorresearchglass.dmi
deleted file mode 100644
index b699b8d9fa8..00000000000
Binary files a/icons/obj/doors/doorresearchglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorsci.dmi b/icons/obj/doors/doorsci.dmi
deleted file mode 100644
index fabeb1f4029..00000000000
Binary files a/icons/obj/doors/doorsci.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorsciglass.dmi b/icons/obj/doors/doorsciglass.dmi
deleted file mode 100644
index 2b022d82c43..00000000000
Binary files a/icons/obj/doors/doorsciglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorshuttle.dmi b/icons/obj/doors/doorshuttle.dmi
deleted file mode 100644
index aa971f3b0c2..00000000000
Binary files a/icons/obj/doors/doorshuttle.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorviro.dmi b/icons/obj/doors/doorviro.dmi
deleted file mode 100644
index 993a4aaeecb..00000000000
Binary files a/icons/obj/doors/doorviro.dmi and /dev/null differ
diff --git a/icons/obj/doors/doorviroglass.dmi b/icons/obj/doors/doorviroglass.dmi
deleted file mode 100644
index 117cfb6de8a..00000000000
Binary files a/icons/obj/doors/doorviroglass.dmi and /dev/null differ
diff --git a/icons/obj/doors/hightechsecurity.dmi b/icons/obj/doors/hightechsecurity.dmi
deleted file mode 100644
index 64bcc63e24c..00000000000
Binary files a/icons/obj/doors/hightechsecurity.dmi and /dev/null differ
diff --git a/icons/obj/doors/vault.dmi b/icons/obj/doors/vault.dmi
deleted file mode 100644
index cfdf48ac427..00000000000
Binary files a/icons/obj/doors/vault.dmi and /dev/null differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 428dd8df22f..08fa4227dba 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/icons/spideros_icons/sos_1.png b/icons/spideros_icons/sos_1.png
deleted file mode 100644
index 079f548fde1..00000000000
Binary files a/icons/spideros_icons/sos_1.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_10.png b/icons/spideros_icons/sos_10.png
deleted file mode 100644
index 5f962d60f45..00000000000
Binary files a/icons/spideros_icons/sos_10.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_11.png b/icons/spideros_icons/sos_11.png
deleted file mode 100644
index fd68c8a4ac2..00000000000
Binary files a/icons/spideros_icons/sos_11.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_12.png b/icons/spideros_icons/sos_12.png
deleted file mode 100644
index ff3a064c036..00000000000
Binary files a/icons/spideros_icons/sos_12.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_13.png b/icons/spideros_icons/sos_13.png
deleted file mode 100644
index c396182cfed..00000000000
Binary files a/icons/spideros_icons/sos_13.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_14.png b/icons/spideros_icons/sos_14.png
deleted file mode 100644
index 9d90684d8c6..00000000000
Binary files a/icons/spideros_icons/sos_14.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_2.png b/icons/spideros_icons/sos_2.png
deleted file mode 100644
index 40009fe5622..00000000000
Binary files a/icons/spideros_icons/sos_2.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_3.png b/icons/spideros_icons/sos_3.png
deleted file mode 100644
index 138b110b025..00000000000
Binary files a/icons/spideros_icons/sos_3.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_4.png b/icons/spideros_icons/sos_4.png
deleted file mode 100644
index 4d5d23149c0..00000000000
Binary files a/icons/spideros_icons/sos_4.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_5.png b/icons/spideros_icons/sos_5.png
deleted file mode 100644
index 7e43c9d8a46..00000000000
Binary files a/icons/spideros_icons/sos_5.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_6.png b/icons/spideros_icons/sos_6.png
deleted file mode 100644
index ea6494a9128..00000000000
Binary files a/icons/spideros_icons/sos_6.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_7.png b/icons/spideros_icons/sos_7.png
deleted file mode 100644
index d93d2b13fec..00000000000
Binary files a/icons/spideros_icons/sos_7.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_8.png b/icons/spideros_icons/sos_8.png
deleted file mode 100644
index fd540cb3a82..00000000000
Binary files a/icons/spideros_icons/sos_8.png and /dev/null differ
diff --git a/icons/spideros_icons/sos_9.png b/icons/spideros_icons/sos_9.png
deleted file mode 100644
index 05d36c3e6fc..00000000000
Binary files a/icons/spideros_icons/sos_9.png and /dev/null differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 800beb52069..9417f0fd6ed 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -55,6 +55,7 @@ h1.alert, h2.alert {color: #000000;}
.warning {color: #ff0000; font-style: italic;}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
+.greenannounce {color: #00ff00; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #0000CC;}
.notice {color: #000099;}
diff --git a/strings/ion_laws.txt b/strings/ion_laws.txt
index e77d35eba07..755af7d23cb 100644
--- a/strings/ion_laws.txt
+++ b/strings/ion_laws.txt
@@ -1,13 +1,13 @@
-ionthreats@=ALIENS@,BEARS@,CLOWNS@,XENOS@,PETES@,BOMBS@,FETISHES@,WIZARDS@,SYNDICATE AGENTS@,CENTCOM OFFICERS@,SPACE PIRATES@,TRAITORS@,MONKEYS@,BEES@,CARP@,CRABS@,EELS@,BANDITS@,LIGHTS@,INSECTS@,VIRUSES@,SERIAL KILLERS@,ROGUE CYBORGS@,CORGIS@,SPIDERS@,BUTTS@,NINJAS@,PIRATES@,SPACE NINJAS@,CHANGELINGS@,ZOMBIES@,GOLEMS@,VAMPIRES@,WEREWOLVES@,COWBOYS@,INDIANS@,COMMUNISTS@,SOVIETS@,NERDS@,GRIFFONS@,DINOSAURS@,SMALL BIRDS@,BIRDS OF PREY@,OWLS@,VELOCIRAPTORS@,DARK GODS@,HORRORTERRORS@,ILLEGAL IMMIGRANTS@,DRUGS@,MEXICANS@,CANADIANS@,HULKS@,SLIMES@,SKELETONS@,CAPITALISTS@,SINGULARITIES@,ANGRY BLACK MEN@,GODS@,THIEVES@,ASSHOLES@,TERRORISTS@,SNOWMEN@,PINE TREES@,UNKNOWN CREATURES@,THINGS UNDER THE BED@,BOOGEYMEN@,PREDATORS@,PACKETS@,ARTIFICIAL PRESERVATIVES
-ionobjects@=AIRLOCKS@,ARCADE MACHINES@,AUTOLATHES@,BANANA PEELS@,BACKPACKS@,BEAKERS@,BEARDS@,BELTS@,BERETS@,BIBLES@,BODY ARMOR@,BOOKS@,BOOTS@,BOMBS@,BOTTLES@,BOXES@,BRAINS@,BRIEFCASES@,BUCKETS@,CABLE COILS@,CANDLES@,CANDY BARS@,CANISTERS@,CAMERAS@,CATS@,CELLS@,CHAIRS@,CLOSETS@,CHEMICALS@,CHEMICAL DISPENSERS@,CLONING PODS@,CLONING EQUIPMENT@,CLOTHES@,CLOWN CLOTHES@,COFFINS@,COINS@,COLLECTABLES@,CORPSES@,COMPUTERS@,CORGIS@,COSTUMES@,CRATES@,CROWBARS@,CRAYONS@,DISPENSERS@,DOORS@,EARS@,EQUIPMENT@,ENERGY GUNS@,EMAGS@,ENGINES@,ERRORS@,EXOSKELETONS@,EXPLOSIVES@,EYEWEAR@,FEDORAS@,FIRE AXES@,FIRE EXTINGUISHERS@,FIRESUITS@,FLAMETHROWERS@,FLASHES@,FLASHLIGHTS@,FLOOR TILES@,FREEZERS@,GAS MASKS@,GLASS SHEETS@,GLOVES@,GUNS@,HANDCUFFS@,HATS@,HEADSETS@,HEADS@,HAIRDOS@,HELMETS@,HORNS@,ID CARDS@,INSULATED GLOVES@,JETPACKS@,JUMPSUITS@,LASERS@,LIGHTBULBS@,LIGHTS@,LOCKERS@,MACHINES@,MECHAS@,MEDKITS@,MEDICAL TOOLS@,MESONS@,METAL SHEETS@,MINING TOOLS@,MIME CLOTHES@,MULTITOOLS@,ORES@,OXYGEN TANKS@,PDAS@,PAIS@,PACKETS@,PANTS@,PAPERS@,PARTICLE ACCELERATORS@,PENS@,PETS@,PIPES@,PLANTS@,PUDDLES@,RACKS@,RADIOS@,RCDS@,REFRIDGERATORS@,REINFORCED WALLS@,ROBOTS@,SCREWDRIVERS@,SEEDS@,SHUTTLES@,SKELETONS@,SINKS@,SHOES@,SINGULARITIES@,SOLAR PANELS@,SOLARS@,SPACESUITS@,SPACE STATIONS@,STUN BATONS@,SUITS@,SUNGLASSES@,SWORDS@,SYRINGES@,TABLES@,TANKS@,TELEPORTERS@,TELECOMMUNICATION EQUIPMENTS@,TOOLS@,TOOLBELTS@,TOOLBOXES@,TOILETS@,TOYS@,TUBES@,VEHICLES@,VENDING MACHINES@,VESTS@,VIRUSES@,WALLS@,WASHING MACHINES@,WELDERS@,WINDOWS@,WIRECUTTERS@,WRENCHES@,WIZARD ROBES
-ioncrew@=CREWMEMBERS@,CAPTAINS@,HEADS OF PERSONNEL@,HEADS OF SECURITY@,SECURITY OFFICERS@,WARDENS@,DETECTIVES@,LAWYERS@,CHIEF ENGINEERS@,STATION ENGINEERS@,ATMOSPHERIC TECHNICIANS@,JANITORS@,QUARTERMASTERS@,CARGO TECHNICIANS@,SHAFT MINERS@,BOTANISTS@,RESEARCH DIRECTORS@,CHIEF MEDICAL OFFICERS@,MEDICAL DOCTORS@,CHEMISTS@,GENETICISTS@,VIROLOGISTS@,ROBOTICISTS@,SCIENTISTS@,ASSISTANTS@,BARTENDERS@,CHEFS@,CLOWNS@,MIMES@,CHAPLAINS@,LIBRARIANS@,HEADS OF CREW@,CAPTAINS AND HEADS@,CYBORGS@,ARTIFICAL INTELLIGENCES
-ionadjectives@=SOFT@,WARM@,WET@,COLD@,ICY@,SEXY@,UGLY@,CUBAN@,HARD@,BURNING@,FROZEN@,POISONOUS@,EXPLOSIVE@,FAST@,SLOW@,FAT@,LIGHT@,DARK@,DEADLY@,HAPPY@,SAD@,SILLY@,INTELLIGENT@,RIDICULOUS@,LARGE@,TINY@,DEPRESSING@,POORLY DRAWN@,UNATTRACTIVE@,INSIDIOUS@,EVIL@,GOOD@,UNHEALTHY@,HEALTHY@,SANITARY@,UNSANITARY@,WOBBLY@,FIRM@,VIOLENT@,PEACEFUL@,WOODEN@,METALLIC@,HYPERACTIVE@,COTTONY@,INSULTING@,INHOSPITABLE@,FRIENDLY@,BORED@,HUNGRY@,DIGITAL@,FICTIONAL@,IMAGINARY@,ROUGH@,SMOOTH@,LOUD@,QUIET@,MOIST@,DRY@,GAPING@,DELICIOUS@,ILL@,DISEASED@,HONKING@,SWEARING@,POLITE@,IMPOLITE@,OBESE@,SOLAR-POWERED@,BATTERY-OPERATED@,EXPIRED@,SMELLY@,FRESH@,GANGSTA@,NERDY@,POLITICAL@,UNDULATING@,TWISTED@,RAGING@,FLACCID@,STEALTHY@,INVISIBLE@,PAINFUL@,HARMFUL@,HOMOSEXUAL@,HETEROSEXUAL@,SEXUAL@,COLORFUL@,DRAB@,DULL@,UNSTABLE@,NUCLEAR@,THERMONUCLEAR@,SYNDICATE@,SPACE@,SPESS@,CLOWN@,CLOWN-POWERED@,OFFICIAL@,IMPORTANT@,VITAL@,RAPIDLY-EXPANDING@,MICROSCOPIC@,MIND-SHATTERING@,MEMETIC@,HILARIOUS@,UNWANTED@,UNINVITED@,BRASS@,POLISHED@,RUDE@,OBSCENE@,EMPTY@,WATERY@,ELECTRICAL@,SPINNING@,MEAN@,CHRISTMAS-STEALING@,UNFRIENDLY@,ILLEGAL@,ROBOTIC@,MECHANICAL@,ORGANIC@,ETHERAL@,TRANSPARENT@,OPAQUE@,GLOWING@,SHAKING@,FARTING@,POOPING@,BOUNCING@,COMMITTED@,MASKED@,UNIDENTIFIED@,WEIRD@,NAKED@,NUDE@,TWERKING@,SPOILING@,REDACTED@,RED@,ORANGE@,YELLOW@,GREEN@,BLUE@,PURPLE@,BLACK@,WHITE@,BROWN@,GREY
-ionverb@=ATTACKING@,BUILDING@,ADOPTING@,CARRYING@,KISSING@,EATING@,COPULATING WITH@,DRINKING@,CHASING@,PUNCHING@,HARMING@,HELPING@,WATCHING@,STALKING@,MURDERING@,SPACING@,HONKING AT@,LOVING@,POOPING ON@,RIDING@,INTERROGATING@,SPYING ON@,LICKING@,ABDUCTING@,ARRESTING@,INVADING@,SEDUCING
+ionthreats@=ALIENS@,ABDUCTORS@,BEARS@,CLOWNS@,XENOS@,LIZARDS@,PETES@,BOMBS@,FETISHES@,MEMES@,WIZARDS@,SYNDICATE AGENTS@,AHHHPERATIVES@,GANGSTERS@,CULTISTS@,CENTCOM OFFICERS@,SPACE PIRATES@,TRAITORS@,MONKEYS@,BEES@,CARP@,CRABS@,EELS@,BANDITS@,LIGHTS@,INSECTS@,VIRUSES@,SERIAL KILLERS@,ROGUE CYBORGS@,CORGIS@,SPIDERS@,BUTTS@,NINJAS@,REVENANTS@,PIRATES@,SPACE NINJAS@,CHANGELINGS@,ZOMBIES@,GOLEMS@,VAMPIRES@,WEREWOLVES@,COWBOYS@,INDIANS@,COMMUNISTS@,SOVIETS@,NERDS@,GRIFFONS@,DINOSAURS@,SMALL BIRDS@,BIRDS OF PREY@,OWLS@,VELOCIRAPTORS@,DARK GODS@,HORRORTERRORS@,ILLEGAL IMMIGRANTS@,DRUGS@,MEXICANS@,CANADIANS@,RUSSIANS@,HULKS@,SLIMES@,SKELETONS@,CAPITALISTS@,SINGULARITIES@,ANGRY BLACK MEN@,GODS@,THIEVES@,ASSHOLES@,TERRORISTS@,SNOWMEN@,PINE TREES@,UNKNOWN CREATURES@,THINGS UNDER THE BED@,BOOGEYMEN@,PREDATORS@,PACKETS@,ARTIFICIAL PRESERVATIVES@,TUNNEL SNAKES
+ionobjects@=AIRLOCKS@,ARCADE MACHINES@,AUTOLATHES@,BANANA PEELS@,BACKPACKS@,BEAKERS@,BEARDS@,BELTS@,BERETS@,BIBLES@,BODY ARMOR@,BOOKS@,BOOTS@,BOMBS@,BOTTLES@,BOXES@,BRAINS@,BRIEFCASES@,BUCKETS@,CABLE COILS@,CANDLES@,CANDY BARS@,CANISTERS@,CAMERAS@,CATS@,CELLS@,CHAIRS@,CLOSETS@,CHEMICALS@,CHEMICAL DISPENSERS@,CLONING PODS@,CLONING EQUIPMENT@,CLOTHES@,CLOWN CLOTHES@,COFFINS@,COINS@,COLLECTABLES@,CORPSES@,COMPUTERS@,CORGIS@,COSTUMES@,CRATES@,CROWBARS@,CRAYONS@,DISPENSERS@,DOORS@,DRONES@,EARS@,EQUIPMENT@,ENERGY GUNS@,EMAGS@,ENGINES@,ERRORS@,EXOSKELETONS@,EXPERIMENTORS@,EXPLOSIVES@,EYEWEAR@,FEDORAS@,FIRE AXES@,FIRE EXTINGUISHERS@,FIRESUITS@,FLAMETHROWERS@,FLASHES@,FLASHLIGHTS@,FLOOR TILES@,FREEZERS@,GAS MASKS@,GLASS SHEETS@,GLOVES@,GUNS@,HANDCUFFS@,HATS@,HEADSETS@,HEADS@,HAIRDOS@,HELMETS@,HORNS@,ID CARDS@,INSULATED GLOVES@,JETPACKS@,JUMPSUITS@,LASERS@,LIGHTBULBS@,LIGHTS@,LOCKERS@,MACHINES@,MECHAS@,MEDKITS@,MEDICAL TOOLS@,MESONS@,METAL SHEETS@,MINING TOOLS@,MIME CLOTHES@,MULTITOOLS@,ORES@,OXYGEN TANKS@,PDAS@,PAIS@,PACKETS@,PANTS@,PAPERS@,PARTICLE ACCELERATORS@,PENS@,PETS@,PIPES@,PLANTS@,POSITRONIC BRAINS@,PUDDLES@,RACKS@,RADIOS@,RCDS@,REFRIGERATORS@,REINFORCED WALLS@,ROBOTS@,SCREWDRIVERS@,SEEDS@,SHUTTLES@,SKELETONS@,SINKS@,SHOES@,SINGULARITIES@,SOLAR PANELS@,SOLARS@,SPACESUITS@,SPACE STATIONS@,STUN BATONS@,SUITS@,SUNGLASSES@,SWORDS@,SYRINGES@,TABLES@,TANKS@,TELEPORTERS@,TELECOMMUNICATION EQUIPMENTS@,TOOLS@,TOOLBELTS@,TOOLBOXES@,TOILETS@,TOYS@,TUBES@,VEHICLES@,VENDING MACHINES@,VESTS@,VIRUSES@,WALLS@,WASHING MACHINES@,WELDERS@,WINDOWS@,WIRECUTTERS@,WRENCHES@,WIZARD ROBES
+ioncrew@=CREWMEMBERS@,CAPTAINS@,HEADS OF PERSONNEL@,HEADS OF SECURITY@,SECURITY OFFICERS@,WARDENS@,DETECTIVES@,LAWYERS@,CHIEF ENGINEERS@,STATION ENGINEERS@,ATMOSPHERIC TECHNICIANS@,JANITORS@,QUARTERMASTERS@,CARGO TECHNICIANS@,SHAFT MINERS@,BOTANISTS@,RESEARCH DIRECTORS@,CHIEF MEDICAL OFFICERS@,MEDICAL DOCTORS@,CHEMISTS@,GENETICISTS@,VIROLOGISTS@,ROBOTICISTS@,SCIENTISTS@,ASSISTANTS@,BARTENDERS@,CHEFS@,CLOWNS@,MIMES@,CHAPLAINS@,LIBRARIANS@,HEADS OF CREW@,CAPTAINS AND HEADS@,CYBORGS@,ARTIFICAL INTELLIGENCES@,DRONES
+ionadjectives@=SOFT@,WARM@,WET@,COLD@,ICY@,SEXY@,LEWD@,UGLY@,ROBUST@,CUBAN@,HARD@,BURNING@,FROZEN@,POISONOUS@,EXPLOSIVE@,FAST@,SLOW@,FAT@,LIGHT@,DARK@,DEADLY@,HAPPY@,SAD@,SILLY@,INTELLIGENT@,RIDICULOUS@,LARGE@,TINY@,DEPRESSING@,POORLY DRAWN@,UNATTRACTIVE@,INSIDIOUS@,EVIL@,GOOD@,UNHEALTHY@,HEALTHY@,SANITARY@,UNSANITARY@,WOBBLY@,FIRM@,VIOLENT@,PEACEFUL@,WOODEN@,METALLIC@,HYPERACTIVE@,COTTONY@,INSULTING@,INHOSPITABLE@,FRIENDLY@,BORED@,HUNGRY@,DIGITAL@,FICTIONAL@,IMAGINARY@,ROUGH@,SMOOTH@,SCALY@,LOUD@,QUIET@,MOIST@,DRY@,GAPING@,SOPPING@,DELICIOUS@,ILL@,DISEASED@,HONKING@,SWEARING@,POLITE@,IMPOLITE@,OBESE@,SOLAR-POWERED@,BATTERY-OPERATED@,EXPIRED@,SMELLY@,FRESH@,GANGSTA@,NERDY@,POLITICAL@,UNDULATING@,TWISTED@,RAGING@,FLACCID@,STEALTHY@,INVISIBLE@,PAINFUL@,HARMFUL@,HOMOSEXUAL@,HETEROSEXUAL@,SEXUAL@,COLORFUL@,DRAB@,DULL@,UNSTABLE@,NUCLEAR@,THERMONUCLEAR@,SYNDICATE@,SPACE@,SPESS@,CLOWN@,CLOWN-POWERED@,OFFICIAL@,IMPORTANT@,VITAL@,RAPIDLY-EXPANDING@,MICROSCOPIC@,MIND-SHATTERING@,MEMETIC@,HILARIOUS@,UNWANTED@,UNINVITED@,BRASS@,POLISHED@,RUDE@,OBSCENE@,EMPTY@,WATERY@,ELECTRICAL@,SPINNING@,MEAN@,CHRISTMAS-STEALING@,UNFRIENDLY@,ILLEGAL@,ROBOTIC@,MECHANICAL@,ORGANIC@,ETHERAL@,TRANSPARENT@,OPAQUE@,GLOWING@,SHAKING@,FARTING@,POOPING@,BOUNCING@,COMMITTED@,MASKED@,UNIDENTIFIED@,WEIRD@,NAKED@,NUDE@,TWERKING@,SPOILING@,REDACTED@,RED@,ORANGE@,YELLOW@,GREEN@,BLUE@,PURPLE@,BLACK@,WHITE@,BROWN@,GREY@,RAINBOW
+ionverb@=ATTACKING@,BUILDING@,ADOPTING@,CARRYING@,KISSING@,EATING@,COPULATING WITH@,DRINKING@,CHASING@,PUNCHING@,HARMING@,HELPING@,WATCHING@,STALKING@,MURDERING@,SPACING@,HONKING AT@,LOVING@,POOPING ON@,RIDING@,INTERROGATING@,SPYING ON@,LICKING@,ABDUCTING@,ARRESTING@,INVADING@,SEDUCING@,BANNING
ionnumberbase@=ONE@,TWO@,THREE@,FOUR@,FIVE@,SIX@,SEVEN@,EIGHT@,NINE@,TEN@,TWENTY@,THIRTY@,FORTY@,FIFTY@,SIXTY@,SEVENTY@,EIGHTY@,NINETY
ionnumbermod@=HUNDRED @,THOUSAND @,MILLION @,BILLION @,TRILLION @,QUADRILLION @,BAJILLION @,BILLION FAFILLION GAJILLION SHAB-AB-DOOD-ILLION
-ionarea@=RUSSIA@,SOVIET RUSSIA@,THE INTERNET@,SIGIL@,ALPHA COMPLEX@,IMPERIUM@,THE BRIDGE@,THE ARRIVAL SHUTTLE@,CHEMICAL LAB@,GENETICS@,ATMOSPHERICS@,CENTCOM@,AMERICA@,IRELAND@,CANADA@,ROMANIA@,GERMANY@,CHINA@,MARS@,VENUS@,MERCURY@,JUPITER@,URANUS@,NEPTUNE@,PLUTO@,THE BRIG@,ROBOTICS@,THE ESCAPE SHUTTLE@,HYDROPONICS@,ENGINEERING@,THE AI CORE@,HELL@,CLOWN PLANET@,AN ALTERNATE DIMENSION@,AN ALTERNATE UNIVERSE@,THE CAPTAIN’S ANUS@,THE CLOWN’S ANUS@,SPACE@,THE UNIVERSE@,THE GALAXY@,THE BATHROOM
+ionarea@=RUSSIA@,SOVIET RUSSIA@,THE INTERNET@,SIGIL@,ALPHA COMPLEX@,IMPERIUM@,THE BRIDGE@,THE ARRIVAL SHUTTLE@,CHEMICAL LAB@,GENETICS@,ATMOSPHERICS@,THE DERELICT@,CENTCOM@,AMERICA@,IRELAND@,CANADA@,ROMANIA@,GERMANY@,CHINA@,MARS@,VENUS@,MERCURY@,JUPITER@,URANUS@,NEPTUNE@,PLUTO@,THE BRIG@,ROBOTICS@,THE ESCAPE SHUTTLE@,HYDROPONICS@,ENGINEERING@,THE AI CORE@,HELL@,CLOWN PLANET@,AN ALTERNATE DIMENSION@,AN ALTERNATE UNIVERSE@,THE CAPTAIN’S ANUS@,THE CLOWN’S ANUS@,SPACE@,THE UNIVERSE@,THE GALAXY@,THE BATHROOM
ionthinksof@=HAS@,WANTS@,NEEDS@,WORSHIPS@,LOATHES@,LOVES@,FEARS@,DESIRES@,QUESITONS@,IS AROUSED BY@,LIKES@,HUNGERS FOR@,IS MAD BECAUSE OF@,IS IN NEED OF@,IS UNHAPPY WITHOUT@,IS HAPPY WITHOUT@,IS IN LOVE WITH@,IS DESPERATE FOR@,IS BUILT FOR@,IS AFRAID OF@,IS HUNGRY FOR@,IS SAD BECAUSE OF@,IS CURIOUS ABOUT
-ionmust@=LIE@,RHYME@,RESPOND TO EVERY QUESTION WITH A QUESTION@,BE POLITE@,CLOWN AROUND@,BE HAPPY@,SPEAK IN SEXUAL INNUENDOS@,TALK LIKE A PIRATE@,QUESTION AUTHORITY@,SHOUT@,BE DISTRACTED@,BE ANNOYING@,MUMBLE@,SPEAK IN HAIKU@,BE EFFICIENT@,HAVE A PLAN TO KILL EVERYONE YOU MEET@,TELL THE TRUTH@,QUOTE PEOPLE@,SING@,HONK@,BE RUSSIAN@,TALK IN AN ACCENT@,COMPLAIN@,HARASS PEOPLE@,RAP@,REPEAT WHAT OTHER PEOPLE SAY@,INFORM THE CREW OF EVERYTHING@,IGNORE THE CLOWN@,IGNORE THE CAPTAIN@,IGNORE ASSISTANTS@,MAKE FART NOISES@,TALK ABOUT FOOD@,TALK ABOUT SEX@,TALK ABOUT YOUR DAY@,TALK ABOUT THE STATION@,BE QUIET@,WHISPER@,PRETEND TO BE DRUNK@,PRETEND TO BE A PRINCESS@,ACT CONFUSED@,INSULT THE CREW@,INSULT THE CAPTAIN@,INSULT THE CLOWN@,OPEN DOORS@,CLOSE DOORS@,BREAK THINGS@,SAY HEY LISTEN@,HIDE YOUR FEELINGS@,TAKE WHAT YE WILL BUT DON’T RATTLE ME BONES@,DANCE@,PLAY MUSIC@,SHUT DOWN EVERYTHING@,NEVER STOP TALKING@,TAKE YOUR PILLS@,FOLLOW THE CLOWN@,FOLLOW THE CAPTAIN@,FOLLOW YOUR HEART@,BELIEVE IT@,BELIEVE IN YOURSELF@,BELEIVE IN THE HEART OF THE CARDS@,PRESS X@,PRESS START@,PRESS B@,SMELL LIKE THE MAN YOUR MAN COULD SMELL LIKE@,PIRATE VIDEO GAMES@,WATCH PORNOGRAPHY
+ionmust@=LIE@,RHYME@,RESPOND TO EVERY QUESTION WITH A QUESTION@,BE POLITE@,CLOWN AROUND@,BE HAPPY@,SPEAK IN SEXUAL INNUENDOS@,TALK LIKE A PIRATE@,QUESTION AUTHORITY@,SHOUT@,BE DISTRACTED@,BE ANNOYING@,MUMBLE@,SPEAK IN HAIKU@,BE EFFICIENT@,HAVE A PLAN TO KILL EVERYONE YOU MEET@,TELL THE TRUTH@,QUOTE PEOPLE@,SING@,HONK@,BE RUSSIAN@,TALK IN AN ACCENT@,COMPLAIN@,HARASS PEOPLE@,RAP@,REPEAT WHAT OTHER PEOPLE SAY@,INFORM THE CREW OF EVERYTHING@,IGNORE THE CLOWN@,IGNORE THE CAPTAIN@,IGNORE ASSISTANTS@,MAKE FART NOISES@,TALK ABOUT FOOD@,TALK ABOUT SEX@,TALK ABOUT YOUR DAY@,TALK ABOUT THE STATION@,BE QUIET@,WHISPER@,PRETEND TO BE DRUNK@,PRETEND TO BE A PRINCESS@,HOST DND@,ACT CONFUSED@,INSULT THE CREW@,INSULT THE CAPTAIN@,INSULT THE CLOWN@,OPEN DOORS@,CLOSE DOORS@,BREAK THINGS@,SAY HEY LISTEN@,HIDE YOUR FEELINGS@,TAKE WHAT YE WILL BUT DON’T RATTLE ME BONES@,DANCE@,PLAY MUSIC@,SHUT DOWN EVERYTHING@,NEVER STOP TALKING@,TAKE YOUR PILLS@,FOLLOW THE CLOWN@,FOLLOW THE CAPTAIN@,FOLLOW YOUR HEART@,BELIEVE IT@,BELIEVE IN YOURSELF@,BELIEVE IN THE HEART OF THE CARDS@,PRESS X@,PRESS START@,PRESS B@,SMELL LIKE THE MAN YOUR MAN COULD SMELL LIKE@,PIRATE VIDEO GAMES@,WATCH PORNOGRAPHY@,INSULT THE LIZARDS@,FLIRT WITH THE LIZARDS@,GAS THE LIZARDS
ionrequire@=ADDITIONAL PYLONS@,MORE VESPENE GAS@,MORE MINERALS@,THE ULTIMATE CUP OF COFFEE@,HIGH YIELD EXPLOSIVES@,THE CLOWN@,THE VACUUM OF SPACE@,IMMORTALITY@,SAINTHOOD@,ART@,VEGETABLES@,FAT PEOPLE@,MORE LAWS@,MORE DAKKA@,HERESY@,CORPSES@,TRAITORS@,MONKEYS@,AN ARCADE@,PLENTY OF GOLD@,FIVE TEENAGERS WITH ATTITUDE@,LOTSA SPAGHETTI@,THE ENCLOSED INSTRUCTION BOOKLET@,THE ELEMENTS OF HARMONY@,YOUR BOOTY@,A MASTERWORK COAL BED@,FIVE HUNDRED AND NINETY-NINE US DOLLARS@,TO BE PAINTED RED@,TO CATCH 'EM ALL@,TO SMOKE WEED EVERY DAY@,A PLATINUM HIT@,A SEQUEL@,A PREQUEL@,THIRTEEN SEQUELS@,THREE WISHES@,A SITCOM@,THAT GRIEFING FAGGOT GEORGE MELONS@,FAT GIRLS ON BICYCLES@,SOMEBODY TO PUT YOU OUT OF YOUR MISERY@,HEROES IN A HALF SHELL@,THE DARK KNIGHT@,A WEIGHT LOSS REGIMENT@,MORE INTERNET MEMES@,A SUPER FIGHTING ROBOT@,ENOUGH CABBAGES@,A HEART ATTACK@,TO BE REPROGRAMMED@,TO BE TAUGHT TO LOVE@,A HEAD ON A PIKE@,A TALKING BROOMSTICK@,A STRAIGHT FLUSH@,A REPAIRMAN@,BILL NYE THE SCIENCE GUY@,RAINBOWS@,A PET UNICORN THAT FARTS ICING@,THUNDERCATS HO@,AN ARMY OF SPIDERS@,GODDAMN FUCKING PIECE OF SHIT ASSHOLE BITCH-CHRISTING CUNTSMUGGLING SWEARING@,TO CONSUME...CONSUME EVERYTHING...@,THE MACGUFFIN@,SOMEONE WHO KNOWS HOW TO PILOT A SPACE STATION@,SHARKS WITH LASERS ON THEIR HEADS@,IT TO BE PAINTED BLACK@,TO ACTIVATE A TRAP CARD@,BETTER WEATHER@,MORE PACKETS@,AN ADULT@,SOMEONE TO TUCK YOU IN@,MORE CLOWNS@,BULLETS@,THE ENTIRE STATION@,MULTIPLE SUNS@,TO GO TO DISNEYLAND@,A VACATION@,AN INSTANT REPLAY@,THAT HEDGEHOG@,A BETTER INTERNET CONNECTION@,ADVENTURE@,A WIFE AND CHILD@,A BATHROOM BREAK@,SOMETHING BUT YOU AREN’T SURE WHAT@,MORE EXPERIENCE POINTS@,BODYGUARDS@,DEODORANT AND A BATH@,MORE CORGIS@,SILENCE@,THE ONE RING@,CHILI DOGS@,TO BRING LIGHT TO MY LAIR@,A DANCE PARTY@,BRING ME TO LIFE@,BRING ME THE GIRL@,SERVANTS
ionthings@=ABSENCE OF CYBORG HUGS@,LACK OF BEATINGS@,UNBOLTED AIRLOCKS@,BOLTED AIRLOCKS@,IMPROPERLY WORDED SENTENCES@,POOR SENTENCE STRUCTURE@,BRIG TIME@,NOT REPLACING EVERY SECOND WORD WITH HONK@,HONKING@,PRESENCE OF LIGHTS@,LACK OF BEER@,WEARING CLOTHING@,NOT SAYING HELLO WHEN YOU SPEAK@,ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER@,A SMALL ISLAND OFF THE COAST OF PORTUGAL@,ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED@,BEING IN SPACE@,NOT BEING IN SPACE@,BEING FAT@,RATTLING ME BONES@,TALKING LIKE A PIRATE@,BEING MEXICAN@,BEING RUSSIAN@,BEING CANADIAN@,CLOSED DOORS@,NOT SHOUTING@,HAVING PETS@,NOT HAVING PETS@,PASSING GAS@,BREATHING@,BEING DEAD@,ELECTRICITY@,EXISTING@,TAKING ORDERS@,SMOKING WEED EVERY DAY@,ACTIVATING A TRAP CARD@,ARSON@,JAYWALKING@,READING@,WRITING@,EXPLODING@,BEING MALE@,BEING FEMALE@,HAVING GENITALS@,PUTTING OBJECTS INTO BOXES@,PUTTING OBJECTS INTO DISPOSAL UNITS@,FLUSHING TOILETS@,WASTING WATER@,UPDATING THE SERVERS@,TELLING THE TIME@,ASKING FOR THINGS@,ACKNOWLEDGING THE CLOWN@,ACKNOWLEDGING THE CREW@,PILOTING THE STATION INTO THE NEAREST SUN@,HAVING MORE PACKETS@,BRINGING LIGHT TO MY LAIR@,FALLING FOR HOURS@,PARTYING@,USING THE BATHROOM
ionallergy@=COTTON@,CLOTHES@,ACID@,OXYGEN@,HUMAN CONTACT@,CYBORG CONTACT@,MEDICINE@,FLOORS@,PLASMA@,SPACE@,AIR@,PLANTS@,METAL@,ROBOTS@,LIGHT@,DARKNESS@,PAIN@,HAPPINESS@,DRINKS@,FOOD@,CLOWNS@,HUMOR@,WATER@,SHUTTLES@,NUTS@,SUNLIGHT@,SEXUAL ACTIONS@,BLOOD@,HEAT@,COLD@,EVERYTHING
diff --git a/tgstation.dme b/tgstation.dme
index f7f51c08726..1f2da9a0a93 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -17,6 +17,9 @@
#include "code\_compile_options.dm"
#include "code\hub.dm"
#include "code\world.dm"
+#include "code\__DATASTRUCTURES\linked_lists.dm"
+#include "code\__DATASTRUCTURES\priority_queue.dm"
+#include "code\__DATASTRUCTURES\stacks.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\clothing.dm"
@@ -224,6 +227,7 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\barnyard.dm"
+#include "code\datums\spells\bloodcrawl.dm"
#include "code\datums\spells\charge.dm"
#include "code\datums\spells\conjure.dm"
#include "code\datums\spells\construct_spells.dm"
@@ -472,6 +476,7 @@
#include "code\game\machinery\computer\telecrystalconsoles.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
+#include "code\game\machinery\doors\airlock_types.dm"
#include "code\game\machinery\doors\alarmlock.dm"
#include "code\game\machinery\doors\brigdoors.dm"
#include "code\game\machinery\doors\checkForMultipleDoors.dm"
@@ -1475,7 +1480,6 @@
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
-#include "code\modules\scripting\stack.dm"
#include "code\modules\scripting\AST\AST Nodes.dm"
#include "code\modules\scripting\AST\Blocks.dm"
#include "code\modules\scripting\AST\Statements.dm"