From f2611af3d802d57d7141ce05469d7aeeef56c742 Mon Sep 17 00:00:00 2001
From: fj45
Date: Wed, 4 Mar 2015 18:06:34 +0800
Subject: [PATCH 01/27] Removes Art storage, Revamps Port Emergency Storage
All items from art storage have been moved into the dorm area and
emergency storage is now much bigger and has a few extra bits of
equipment.
---
maps/cyberiad.dmm | 81 ++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 44 deletions(-)
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 07a8e6e722e..7a6303af36c 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -2381,12 +2381,12 @@
"aTO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/hallway/primary/port)
"aTP" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port)
"aTQ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/port)
-"aTR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/port)
+"aTR" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/port)
"aTS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/port)
-"aTT" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor,/area/hallway/primary/port)
-"aTU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/port)
+"aTT" = (/obj/structure/table,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/item/device/camera_film,/obj/item/device/camera,/turf/simulated/floor,/area/hallway/primary/port)
+"aTU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock{name = "Port Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
"aTV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/port)
-"aTW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/port)
+"aTW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
"aTX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor,/area/hallway/primary/port)
"aTY" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/hallway/primary/port)
"aTZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/hallway/primary/central/nw)
@@ -2461,10 +2461,10 @@
"aVq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port)
"aVr" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/port)
"aVs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor,/area/hallway/primary/port)
-"aVt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/port)
-"aVu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/port)
+"aVt" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/storage/emergency2)
+"aVu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
"aVv" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Port Hallway"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port)
-"aVw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/port)
+"aVw" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/port)
"aVx" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/hallway/primary/port)
"aVy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
"aVz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
@@ -2533,12 +2533,12 @@
"aWK" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
"aWL" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/turf/simulated/floor,/area/crew_quarters/locker)
"aWM" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker)
-"aWN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/storage/art)
-"aWO" = (/obj/machinery/door/airlock/glass{name = "Art Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/art)
-"aWP" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
+"aWN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/storage/emergency2)
+"aWO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/table,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plating,/area/storage/emergency2)
+"aWP" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency2)
"aWQ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/hallway/primary/port)
"aWR" = (/obj/structure/table,/turf/simulated/floor,/area/hallway/primary/port)
-"aWS" = (/obj/structure/table,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/hallway/primary/port)
+"aWS" = (/obj/machinery/light_switch{pixel_y = 28},/obj/item/device/flashlight/flare,/turf/simulated/floor/plating,/area/storage/emergency2)
"aWT" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port)
"aWU" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/hallway/primary/port)
"aWV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/port)
@@ -2628,12 +2628,12 @@
"aYB" = (/obj/machinery/vending/hatdispenser,/turf/simulated/floor,/area/crew_quarters/locker)
"aYC" = (/obj/machinery/vending/suitdispenser,/turf/simulated/floor,/area/crew_quarters/locker)
"aYD" = (/obj/machinery/vending/shoedispenser,/turf/simulated/floor,/area/crew_quarters/locker)
-"aYE" = (/turf/simulated/wall,/area/storage/art)
-"aYF" = (/obj/structure/table,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/storage/art)
-"aYG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/storage/art)
-"aYH" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/storage/art)
-"aYI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
-"aYJ" = (/obj/machinery/door/airlock{name = "Port Emergency Storage"; req_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency2)
+"aYE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/red/partial,/turf/simulated/floor/plating,/area/storage/emergency2)
+"aYF" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/port)
+"aYG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/hallway/primary/port)
+"aYH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/hallway/primary/port)
+"aYI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor,/area/hallway/primary/port)
+"aYJ" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/hand_labeler,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"aYK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/storage/tools)
"aYL" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access_txt = "12"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tools)
"aYM" = (/turf/simulated/wall,/area/storage/tools)
@@ -2697,14 +2697,14 @@
"aZS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/port)
"aZT" = (/obj/structure/closet/wardrobe/mixed,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/crew_quarters/locker)
"aZU" = (/obj/effect/landmark{name = "lightsout"},/turf/simulated/floor,/area/crew_quarters/locker)
-"aZV" = (/obj/structure/table,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor,/area/storage/art)
-"aZW" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/art)
-"aZX" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/storage/art)
+"aZV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/storage/emergency2)
+"aZW" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor,/area/crew_quarters/locker)
+"aZX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/emergency2)
"aZY" = (/turf/simulated/wall,/area/storage/emergency2)
-"aZZ" = (/obj/machinery/light_switch{pixel_y = 28},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency2)
-"baa" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/storage/emergency2)
+"aZZ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency2)
+"baa" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/decal/warning_stripes/white/hollow,/turf/simulated/floor/plating,/area/storage/emergency2)
"bab" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bac" = (/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bac" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/emergency2)
"bad" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Auxiliary Tool Storage"; dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/storage/tools)
"bae" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/storage/tools)
"baf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/storage/tools)
@@ -2773,11 +2773,9 @@
"bbq" = (/obj/structure/table,/turf/simulated/floor,/area/crew_quarters/locker)
"bbr" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker)
"bbs" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/camera{c_tag = "Locker Room East"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker)
-"bbt" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/turf/simulated/floor,/area/storage/art)
-"bbu" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/storage/art)
-"bbv" = (/obj/structure/table,/obj/item/device/camera_film,/obj/item/device/camera,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor,/area/storage/art)
-"bbw" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/storage/emergency2)
-"bbx" = (/obj/machinery/light/small,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency2)
+"bbt" = (/turf/simulated/floor/plating,/area/storage/emergency2)
+"bbu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
+"bbv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/obj/structure/closet/hydrant{pixel_x = -33},/obj/effect/decal/warning_stripes/red/partial,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bby" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency2)
"bbz" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency2)
"bbA" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/storage/tools)
@@ -2857,7 +2855,6 @@
"bcW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/port)
"bcX" = (/obj/structure/closet/wardrobe/grey,/obj/machinery/requests_console{department = "Locker Room"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/crew_quarters/locker)
"bcY" = (/obj/structure/table,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor,/area/crew_quarters/locker)
-"bcZ" = (/obj/structure/table,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/crew_quarters/locker)
"bda" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor,/area/crew_quarters/locker)
"bdb" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor,/area/crew_quarters/locker)
"bdc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/storage/tools)
@@ -2938,7 +2935,6 @@
"bez" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/locker)
"beA" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor,/area/crew_quarters/locker)
"beB" = (/obj/structure/closet/secure_closet/personal,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/crew_quarters/locker)
-"beC" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/port)
"beD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"beE" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"beF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/port)
@@ -3027,7 +3023,6 @@
"bgk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bgl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/port)
"bgm" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
-"bgn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/port)
"bgo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/maintenance/port)
"bgp" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/storage/tools)
"bgq" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/storage/tools)
@@ -3085,7 +3080,6 @@
"bhq" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bhr" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bhs" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bht" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bhu" = (/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bhv" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/white,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bhw" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "delivery"},/area/crew_quarters/locker)
@@ -3553,7 +3547,6 @@
"bqq" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Research and Development Desk"; req_access_txt = "47"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "rdlab"; name = "Research and Development Lab Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/lab)
"bqr" = (/obj/machinery/autolathe,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bqs" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/color/latex,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
-"bqt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"},/obj/structure/closet/hydrant{pixel_x = -33},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bqu" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Starboard Emergency Storage APC"; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bqv" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bqw" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "specops_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "13"},/turf/space,/area)
@@ -13138,22 +13131,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaJHaOiaKRaKSaJGaKTaJzaKTaJzaKTaJzaKTaJGaKUaKVaGdaERaOjaOkaOlaOmaOnaOoaDyaOpaOqaOraOsaOtaOuaOvaOwaOwaHnaOxaOyaOzaOAaOBaOCaODaOEaOFaOGaHpaaaaabaaaaOHaOIaOHaaaaabaaaayaaDTaDUaOJaOKaOLaOMaONaDUaAYbyxaOOaOPaFmaOQaORaFpaOSaFpaOTaOUaOVbyxaOWaOXaOYaOZaPaaPbaPcbPhaaaaaabNtbPSaPfaPgbCtaPhaHGaHGaHGaPiaHGaHGaHGbScaPjaPkaPjbSUbSYaPjaPmaPjbTcaPnaPoaPpaPqaPrbTcbTHbUbbTYbUgbTYbTYbTYbTYbUhbTYbTYbUmbTYbTYbTYbTYaPvaJubLLaPwaNRaPxaPyaPzaPAaPBbUoaPDaPEbLNbDSaPGaPHaPIaPJbPgaMtaMuaMvaPKaPLbEFaPMaOgaOgaOhaMFaMFaMFaMFaMGaMHaaaaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPNaPOaIbaJxaJGaJzaJzaPPaJzaJzaPQaJzaJGaJHaPRaPSaERaPTaPUaPVaPWaPVaPVaPVaPVaPVaPXaDyaySaPYaPYaPYaPYaHnaPZaQaaQbaHnaHnaHnaHnaPZaQcaQdaHpaQfaQgaQgaQhaQiaQjaQgaQgaQkaQeaQlaDUaQmaDUaQnaQobVfaDUaQrbyxbyxbyxbyxaQsaQtaQuaQvaQuaQwaQxbyxbyxaQyaOZaOZaOZaOZaQzaQAbVVbVYbVXbNtaQEaPfaQFbCtbCtbCtbCtbCtbCtbCtaPjaPjbScaQGaQHaQIaQJaQKaQLaQMaQNbTcaQOaQPaQQaQRaQSbTcaQTaQUaQVaQWaQVaQXaRaaQYaQZaRbaRcaRdaReaRfaRgbTYaRhaMabWaaRjaRkaPxaRlaPzaPAaRmbLNaRnaRoaRpaRqaRraObaObbLNbLNaMtaMuaMvaRsaRtbEFaRuaRvaRwaRxaRyaRzaMFaMFaRAaMHaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPNaIbaIcaIbaIbaIdaIeaIbaIbaIcaPOaRBayaaRCaPTaCyaRDaRDaREaRDaRFaySaRGaRHaDyaRIaRJaRKaRLaRMaRNaRLaROaRLaRLaRLaRPaRLaRLaRQaRRaRSaRTaRUaRVaRTaRWaRTaRTaRTaRTaRXaRYaRZaRLaRLaSaaSbaScaSdaSeaSfaSgaShaSiaSjaSkaSkaSkaSkaSkaSkaSlaSmaSnaSoaSpaSqaSraSsaStaSuaOZaOZaSvaSwaSxaSwaSyaSzaSAaSBaSCaSDaSEaPjaSFaSGaSHaSIaSJaSJaSKaSLaSMaSNbTcaSOaSPaSQaSQaSRbTcaSSaSTaSUaSVaSWaSWaSXaSZdhSaSYaTaaTbaTcaTdaTebTYaPvaTfbLLaTgaThaThaTiaTjaThaTkbLNaTlaTmbLNaTnaToaObaTpbLNaTqaTraTsaMvaOeaOebEFaTtbIgbWdbWebIgbIgbIgbIgbIgabAacOaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCyaTuaTvaHcaHcaHcaHcaTwaTuaCyaHeayaaTxaTyaTzaTAaTBaTCaTCaTDaySaTEaRHaTFaTGaRJaTHaTIaTJaTKaTKaYgaTLaTLaTLaTMaTNaTNaTOaTPaTQaTKaTKaTRaTSaTTaTUaTVaTVaTWaTVaTXaTSaTSaTSaTYaSbaScaSdaSeaSeaSeaSeaTZaSeaSeaSeaSeaSeaSeaUaaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaUkaUkaUlaUmaUmaUmaUnaSEaSEaSEaUoaUpaSEaPjaUqaUraSJaSJaUsaSJaUtaUuaSMaUvbTcaUwaUxaUyaUzaUAbTcaUBaUCaUDaUEaUFaUGbTYbWQaUIbWQbTYbTYbTYbUmbTYbTYaPvaJubLLaUJaNRaNRaNRaUKaNRaULbLNbLNbLNbLNbLNbLNbLNaUMbLNaMvaMvaMuaMvaUNaUOaOeaUPaUQaURaUSaUTaUUaUVaUWaUXaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaGbayaaTzaAPaGdaUYaUZaVaaVbaGdaAPaVcaVdayaaVeaPTaTzaVfaVgaTCaTCaTDaySaVhaRHaDyaTGaRJaViaVjaVkaRLaRLaVlaVmaVnaRLaVoaVpaVqaVpaVraVsaVpaVpaVtaVpaVpaVuaVvaVpaVwaVpaVxaRLaRLaRLaVyaVzaVAaVBaVCaVDaVCaVEaVFaVEaVEaVEaVEaVEaVEaVGaVHaVIaVIaVIaVIaVJaVIaVKaVLaVIaVIaVMaVNaVOaVOaVOaVOaVOaVOaVOaVPaSEaSEaPjaVQaVRaVSaVTaVTaVUaVVaUuaSMaVWbTcbTcbTcbTcbTcaVXbTcaVYaVZaWaaWbaQVaWcbTYaWdaWeaWfaWgaWhaWiaWjaWkbTYaPvaJubLLaWlaWmaNRaWnaWoaNRaWpaWpbLLaWqaWraWsaOeaWtaWuaWvaMvaMvaWwaWxaOeaWyaOeaWzaUQaURaWAaWBaUQaUQaWCaWDaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaySaDwaTuaPSaERaDyaDyaESaPSaTuaPSaWEaWFaWGaWHaDwaWIaWIaREaWIaRFaySaWJaRHaDyaySaPYaPYaWKaYraYraYraYraYraYraWLaWMaYraYraYraYraYraYEaWNaWOaWNaYEaWPaPYaWQaVjaWRaWSaWTaWUaRLaWVaPYaWWaWWaWXaWXaWXbXMbXNbXNbXNbXNbXNbXNbXNbXObYMbYmcbAbYmcbBcbBcbGcbDcbZcbYccwbXOccIbVYbVYbVYbVYbVYbVYccJaXkaXkaXkaPjaXlaXmaXnaXnaXnaXnaXoaKyaXpaXqaXraXsaXtaXuaXvaXwbTcbTcaXxccOcencdjcfnbTYaXAaXBaXCaXCaXCaXCaXDaXEbTYaXFaJubLLaXGaNRaWnaWnaWoaWnaNRaXHbLLaXIaXJaXKaOeaMvaXLaXMaXNaXNaXOaXPaXQaXRcfoaXSaXTaXUaXVaUSaUQaUQaXWaWDaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCyaXXaDyaXYaXZaYaaYbaYcaYdaYbaYeaYfaYbaYbbcOaYhaYiaYjaYkaYkaYkaYlaYkaYmaYnaySaYoaYpaYqaYraYsaYtaYuaYvaYwaYxaYyaYzaYAaYBaYCaYDaYEaYFaYGaYHaYEaYIaZYaZYaYJaZYaZYaYMaYMaYKaYLaYMaYMaYMaYNaSeaSjcfsaaaaaaaaaaaaaaaaaaaaabXOaYPaYQaYRaYSaYTaYUaYVaYWaYXaYYaYZbXOaaaaaaaaaaaaaaaaaaaaacftaZaaSEaZbaPjaZcaXmaXqaXqaXqaXqaXqaZdaZeaXqaXqaXqaXtaZfaZfaZgaZhaZiaZjaZkaZlaZmaZnbTYaZoaZpaZqaZraZraZqaZsaZtbTYaPvaZubLLaZvaZwaNRaWnaWoaNRaZxaZxbLLbLLaZybLLaOeaZzaWuaWxaZAaZAaZBaWxaOeaOeaOeaZCaUQaZDaZDaZEaZDaUQaZFaWDaaaaaaaaaaZGaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDwaZHaZIaZHaZHaZHaZHaZHaZHaZIaZHaZHaZJaDyaZKaZLaDyaDyaZMaDyaZNaZOaZPaZQaZRaySaYpaYpaZSaYraZTaYxaYxaYxaYxaYxaYyaZUaYxaYxaYxaYxaYEaZVaZWaZXaYEaYIaZYaZZbaababbacaYMbadbaebafbagbahbaiaYNaSeaSjcfsaaaaaaaaaaaabXObXObXObXObajbakbalbambanbaobapbaqbarbasbatbXObXObXObXOaaaaaaaaaaaacftaZaaSEaSEbauaXqbavbawbaxaXqbaybazaJabaAbaBbaCaXqaXtdqXaZfbaDbaEaZfbaFbaGbaHbaIaZfcfubaKbaLaZqaZraZraZqbaMbaNbTYaPvbaObLLaXGaNRaWnaWnaWoaWnaNRaNRbaPbaQaNRbaRaOebaSbaTbaUaZAaZAbaVbaUbaWaOebaXbaYaUQbaZbaZbbabaZaUQaXWbbbbbcbbdbbdbbeaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayabbfbbgbbgbbgbbgbbgbbgbbgaGjayaaySbbhbbibbjbbjbbjbbjbbjbbjcfvbbjbbjbbjaySaYpbblbbmaYrbbnaYxaYxbbobbpbbqbbrbboaYxaYxaYxbbsaYEbbtbbubbvaYEaYIaZYbbwbbxbbybbzaYMbbAbbBbbCbbDbbEbbFbbGbbHaSjcfwcgtaQqbXObXObXObbJbbKbbLbbMbbNbbNbbObbPbbNbbQbbNbbRbbSbbTbbUbbVbbWbXObXObXOaQqccIcgIaZaaSEaSEaPjbbYbavbaBbaxaXqbbZbcaaXqbcbbccbaCaXqaXtaZfaZfbcdbcebcfbcgbchbcibcjaZfcgVbaKbclaZqaZraZrbcmbcnbaNbTYaPvbcobLLbcpbcqbcraWnaWobcsaNRaNRbctaNRbcubcvaOebcwbcxbcyaZAaZAbczbcybcAaOebcBbaYaUQaUQaUQaUSaUQaUQbcCbcDbcEbcFbcGbcHaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIaabbcJaGeaDAbcKbbjbcLbcMbcNbcRbcPbcQbhlbcSbbjbcTbcUbcVbcWaYrbcXaYxaYxbbobbqbcYbcZbboaYxaYxbdabdbaYEaYEaYEaYEaYEaYIaZYaZYaZYaZYaZYaYMbdcbbDbddbbDbdebbFaYNbdfaSjaSkaSkbdgcgWbdibXObdjbalbdkbbNbbNbbNbdlbdmbdnbdmbdobdpbdqbdmbdrbdsbdtbXObducgWbdvbdwbdxaZaaSEaSEbauaXqbdyaXqaXqaXqbdzbdAaXqbcbbdBbaCaXqaXtaZfaZfbdCbdDbdEbdFbdGbdHbcjbdIbTYbdJbclaZqaZraZraZqbcnbdKbTYbdLchpbLLchqbLLbLLbdMaWobdNbdOaNRbdPbdQaRlbdRcfobdSbdTbdUbdVbdVbdWbdXbdYcfobdZbeaaUQbebaUQaUSaUQaUQbecbedbbcbbdbbdbeeaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbefbegbehaERaZKbbjbcLbeibejbcLbekbelbembenbbjbeobepbeqberaYrbesbetbeubevbewbexbeybezbezbezbeAbeBaYrbeCbcUbeDbeEbeFbblbblbeGberbeHaYMbeIbeJbeKbeLbeMbeNaYNbdfaSeaSeaSebeObePbeQbeRbeSbeTbbNbeUbeVbeWbeXbeYbeZbfabfbbfcbfdbfebeSbffbfgbfhbfibfjbfkbflbfmbfnaSEbfoaPjaXqbfpbfqbaCaXqbfrbfsaXqbftbfubaCaXqaXtaZfaZfaZfaZgaZfbfvaZfbdHbcjbfwbTYbfxbclaZqaZraZraZqbcnbfybTYbfzbfAbfAbfBbfCbfDbfEbfFbfGbfGbfGbfGbfGbfGbfHbfIbfJaZAaZAaZAaZAaZAaZAbfKbfLbfMbaYaUQaUQaUQaUSaUQaUQbfNaWDbfObfObfOaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbfPbfQbfRbfSaZKbbjbfTbcLbfUbfUbfUbfVbcLbfWbbjbfXbfYbeqbfZbfZbfZbfZbgabfZbgbaYxbgcbgdbgebgebgfbggaYrbghbgibgjbgkbglbgmbgmbgnbgobgobgpbgpbgpbgpbgpbgqaYMaYNbgrbgsbgtbgubgvchrbgxchsbgybeZbgzbgAcNxcNxcNxcNxbgBcNxdiMdiOdiNbgFbgzbgGbgHbXObgIchtbgKbgLbgMbgNaSEaSEbauaXqbgOaXqaXqaXqaLLaXqaXqbgPbgPbgQbgQbgRaZfaZfbgSbgTaZfaZfaZfbgUbgVbgWbTYbaNbclaZqaZqaZqaZqbcnaXEbTYbgXbgYbgYbgZbgYbhaaWnaWnaWnaWnbhbaWnaWnaWnbhcbfLaZAaZAaZAaZAaZAaZAaZAbfKbfLbfMbaYaUQaZDaZDaZEaZDaUQbhdaWDbhebhfbhgaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbhibhjbehbhkaWHbjQbcLbhmbfUbfUbfUbfVbhmbcLbbjbhnbhobeqbfZbhpbhqbhrbhsbfZbhtbhubhvaYrbhwbhxbhybhzaYrbblbhAbhBbhBbhCbhBbhBbhBbhBbhDbhEbhEbhEbhFbhEbhGbiWbhHbhIbhJchuchuchuchuchuchucjcbhKcjccNxcNxbhLbhMbhNbhObhPbhQbhLdiPcNxcjVbhRcjVcjVcjVcjVcjVcjVcjVbgNaSEaSEaPjbhSbhTaXqbhUaXqbhVaXqbhWbhXbhYbgQbhZbTcbiabibbTcbTcbicbidbidbidbTcbTcbTYbiebifbigbigbigbigbifbihbTYbiibgYbgYbgZbijbLLbikbilbimbinbiobipbiqbirbisaOebitaMvbiuaZAaZAbiuaMvbivaOebiwbaYaUQbaZbaZbbabaZaUQbfNaWDbfObfObfOaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCyaTuaTvaHcaHcaHcaHcaTwaTuaCyaHeayaaTxaTyaTzaTAaTBaTCaTCaTDaySaTEaRHaTFaTGaRJaTHaTIaTJaTKaTKaYgaTLaTLaTLaTMaTNaTNaTOaTPaTQaTKaTKaYGaTNaYIaYHaTVaTVaTVaTVaTXaTSaTSaTSaTYaSbaScaSdaSeaSeaSeaSeaTZaSeaSeaSeaSeaSeaSeaUaaUbaUcaUdaUeaUfaUgaUhaUiaUjaUkaUkaUkaUlaUmaUmaUmaUnaSEaSEaSEaUoaUpaSEaPjaUqaUraSJaSJaUsaSJaUtaUuaSMaUvbTcaUwaUxaUyaUzaUAbTcaUBaUCaUDaUEaUFaUGbTYbWQaUIbWQbTYbTYbTYbUmbTYbTYaPvaJubLLaUJaNRaNRaNRaUKaNRaULbLNbLNbLNbLNbLNbLNbLNaUMbLNaMvaMvaMuaMvaUNaUOaOeaUPaUQaURaUSaUTaUUaUVaUWaUXaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaGbayaaTzaAPaGdaUYaUZaVaaVbaGdaAPaVcaVdayaaVeaPTaTzaVfaVgaTCaTCaTDaySaVhaRHaDyaTGaRJaViaVjaVkaRLaRLaVlaVmaVnaRLaVoaVpaVqaVpaVraVsaVpaVpaVpaVpaVpaTWaVvaVpaVpaVpaVxaRLaRLaRLaVyaVzaVAaVBaVCaVDaVCaVEaVFaVEaVEaVEaVEaVEaVEaVGaVHaVIaVIaVIaVIaVJaVIaVKaVLaVIaVIaVMaVNaVOaVOaVOaVOaVOaVOaVOaVPaSEaSEaPjaVQaVRaVSaVTaVTaVUaVVaUuaSMaVWbTcbTcbTcbTcbTcaVXbTcaVYaVZaWaaWbaQVaWcbTYaWdaWeaWfaWgaWhaWiaWjaWkbTYaPvaJubLLaWlaWmaNRaWnaWoaNRaWpaWpbLLaWqaWraWsaOeaWtaWuaWvaMvaMvaWwaWxaOeaWyaOeaWzaUQaURaWAaWBaUQaUQaWCaWDaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaySaDwaTuaPSaERaDyaDyaESaPSaTuaPSaWEaWFaWGaWHaDwaWIaWIaREaWIaRFaySaWJaRHaDyaySaPYaPYaWKaYraYraYraYraYraYraWLaWMaYraYraYraYraYraYraTRberaZYaZYaTUaZYaZYaZYaWRaTTaWTaWUaWQaWVaPYaWWaWWaWXaWXaWXbXMbXNbXNbXNbXNbXNbXNbXNbXObYMbYmcbAbYmcbBcbBcbGcbDcbZcbYccwbXOccIbVYbVYbVYbVYbVYbVYccJaXkaXkaXkaPjaXlaXmaXnaXnaXnaXnaXoaKyaXpaXqaXraXsaXtaXuaXvaXwbTcbTcaXxccOcencdjcfnbTYaXAaXBaXCaXCaXCaXCaXDaXEbTYaXFaJubLLaXGaNRaWnaWnaWoaWnaNRaXHbLLaXIaXJaXKaOeaMvaXLaXMaXNaXNaXOaXPaXQaXRcfoaXSaXTaXUaXVaUSaUQaUQaXWaWDaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCyaXXaDyaXYaXZaYaaYbaYcaYdaYbaYeaYfaYbaYbbcOaYhaYiaYjaYkaYkaYkaYlaYkaYmaYnaySaYoaYpaYqaYraYsaYtaYuaYvaYwaYxaYyaYzaYAaYBaYCaYDaYrbblaYFaZYbbzaYEaWSaWPaZYaZYaZYaYMaYMaYKaYLaYMaYMaYMaYNaSeaSjcfsaaaaaaaaaaaaaaaaaaaaabXOaYPaYQaYRaYSaYTaYUaYVaYWaYXaYYaYZbXOaaaaaaaaaaaaaaaaaaaaacftaZaaSEaZbaPjaZcaXmaXqaXqaXqaXqaXqaZdaZeaXqaXqaXqaXtaZfaZfaZgaZhaZiaZjaZkaZlaZmaZnbTYaZoaZpaZqaZraZraZqaZsaZtbTYaPvaZubLLaZvaZwaNRaWnaWoaNRaZxaZxbLLbLLaZybLLaOeaZzaWuaWxaZAaZAaZBaWxaOeaOeaOeaZCaUQaZDaZDaZEaZDaUQaZFaWDaaaaaaaaaaZGaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDwaZHaZIaZHaZHaZHaZHaZHaZHaZIaZHaZHaZJaDyaZKaZLaDyaDyaZMaDyaZNaZOaZPaZQaZRaySaYpaYpaZSaYraZTaYxaYxaYxaYxaYxaYyaZUaYxaYxaYxaYxaYrbblaVwaZYaWOaWNaVuaVubabbbyaVtaYMbadbaebafbagbahbaiaYNaSeaSjcfsaaaaaaaaaaaabXObXObXObXObajbakbalbambanbaobapbaqbarbasbatbXObXObXObXOaaaaaaaaaaaacftaZaaSEaSEbauaXqbavbawbaxaXqbaybazaJabaAbaBbaCaXqaXtdqXaZfbaDbaEaZfbaFbaGbaHbaIaZfcfubaKbaLaZqaZraZraZqbaMbaNbTYaPvbaObLLaXGaNRaWnaWnaWoaWnaNRaNRbaPbaQaNRbaRaOebaSbaTbaUaZAaZAbaVbaUbaWaOebaXbaYaUQbaZbaZbbabaZaUQaXWbbbbbcbbdbbdbbeaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayabbfbbgbbgbbgbbgbbgbbgbbgaGjayaaySbbhbbibbjbbjbbjbbjbbjbbjcfvbbjbbjbbjaySaYpbblbbmaYrbbnaYxaYxbbobbpbbqbbrbboaYxaYxaYxbbsaYrbblaYFaZYaZZaZXbbtbbtbacbaaaVtaYMbbAbbBbbCbbDbbEbbFbbGbbHaSjcfwcgtaQqbXObXObXObbJbbKbbLbbMbbNbbNbbObbPbbNbbQbbNbbRbbSbbTbbUbbVbbWbXObXObXOaQqccIcgIaZaaSEaSEaPjbbYbavbaBbaxaXqbbZbcaaXqbcbbccbaCaXqaXtaZfaZfbcdbcebcfbcgbchbcibcjaZfcgVbaKbclaZqaZraZrbcmbcnbaNbTYaPvbcobLLbcpbcqbcraWnaWobcsaNRaNRbctaNRbcubcvaOebcwbcxbcyaZAaZAbczbcybcAaOebcBbaYaUQaUQaUQaUSaUQaUQbcCbcDbcEbcFbcGbcHaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIaabbcJaGeaDAbcKbbjbcLbcMbcNbcRbcPbcQbhlbcSbbjbcTbcUbcVbcWaYrbcXaYxaYxbbobbqbcYaZWbboaYxaYxbdabdbaYrbblaYFaZYaZYaZVaZYaZYaZYaZYaZYaYMbdcbbDbddbbDbdebbFaYNbdfaSjaSkaSkbdgcgWbdibXObdjbalbdkbbNbbNbbNbdlbdmbdnbdmbdobdpbdqbdmbdrbdsbdtbXObducgWbdvbdwbdxaZaaSEaSEbauaXqbdyaXqaXqaXqbdzbdAaXqbcbbdBbaCaXqaXtaZfaZfbdCbdDbdEbdFbdGbdHbcjbdIbTYbdJbclaZqaZraZraZqbcnbdKbTYbdLchpbLLchqbLLbLLbdMaWobdNbdOaNRbdPbdQaRlbdRcfobdSbdTbdUbdVbdVbdWbdXbdYcfobdZbeaaUQbebaUQaUSaUQaUQbecbedbbcbbdbbdbeeaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbefbegbehaERaZKbbjbcLbeibejbcLbekbelbembenbbjbeobepbeqberaYrbesbetbeubevbewbexbeybezbezbezbeAbeBaYrbblbcUbeDbeEbeFbblbblbeGberbeHaYMbeIbeJbeKbeLbeMbeNaYNbdfaSeaSeaSebeObePbeQbeRbeSbeTbbNbeUbeVbeWbeXbeYbeZbfabfbbfcbfdbfebeSbffbfgbfhbfibfjbfkbflbfmbfnaSEbfoaPjaXqbfpbfqbaCaXqbfrbfsaXqbftbfubaCaXqaXtaZfaZfaZfaZgaZfbfvaZfbdHbcjbfwbTYbfxbclaZqaZraZraZqbcnbfybTYbfzbfAbfAbfBbfCbfDbfEbfFbfGbfGbfGbfGbfGbfGbfHbfIbfJaZAaZAaZAaZAaZAaZAbfKbfLbfMbaYaUQaUQaUQaUSaUQaUQbfNaWDbfObfObfOaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbfPbfQbfRbfSaZKbbjbfTbcLbfUbfUbfUbfVbcLbfWbbjbfXbfYbeqbfZbfZbfZbfZbgabfZbgbaYxbgcbgdbgebgebgfbggaYrbghbgibgjbgkbglbgmbgmbbubgobgobgpbgpbgpbgpbgpbgqaYMaYNbgrbgsbgtbgubgvchrbgxchsbgybeZbgzbgAcNxcNxcNxcNxbgBcNxdiMdiOdiNbgFbgzbgGbgHbXObgIchtbgKbgLbgMbgNaSEaSEbauaXqbgOaXqaXqaXqaLLaXqaXqbgPbgPbgQbgQbgRaZfaZfbgSbgTaZfaZfaZfbgUbgVbgWbTYbaNbclaZqaZqaZqaZqbcnaXEbTYbgXbgYbgYbgZbgYbhaaWnaWnaWnaWnbhbaWnaWnaWnbhcbfLaZAaZAaZAaZAaZAaZAaZAbfKbfLbfMbaYaUQaZDaZDaZEaZDaUQbhdaWDbhebhfbhgaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbhibhjbehbhkaWHbjQbcLbhmbfUbfUbfUbfVbhmbcLbbjbhnbhobeqbfZbhpbhqbhrbhsbfZaYJbhubhvaYrbhwbhxbhybhzaYrbblbhAbhBbhBbhCbhBbhBbhBbhBbhDbhEbhEbhEbhFbhEbhGbiWbhHbhIbhJchuchuchuchuchuchucjcbhKcjccNxcNxbhLbhMbhNbhObhPbhQbhLdiPcNxcjVbhRcjVcjVcjVcjVcjVcjVcjVbgNaSEaSEaPjbhSbhTaXqbhUaXqbhVaXqbhWbhXbhYbgQbhZbTcbiabibbTcbTcbicbidbidbidbTcbTcbTYbiebifbigbigbigbigbifbihbTYbiibgYbgYbgZbijbLLbikbilbimbinbiobipbiqbirbisaOebitaMvbiuaZAaZAbiuaMvbivaOebiwbaYaUQbaZbaZbbabaZaUQbfNaWDbfObfObfOaWDaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbcIbixaDwbiybizbiAbbjbeibeibeibcLbiBbiCbiDbiEbbjbiFbiGbeqbfZbfZbfZbiHbiIbfZbiJbiKbiLaYrbhwbhxbhybiMaYrbblbhAbhBbiNbiObiPbiQbiRbhBbiSbiTbiUbiVbiWbiWbiWbiWbiXbiYbiZchubjabjbbjcbjdbjebjfbjgbjhcNxbjibhNbjjbjkbjlbjkbjjbhNbjmcNxbjnbjobjpbjqbjrbjsbjtbjucjVbjvbjwbjwcmhaPjaPjaPjaPjbjybaubjycmSaPjbSYaPjaPjbTcbTcbTcbTcbjAbjBbjBbjBbjBbjCbjDbTYcncbjFcncbjGbjGcncbjFcncbTYbiibgYbgYbjHbijbLLbLLbLLbLLbLLchqbLLbLLbLLbLLaOecndcnQcnecnecnecnecoLaOeaOebjJbjKaUQaUQaUQaUSaUQaUQbecbbbbjLbbdbbdbjMaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbayabjNaHcbehaySaySaySaySaySaySbjObjPbbjbbjbbjbbjbbjbbjccWbbjbbjbbjbjRbjRbjSbfZbjTbjUbiHbjVbfZbjWbjXbjWaYrbhwbhxbhybjYaYrbblbhAbhBbjZbkabkbbiQbkbbhBbiSbkcbkdbkebkfbkgbkhbiWbkibkjbiZcoMbklbkmbknbkobkobknbkpbkqcNxbkrbhNbhNbksbktbjkbjjbhNbkudiNbkvbkwbkxbkybkzbkAbkxbkBcjVbkCbkDbkEbkFbkGbkHbkIbkJbkJbkJbkJbkJbkJbkKbkLbkMbkNbkJbkObkJbkJbkJbkJbkJbkJbkJbkJbkPbkQbkRbkRbkRbkRbkRbkRbkSbkHbkTbkUbkUbkVbkWbkXbkWbkYbkWbkZblablbbkWblcbldbleblfblgblgblgblgblgblgblgblhblibljbljbljbljblkbljbllblmblnbloblpbcGblqaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblraaaaabblsaGebltblublvblwblwblwblwblwblxblyblzblAblBblCbjSbfZbfZbfZblDbiIbfZaYraYraYraYrbhwblEblFblGaYrblHblIbhBblJblKbiQbkbblLbhBbiSblMbkdbkebkeblNblObiWblPbkjbiZcoNblRblSblTblUblVblWbkpblXcNxblYbksbhNblZbmablZbhNbksbmbdiPbmcbkxbkxbkybmdbkAbkxbmecjVbmfbkEbkEbkFbkGbkHbkJbkJbkJbkJbkJbkJbkJbmgbkJbkJbkJbkJbkJbkJbmhbmibmibmibmibmibmibmibmibmibmibmibmibmibmibmjbmkbmlblgblgbmmbgYbgYbgYbgYbgYbgZbgYbgYbgYbgYbgYbgYbgYbgYbgYbgYbgYbgYbmnbgYbmobmpaUQaUQaUQaUQaUQaUQaUQbmqbedbbcbbdbbdbbeaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblrblrbefbegbmrbmsbmtbmubmubmubmvbmubmubmubmwberberberberbeqbfZbhpbmxbmybjVbfZbmzbmAbmzaYraYraYraYrbmBaYrbmCbhAbhBbmDbmEbkbbmFbmGbhBbiSbiWbmHbkebkebkebmIbiWbmJbkjbiZcoObmLblSblTbmMbmNblWbkpbmOcNxbmPbmQbhNbmRbmSbmTbjjbmUbmVdiQbmXbmYbmZbnabnbbncbkxbndcjVbnebnfbkEbkFbkGbkHbkJbngbkJbkJbkJbkJbnhbnibnibnibnibnjbkJbkJbkJbkJbnkbkJbngbnlbkJbnmbnnbnobkJbnpbnqbnqbnrbnsbntbnubgYbgYbgYbgYbgYbgYbgYbnvbnwbnxbgYbgYbgYbgYbgYbgYbgYbgYbgYbgYbnybnzbnzbnAbnBbnCbnDbnEbnEbnEbnEbnFbnGbnHaabaaaaaaaabaKPaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblrblrbnIbnJbnKbnLbnMbmubnNbnObnPbnPbnQbnRbnSbnTbnUbnUbnVbnWbfZbfZbfZbiHbnXbfZberberberberbnYbblbblbnZbgmboabobbocbodboebofbogbohbhBboibiWbojbkebkebkebokbolbombkjbonchuboobopbknbknbknbknbkpboqcNxdiRdiScNxcNxcNxcNxcNxcNxcNxdiPcjVbosbotboubovbowboxboycjVbozboAboAcpTcpTcpTcpTcpTcpTcpTcqxcqxcrkcqBboDboDcqBcrkcqxcqxcrtcrtcrtcrtcrtcrtcswcswboEcswcswcswcswcswctpboFcvyboGbgYbgYboHboHcxOcxOcxOcxOcxOboIbnzbnzbnybnzbgYbnzbnzbnzbnzboJcxQcxQcxQcxQboKcxYcxYcxYcxYcxYcxYcxYcxYcxYaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblrblrbhibhjbmrbmsboLbmuboMbmuboNboObmubmubmuaZSboPboQboQboRbfZbhpboSbiHboTbfZboUboVboWboXboYboZboZbpaboZbpbbpcbhBbpdbpebiQbpfbpgbocbphbiWbpibkebkebpjbpkbplbombkjbpmchubpnbpobppbpqbprbpsbptchuchubpuczkbpvbpwbpxbpwbpyczkaaaczEcjVbpzbpAbpBbpCbowbkxbpDcjVbpEbpFbpGcpTbpHbpIbpJbpKbpLcAgbpNbpObpPbpQbpRbpRbpQbpSbpTbpUcrtbpVbpWbpXbpYcrtbpZbqabqbbqcbqdbqebqebqfctpbqgcBocAMbqhcAMbqibqicxObqjbqkbqlcxOcBSbqncBScxObqobnzboJcxQcCqbqqcCqcxQbqrbqscxQbqtbqubqvcDsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblrblrbhibhjbmrbmsboLbmuboMbmuboNboObmubmubmuaZSboPboQboQboRbfZbhpboSbiHboTbfZboUboVboWboXboYboZboZbpaboZbpbbpcbhBbpdbpebiQbpfbpgbocbphbiWbpibkebkebpjbpkbplbombkjbpmchubpnbpobppbpqbprbpsbptchuchubpuczkbpvbpwbpxbpwbpyczkaaaczEcjVbpzbpAbpBbpCbowbkxbpDcjVbpEbpFbpGcpTbpHbpIbpJbpKbpLcAgbpNbpObpPbpQbpRbpRbpQbpSbpTbpUcrtbpVbpWbpXbpYcrtbpZbqabqbbqcbqdbqebqebqfctpbqgcBocAMbqhcAMbqibqicxObqjbqkbqlcxOcBSbqncBScxObqobnzboJcxQcCqbqqcCqcxQbqrbqscxQbbvbqubqvcDsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablrblrblrblrblrblrblrblrblrblraaabqwaTzbqxbizbqybmubqzbmubqAbqBbqCbqDbmubqEbqFbqGbqHboRbfZbfZbfZbfZbfZbfZbqIbqJbqKbqLbqMbhBbhBbhBbhBbhBbhBbhBbqNbhBbhBbhBbqObhBbqPbqQbqRbkebkebkebqSbolbqTbkjbqUchubqVbpocjccjccjcchubqWchubqXbqYcDXbqZbrabrbbrcbrdcDYbrebrfcjVbrgbkxbrhbribowbrjbkxcjVbrkbrlbrmcpTbrnbrobrpbrqbrrbrsbrtbpRbpRbpRbpRbpRbpRbpRbrubrvcDZbrxbrybrzbrAcrtbrBbrCbrDbrEbrFbrGbrCbqfctpbrHcBobrIbrJbrKbrLbrLcEFbrMbrNbrObrPbrQbrRbrScxOcFEbrTcGWcxQbrUbrVbrWbrXbrXbrYcxQbrZbsabsbcDsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGbayabjNaHcbhjbbgbbgbbgbscbbgbsdaERbsebsfbmubsgbshbsibsjbskbslbsmbcWbblbblbblbsnbnUbnUbnUbnUbnUbnUbsobspbspbsqbsrbhBbssbstbsubsvbswbsxbsybszbsAbsBbsCbsDbphbolbqRbkebkebsEbiWbiWbsFbsGbsHcGXbsIbsJbsKbsLcIWbsMbsNcJFbsObsPcDYbsQbsRbsQbsRbsScDYbrebsTdjnbsUbsVbsWbsXbsYbsZbtadjnbtbbpFbpFcpTbtcbtdbtebtfbtgcpTbrtbpRbpRbpRbpRbpRbpRbpRbthbtibtjbtkbtlbrxbtmcrtbtnbtobtpbrEbqfbrGbtqbtrctpbtseKcbtubtvbtvbtwbtxbtybtzbtAbtAbtAbtBbtAbtCeKdbtEbtFbtGeKebtHbtIbtJbtJbtJbtKcxQbtLbsabtMcDsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKPaKPaKPaKPaKPaaaaKPaKPaKPaKPaKPaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaMIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtNbtObtPbtQbtRbtSbtSbtTbtUaDybmubtVbtWbsjbtXbmubmubmuberbtYbtZbuabubbuabuabuabubbuaberberbhBbhBbhBbucbhBbudbudbudbudbudbudbsybuebufbugbuhbuibujbukbulbumbunbuobupbuqburbusbutbuubuvbuvbuwbuxeKfbuybuzeKgbuAbuBczkbuCbrcbuDbrabuEczkaaabuFeKheKibuGeKheKheKheKhbuHcjVbuIbpFbuJeKjbuKbuLbuMbuNbuOcpTbuPbuQbuRbuSbuTbuUbuVbuWbrubuXcrtbuYbtlbuZbvacrtbvbbvcbrDbrEbqfbrGbrCbqfctpbrHcBobvdbvebvfbvgbvheKkbvibvjbvkbvlbvmbvnbvocxObvpbvqbvrcxQbvsbvtbvubrXbvvbvwcxQbtLbsabvxcDsaaaaaaaaaaaaaabaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabhhbhhbhhbhhbhhbhhbhhbhhbhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
From a911b53e8b39f811c6d1250156527aff71ad1f93 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Wed, 4 Mar 2015 05:42:12 -0500
Subject: [PATCH 02/27] Life Proc Changes--Cold Space and and Temp Handling
---
code/game/gamemodes/cult/cult_items.dm | 2 +-
.../objects/items/devices/suit_cooling.dm | 180 -----------------
code/game/turfs/space/space.dm | 4 +-
code/modules/clothing/clothing.dm | 4 +-
code/modules/clothing/spacesuits/rig.dm | 8 +-
code/modules/mob/living/carbon/carbon.dm | 30 +++
code/modules/mob/living/carbon/human/life.dm | 183 +++++-------------
code/modules/mob/living/carbon/species.dm | 62 +++---
.../xenoarchaeology/tools/anomaly_suit.dm | 2 +-
code/setup.dm | 4 +-
paradise.dme | 1 -
11 files changed, 118 insertions(+), 362 deletions(-)
delete mode 100644 code/game/objects/items/devices/suit_cooling.dm
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index be1e71c6bb4..026e1f7499c 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -97,7 +97,7 @@
item_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
w_class = 3
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
deleted file mode 100644
index 577dba2fdbe..00000000000
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ /dev/null
@@ -1,180 +0,0 @@
-/obj/item/device/suit_cooling_unit
- name = "portable suit cooling unit"
- desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling."
- w_class = 4
- icon = 'icons/obj/device.dmi'
- icon_state = "suitcooler0"
- slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage
-
- //copied from tank.dm
- flags = CONDUCT
- force = 5.0
- throwforce = 10.0
- throw_speed = 1
- throw_range = 4
-
- origin_tech = "magnets=2;materials=2"
-
- var/on = 0 //is it turned on?
- var/cover_open = 0 //is the cover open?
- var/obj/item/weapon/stock_parts/cell/cell
- var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here
- var/charge_consumption = 16.6 //charge per second at max_cooling
- var/thermostat = T20C
-
- //TODO: make it heat up the surroundings when not in space
-
-/obj/item/device/suit_cooling_unit/New()
- cell = new/obj/item/weapon/stock_parts/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find
- cell.loc = src
-
-/obj/item/device/suit_cooling_unit/proc/cool_mob(mob/M)
- if (!on || !cell) return
-
- //make sure they have a suit and we are attached to it
- if (!attached_to_suit(M))
- return
-
- var/mob/living/carbon/human/H = M
-
- var/efficiency = H.get_pressure_protection() //you need to have a good seal for effective cooling
- var/env_temp = get_environment_temperature() //wont save you from a fire
- var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
-
- if (temp_adj < 0) //only cools, doesn't heat
- return
-
- var/charge_usage = (temp_adj/max_cooling)*charge_consumption
-
- H.bodytemperature -= temp_adj*efficiency
-
- cell.use(charge_usage)
-
- if(cell.charge <= 0)
- turn_off()
-
-/obj/item/device/suit_cooling_unit/proc/get_environment_temperature()
- if (ishuman(loc))
- var/mob/living/carbon/human/H = loc
- if(istype(H.loc, /obj/mecha))
- var/obj/mecha/M = loc
- return M.return_temperature()
- else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell))
- return H.loc:air_contents.temperature
-
- var/turf/T = get_turf(src)
- if(istype(T, /turf/space))
- return 0 //space has no temperature, this just makes sure the cooling unit works in space
-
- var/datum/gas_mixture/environment = T.return_air()
- if (!environment)
- return 0
-
- return environment.temperature
-
-/obj/item/device/suit_cooling_unit/proc/attached_to_suit(mob/M)
- if (!ishuman(M))
- return 0
-
- var/mob/living/carbon/human/H = M
-
- if (!H.wear_suit || H.s_store != src)
- return 0
-
- return 1
-
-/obj/item/device/suit_cooling_unit/proc/turn_on()
- if(!cell)
- return
- if(cell.charge <= 0)
- return
-
- on = 1
- updateicon()
-
-/obj/item/device/suit_cooling_unit/proc/turn_off()
- if (ismob(src.loc))
- src.loc << "\The [src] clicks and whines as it powers down." //let them know
- on = 0
- updateicon()
-
-/obj/item/device/suit_cooling_unit/attack_self(mob/user as mob)
- if(cover_open && cell)
- if(ishuman(user))
- user.put_in_hands(cell)
- else
- cell.loc = get_turf(loc)
-
- cell.add_fingerprint(user)
- cell.updateicon()
-
- user << "You remove the [src.cell]."
- src.cell = null
- updateicon()
- return
-
- //TODO use a UI like the air tanks
- if(on)
- turn_off()
- else
- turn_on()
- if (on)
- user << "You switch on the [src]."
-
-/obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/screwdriver))
- if(cover_open)
- cover_open = 0
- user << "You screw the panel into place."
- else
- cover_open = 1
- user << "You unscrew the panel."
- updateicon()
- return
-
- if (istype(W, /obj/item/weapon/stock_parts/cell))
- if(cover_open)
- if(cell)
- user << "There is a [cell] already installed here."
- else
- user.drop_item()
- W.loc = src
- cell = W
- user << "You insert the [cell]."
- updateicon()
- return
-
- return ..()
-
-/obj/item/device/suit_cooling_unit/proc/updateicon()
- if (cover_open)
- if (cell)
- icon_state = "suitcooler1"
- else
- icon_state = "suitcooler2"
- else
- icon_state = "suitcooler0"
-
-/obj/item/device/suit_cooling_unit/examine()
- set src in view(1)
-
- ..()
-
- if (on)
- if (attached_to_suit(src.loc))
- usr << "It's switched on and running."
- else
- usr << "It's switched on, but not attached to anything."
- else
- usr << "It is switched off."
-
- if (cover_open)
- if(cell)
- usr << "The panel is open, exposing the [cell]."
- else
- usr << "The panel is open."
-
- if (cell)
- usr << "The charge meter reads [round(cell.percent())]%."
- else
- usr << "It doesn't have a power cell installed."
\ No newline at end of file
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 6768fdf3afd..e954e5f95b1 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -3,9 +3,9 @@
name = "\proper space"
icon_state = "0"
- temperature = T0C
+ temperature = TCMB
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
-// heat_capacity = 700000 No.
+ heat_capacity = 700000
/turf/space/New()
if(!istype(src, /turf/space/transit))
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8c79383cc1a..33a75e7639c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -246,7 +246,7 @@ BLIND // can't see anything
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
-
+
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
if(!ignore_maskadjust)
@@ -334,7 +334,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT||HIDETAIL
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index cfe77d56f56..d1fa45e2018 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -61,7 +61,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
sprite_sheets = list(
@@ -320,7 +320,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
//Chief Engineer's rig
/obj/item/clothing/head/helmet/space/rig/elite
@@ -497,7 +497,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
slowdown = 1
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
@@ -516,7 +516,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
- allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
siemens_coefficient = 0.7
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 279755cc813..1b018e42b4b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -481,6 +481,36 @@
legcuffed = null
update_inv_legcuffed(1)
+/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
+ var/loc_temp = T0C
+ if(istype(loc, /obj/mecha))
+ var/obj/mecha/M = loc
+ loc_temp = M.return_temperature()
+
+ if(istype(loc, /obj/spacepod))
+ var/obj/spacepod/S = loc
+ loc_temp = S.return_temperature()
+
+ else if(istype(loc, /obj/structure/transit_tube_pod))
+ loc_temp = environment.temperature
+
+ else if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
+
+ else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
+
+ if(C.air_contents.total_moles() < 10)
+ loc_temp = environment.temperature
+ else
+ loc_temp = C.air_contents.temperature
+
+ else
+ loc_temp = environment.temperature
+
+ return loc_temp
+
/mob/living/carbon/show_inv(mob/living/carbon/user as mob)
user.set_machine(src)
var/dat = {"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4c03256ecb8..6f308b89e10 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -141,72 +141,21 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
handle_vampire()
-//Much like get_heat_protection(), this returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
-/mob/living/carbon/human/proc/get_pressure_protection()
+/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
+ ..()
+ var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
+
var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent.
-
- if(head && (head.flags & STOPSPRESSUREDMAGE))
- pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT
-
if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE))
pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT
-
- //Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure reduction.
- if(istype(wear_suit,/obj/item/clothing/suit/space))
- var/obj/item/clothing/suit/space/S = wear_suit
- if(S.can_breach && S.damage)
- var/pressure_loss = S.damage * 0.1
- pressure_adjustment_coefficient += pressure_loss
-
- pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) //So it isn't less than 0 or larger than 1.
-
- return 1 - pressure_adjustment_coefficient //want 0 to be bad protection, 1 to be good protection
-
-// Calculate how vulnerable the human is to under- and overpressure.
-// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%).
-// Suitdamage can modifiy this in 10% steps.
-/mob/living/carbon/human/proc/get_pressure_weakness()
-
- var/pressure_adjustment_coefficient = 1 // Assume no protection at first.
-
- if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed.
- pressure_adjustment_coefficient = 0
-
- // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection.
- if(istype(wear_suit,/obj/item/clothing/suit/space))
- var/obj/item/clothing/suit/space/S = wear_suit
- if(S.can_breach && S.damage)
- pressure_adjustment_coefficient += S.damage * 0.1
-
- pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1.
-
- return pressure_adjustment_coefficient
-
-/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
- var/pressure_difference
-
- // First get the absolute pressure difference.
- if(pressure < ONE_ATMOSPHERE) // We are in an underpressure.
- pressure_difference = ONE_ATMOSPHERE - pressure
-
- else //We are in an overpressure or standard atmosphere.
- pressure_difference = pressure - ONE_ATMOSPHERE
-
- if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction.
- pressure_difference = 0
-
- else
- // Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%).
- // This is our relative difference.
- pressure_difference *= get_pressure_weakness()
-
- // The difference is always positive to avoid extra calculations.
- // Apply the relative difference on a standard atmosphere to get the final result.
- // The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage.
- if(pressure < ONE_ATMOSPHERE)
- return ONE_ATMOSPHERE - pressure_difference
- else
+ if(head && (head.flags & STOPSPRESSUREDMAGE))
+ pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT
+ pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0
+ pressure_difference = pressure_difference * pressure_adjustment_coefficient
+ if(pressure > ONE_ATMOSPHERE)
return ONE_ATMOSPHERE + pressure_difference
+ else
+ return ONE_ATMOSPHERE - pressure_difference
/mob/living/carbon/human
@@ -526,50 +475,25 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(!environment)
return
- //Moved pressure calculations here for use in skip-processing check.
- var/pressure = environment.return_pressure()
- var/adjusted_pressure = calculate_affecting_pressure(pressure)
+ var/loc_temp = get_temperature(environment)
+ //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
- if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature.
- var/loc_temp = T0C
- if(istype(loc, /obj/mecha))
- var/obj/mecha/M = loc
- loc_temp = M.return_temperature()
+ //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit.
+ if(stat != 2)
+ stabilize_temperature_from_calories()
- if(istype(loc, /obj/spacepod))
- var/obj/spacepod/S = loc
- loc_temp = S.return_temperature()
- //else if(istype(get_turf(src), /turf/space))
-
- else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- loc_temp = loc:air_contents.temperature
+ //After then, it reacts to the surrounding atmosphere based on your thermal protection
+ if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
+ if(loc_temp < bodytemperature)
+ //Place is colder than we are
+ var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
+ if(thermal_protection < 1)
+ bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
else
- loc_temp = environment.temperature
-
- if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1 && environment.toxins < MOLES_PLASMA_VISIBLE)
- pressure_alert = 0
- return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
-
- if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
- //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection
- var/temp_adj = 0
- if(loc_temp < bodytemperature) //Place is colder than we are
- var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
- if(thermal_protection < 1)
- temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR) //this will be negative
- else if (loc_temp > bodytemperature) //Place is hotter than we are
- var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
- if(thermal_protection < 1)
- temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)
-
- //Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios
- var/relative_density = environment.total_moles() / MOLES_CELLSTANDARD
- temp_adj *= relative_density
-
- if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX
- if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX
- //world << "Environment: [loc_temp], [src]: [bodytemperature], Adjusting: [temp_adj]"
- bodytemperature += temp_adj
+ //Place is hotter than we are
+ var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
+ if(thermal_protection < 1)
+ bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(bodytemperature > species.heat_level_1)
@@ -607,6 +531,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
// Account for massive pressure differences. Done by Polymorph
// Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense!
+
+ var/pressure = environment.return_pressure()
+ var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
@@ -620,14 +547,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else if(adjusted_pressure >= species.hazard_low_pressure)
pressure_alert = -1
else
- if( !(RESIST_COLD in mutations))
+ if(RESIST_COLD in mutations)
+ pressure_alert = -1
+ else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
pressure_alert = -2
- else
- pressure_alert = -1
- if(environment.toxins > MOLES_PLASMA_VISIBLE)
- pl_effects()
return
///FIRE CODE
@@ -671,39 +596,20 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return temp_change
*/
- proc/stabilize_body_temperature()
- //TODO find a better place to put this
- if (s_store && istype(s_store, /obj/item/device/suit_cooling_unit))
- var/obj/item/device/suit_cooling_unit/CU = s_store
- CU.cool_mob(src)
-
-// if (species.flags & IS_SYNTHETIC)
-// bodytemperature += species.synth_temp_gain //that CPU/posibrain just keeps putting out heat. // commented out as making synthetics unplayable until cooling system sorted out
-// return
-
- var/body_temperature_difference = species.body_temperature - bodytemperature
-
- if (abs(body_temperature_difference) < 0.5)
- return //fuck this precision
-
- if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
+ proc/stabilize_temperature_from_calories()
+ if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up.
nutrition -= 2
- var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
- //world << "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
- else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1)
- var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
- //world << "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
- else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
+ if(bodytemperature >= species.cold_level_1 && bodytemperature <= species.heat_level_1)
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
+ if(bodytemperature >= species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
//We totally need a sweat system cause it totally makes sense...~
- var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
- //world << "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
+
//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list)
proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to.
@@ -1037,7 +943,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
updatehealth() //TODO
if(!in_stasis)
- stabilize_body_temperature() //Body temperature adjusts itself
handle_organs() //Optimized.
handle_blood()
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index fda8ee8c755..c7dd21ab74d 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -26,7 +26,8 @@
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
- var/heat_level_3 = 1000 // Heat damage level 2 above this point.
+ var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature
+ var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
@@ -105,8 +106,7 @@
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
- var/safe_toxins_max = 0.5
- var/safe_toxins_mask = 5
+ var/safe_toxins_max = 0.005
var/SA_para_min = 1
var/SA_sleep_min = 5
var/oxygen_used = 0
@@ -179,16 +179,9 @@
if(Toxins_pp > safe_toxins_max) // Too much toxins
var/ratio = (breath.toxins/safe_toxins_max) * 10
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
- if(H.wear_mask)
- if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)
- if(breath.toxins > safe_toxins_mask)
- ratio = (breath.toxins/safe_toxins_mask) * 10
- else
- ratio = 0
- if(ratio)
- if(H.reagents)
- H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- H.toxins_alert = max(H.toxins_alert, 1)
+ if(H.reagents)
+ H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
+ H.toxins_alert = max(H.toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
@@ -202,12 +195,16 @@
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.sleeping = min(H.sleeping+2, 10)
- else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
+ H.sleeping = max(H.sleeping+2, 10)
+ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0) H.emote(pick("giggle", "laugh"))
- SA.moles = 0
+ handle_temperature(breath, H)
+
+ return 1
+
+/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures
if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :(
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < cold_level_1)
@@ -243,14 +240,14 @@
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- if(heat_level_2 to heat_level_3)
+ if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- if(heat_level_3 to INFINITY)
+ if(heat_level_3_breathe to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- return 1
+ return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
handle_dna(C)
@@ -315,11 +312,12 @@
cold_level_1 = 280 //Default 260 - Lower is better
cold_level_2 = 220 //Default 200
- cold_level_3 = 130 //Default 120
+ cold_level_3 = 140 //Default 120
- heat_level_1 = 420 //Default 360 - Higher is better
- heat_level_2 = 480 //Default 400
- heat_level_3 = 1100 //Default 1000
+ heat_level_1 = 380 //Default 360 - Higher is better
+ heat_level_2 = 420 //Default 400
+ heat_level_3 = 480 //Default 460
+ heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
@@ -343,13 +341,14 @@
of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
using unique inflections their mouths form."
- cold_level_1 = 200
- cold_level_2 = 140
- cold_level_3 = 80
+ cold_level_1 = 240
+ cold_level_2 = 180
+ cold_level_3 = 100
- heat_level_1 = 330
+ heat_level_1 = 340
heat_level_2 = 380
- heat_level_3 = 800
+ heat_level_3 = 440
+ heat_level_3_breathe = 900
primitive = /mob/living/carbon/monkey/tajara
@@ -463,6 +462,7 @@
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
+ heat_level_3_breathe = 4000
brute_mod = 0.2
burn_mod = 0.2
@@ -587,8 +587,9 @@
cold_level_3 = -1
heat_level_1 = 300
- heat_level_2 = 350
- heat_level_3 = 700
+ heat_level_2 = 340
+ heat_level_3 = 400
+ heat_level_3_breathe = 700
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -656,6 +657,7 @@
heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
heat_level_2 = 1000
heat_level_3 = 2000
+ heat_level_3_breathe = 2000
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
index b8277fa5e8e..0d4e64d67ee 100644
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
@@ -20,7 +20,7 @@
icon_state = "cespace_suit"
item_state = "cespace_suit"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
/obj/item/clothing/head/helmet/space/eva/anomaly
name = "Excavation hood"
diff --git a/code/setup.dm b/code/setup.dm
index c18d1ac0d12..61493f768ec 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -40,10 +40,10 @@
#define TEMPERATURE_DAMAGE_COEFFICIENT 1.5 //This is used in handle_temperature_damage() for humans, and in reagents that affect body temperature. Temperature damage is multiplied by this amount.
#define BODYTEMP_AUTORECOVERY_DIVISOR 12 //This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
-#define BODYTEMP_AUTORECOVERY_MINIMUM 1 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50.
+#define BODYTEMP_AUTORECOVERY_MINIMUM 10 //Minimum amount of kelvin moved toward 310.15K per tick. So long as abs(310.15 - bodytemp) is more than 50.
#define BODYTEMP_COLD_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
#define BODYTEMP_HEAT_DIVISOR 6 //Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
-#define BODYTEMP_COOLING_MAX -30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area.
+#define BODYTEMP_COOLING_MAX 30 //The maximum number of degrees that your body can cool in 1 tick, when in a cold area.
#define BODYTEMP_HEATING_MAX 30 //The maximum number of degrees that your body can heat up in 1 tick, when in a hot area.
#define BODYTEMP_HEAT_DAMAGE_LIMIT 360.15 // The limit the human body can take before it starts taking damage from heat.
diff --git a/paradise.dme b/paradise.dme
index d84b2c5f513..6e77d08e156 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -665,7 +665,6 @@
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\sensor_device.dm"
-#include "code\game\objects\items\devices\suit_cooling.dm"
#include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.dm"
From 2548b838cf568f2f2b48fd0f14392dd29c5db515 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Wed, 4 Mar 2015 06:22:18 -0500
Subject: [PATCH 03/27] fix
---
code/modules/mob/living/carbon/carbon.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 1b018e42b4b..1aacf035034 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -487,7 +487,7 @@
var/obj/mecha/M = loc
loc_temp = M.return_temperature()
- if(istype(loc, /obj/spacepod))
+ else if(istype(loc, /obj/spacepod))
var/obj/spacepod/S = loc
loc_temp = S.return_temperature()
From 13aeecf33c8bfa445f85846c9643785191e3c908 Mon Sep 17 00:00:00 2001
From: ZomgPonies
Date: Wed, 4 Mar 2015 12:17:14 -0500
Subject: [PATCH 04/27] Removed some blood flags, added blood color to greys
and kidan
---
code/modules/mob/living/carbon/species.dm | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index fda8ee8c755..7d16adc5539 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -380,7 +380,6 @@
the secrets of their empire to their allies."
flags = HAS_LIPS | HAS_UNDERWEAR
- bloodflags = BLOOD_GREEN
bodyflags = HAS_SKIN_COLOR
flesh_color = "#8CD7A3"
@@ -517,9 +516,11 @@
brute_mod = 0.8
flags = IS_WHITELISTED
- bloodflags = BLOOD_GREEN
bodyflags = FEET_CLAWS
+ blood_color = "#FB9800"
+
+
/datum/species/slime
name = "Slime People"
default_language = "Galactic Common"
@@ -557,6 +558,8 @@
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
+ blood_color = "#A200FF"
+
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
if(!remove)
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
From 646ef4563e951816c5b1a9d0963e575030a0f3d1 Mon Sep 17 00:00:00 2001
From: ZomgPonies
Date: Wed, 4 Mar 2015 12:24:47 -0500
Subject: [PATCH 05/27] Removed old snowflake bloodcode references
---
.../mob/living/carbon/human/human_defense.dm | 20 +++----------------
.../mob/living/carbon/human/update_icons.dm | 8 ++++----
code/setup.dm | 4 +---
3 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7906eac6111..e5145332701 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -435,30 +435,16 @@ emp_act
add_blood(source)
bloody_hands = amount
bloody_hands_mob = source
- if(istype(source,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = source
- if(H.species.bloodflags & BLOOD_GREEN)
- update_inv_gloves(1,1) //updates on-mob overlays for bloody hands and/or bloody gloves
- else
- update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
- else
- update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
+ update_inv_gloves(1) //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body(var/mob/living/source)
if(wear_suit)
wear_suit.add_blood(source)
- update_inv_wear_suit(0,0)
+ update_inv_wear_suit(0)
return
if(w_uniform)
w_uniform.add_blood(source)
- if(istype(source,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = source
- if(H.species.bloodflags & BLOOD_GREEN)
- update_inv_w_uniform(1,1)
- else
- update_inv_w_uniform(1,0)
- else
- update_inv_w_uniform(1,0)
+ update_inv_w_uniform(1)
/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f88577f2597..bde2a71847e 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -587,7 +587,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
-/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1)
if(w_uniform && istype(w_uniform, /obj/item/clothing/under) )
w_uniform.screen_loc = ui_iclothing
var/t_color = w_uniform._color
@@ -651,7 +651,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_gloves(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_gloves(var/update_icons=1)
if(gloves)
var/t_state = gloves.item_state
if(!t_state) t_state = gloves.icon_state
@@ -724,7 +724,7 @@ proc/get_damage_icon_part(damage_state, body_part)
overlays_standing[EARS_LAYER] = null
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_shoes(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_shoes(var/update_icons=1)
if(shoes)
var/image/standing
@@ -765,7 +765,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_head(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_head(var/update_icons=1)
if(head)
head.screen_loc = ui_head //TODO
var/image/standing
diff --git a/code/setup.dm b/code/setup.dm
index c18d1ac0d12..544d879df9d 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -835,9 +835,7 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
#define NO_INTORGANS 32768
//Species Blood Flags
-#define BLOOD_GREEN 1
-#define BLOOD_BLUE 2
-#define BLOOD_SLIME 4
+#define BLOOD_SLIME 1
//Species Body Flags
#define FEET_CLAWS 1
#define FEET_PADDED 2
From 60d4038ed51ceedbff6e8b4133bf6404b0e558c6 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Wed, 4 Mar 2015 17:56:30 -0500
Subject: [PATCH 06/27] Comfy Mining Turfs? NO!
---
code/modules/mining/mine_turfs.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 8ab42b7ae1c..533c47a253d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -9,7 +9,7 @@
opacity = 1
density = 1
blocks_air = 1
- temperature = T0C
+ temperature = TCMB
var/mineral/mineral
var/mined_ore = 0
var/last_act = 0
@@ -392,7 +392,7 @@
icon_state = "asteroid"
oxygen = 0.01
nitrogen = 0.01
- temperature = T0C
+ temperature = TCMB
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
has_resources = 1
From 91fd4d968376f2dbc62eb47c080bb30236e84436 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Wed, 4 Mar 2015 20:56:14 -0500
Subject: [PATCH 07/27] Frost Oil Fix
---
code/modules/reagents/Chemistry-Reagents.dm | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 4deb87fbddb..490a91c2113 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -2329,18 +2329,19 @@ datum
if(!data) data = 1
switch(data)
if(1 to 15)
- M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT
+ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 5)
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(5,20)
if(15 to 25)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(10,20)
if(25 to INFINITY)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1)) M.emote("shiver")
+ M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1))
+ M.emote("shiver")
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(15,20)
data++
From 0fd3cdfb331936a8625b5d1054d782569b520299 Mon Sep 17 00:00:00 2001
From: ZomgPonies
Date: Thu, 5 Mar 2015 13:34:01 -0500
Subject: [PATCH 08/27] Fixing the SSD infinite sleep bug
---
code/modules/mob/living/carbon/carbon.dm | 62 +++++++++++---------
code/modules/mob/living/carbon/human/life.dm | 9 ++-
code/modules/mob/living/login.dm | 3 +
code/modules/mob/living/logout.dm | 8 ++-
code/modules/mob/living/silicon/silicon.dm | 1 -
code/modules/mob/mob_defines.dm | 3 +-
6 files changed, 51 insertions(+), 35 deletions(-)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 279755cc813..86f500aa015 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -203,36 +203,40 @@
src << "You feel fatigued."
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
- else if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
- var/t_him = "it"
- if (src.gender == MALE)
- t_him = "him"
- else if (src.gender == FEMALE)
- t_him = "her"
- if (istype(src,/mob/living/carbon/human) && src:w_uniform)
- var/mob/living/carbon/human/H = src
- H.w_uniform.add_fingerprint(M)
- src.sleeping = max(0,src.sleeping-5)
- if(src.sleeping == 0)
- src.resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- M.visible_message( \
- "\blue [M] shakes [src] trying to wake [t_him] up!", \
- "\blue You shake [src] trying to wake [t_him] up!", \
- )
- // BEGIN HUGCODE - N3X
else
- if (istype(src,/mob/living/carbon/human) && src:w_uniform)
- var/mob/living/carbon/human/H = src
- H.w_uniform.add_fingerprint(M)
- playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- M.visible_message( \
- "\blue [M] gives [src] a [pick("hug","warm embrace")].", \
- "\blue You hug [src].", \
- )
+ if(player_logged)
+ M.visible_message("[M] shakes [src], but they do not respond. Probably suffering from SSD.", \
+ "You shake [src], but they are unresponsive. Probably suffering from SSD.")
+ if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
+ var/t_him = "it"
+ if (src.gender == MALE)
+ t_him = "him"
+ else if (src.gender == FEMALE)
+ t_him = "her"
+ if (istype(src,/mob/living/carbon/human) && src:w_uniform)
+ var/mob/living/carbon/human/H = src
+ H.w_uniform.add_fingerprint(M)
+ src.sleeping = max(0,src.sleeping-5)
+ if(src.sleeping == 0)
+ src.resting = 0
+ AdjustParalysis(-3)
+ AdjustStunned(-3)
+ AdjustWeakened(-3)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ M.visible_message( \
+ "\blue [M] shakes [src] trying to wake [t_him] up!", \
+ "\blue You shake [src] trying to wake [t_him] up!", \
+ )
+ // BEGIN HUGCODE - N3X
+ else
+ if (istype(src,/mob/living/carbon/human) && src:w_uniform)
+ var/mob/living/carbon/human/H = src
+ H.w_uniform.add_fingerprint(M)
+ playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ M.visible_message( \
+ "\blue [M] gives [src] a [pick("hug","warm embrace")].", \
+ "\blue You hug [src].", \
+ )
/mob/living/carbon/proc/eyecheck()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4c03256ecb8..6a36b6ae3d7 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1017,6 +1017,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(status_flags & GODMODE) return 0
+ //SSD check, if a logged player is awake put them back to sleep!
+ if(player_logged && sleeping < 2)
+ sleeping = 2
+
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
silent = 0
@@ -1093,7 +1097,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
adjustStaminaLoss(-10)
adjustHalLoss(-3)
if (mind)
- if((mind.active && client != null) || immune_to_ssd) //This also checks whether a client is connected, if not, sleep is not reduced.
+ //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar.
+ if(player_logged)
+ sleeping = max(sleeping-1, 2)
+ else
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index cf2f233e7c5..b349e3b15f7 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -4,6 +4,9 @@
//Mind updates
sync_mind()
+ //If they're SSD, remove it so they can wake back up.
+ player_logged = 0
+
//Round specific stuff like hud updates
if(ticker && ticker.mode)
var/ref = "\ref[mind]"
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index 8fdcdb0ec46..b79d822d80b 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -1,7 +1,9 @@
/mob/living/Logout()
..()
if (mind)
- if(!key) //key and mind have become seperated.
+ if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
- if(!immune_to_ssd && sleeping < 2 && mind.active)
- sleeping = 2 //This causes instant sleep, but does not prolong it. See life.dm for furthering SSD.
+ //This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
+ if(sleeping < 2 && mind.active)
+ sleeping = 2
+ player_logged = 1
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 1c8e7b71d65..e1dfc6907bb 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -6,7 +6,6 @@
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/list/alarms_to_show = list()
var/list/alarms_to_clear = list()
- immune_to_ssd = 1
var/list/hud_list[10]
var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index d508eb7fb92..e5e7f502194 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -219,7 +219,8 @@
var/has_limbs = 1 //Whether this mob have any limbs he can move with
var/can_stand = 1 //Whether this mob have ability to stand
- var/immune_to_ssd = 0
+ //SSD var, changed it up some so people can have special things happen for different mobs when SSD.
+ var/player_logged = 0
var/turf/listed_turf = null //the current turf being examined in the stat panel
var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
From eaf6e719881ba6a6a5eb4f1d3db7d0b1b8c3d818 Mon Sep 17 00:00:00 2001
From: ZomgPonies
Date: Thu, 5 Mar 2015 13:40:27 -0500
Subject: [PATCH 09/27] Fix Spacepod infinite explosion bug
---
code/game/vehicles/spacepods/spacepod.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm
index 4b1bba60671..91d3b5935a0 100644
--- a/code/game/vehicles/spacepods/spacepod.dm
+++ b/code/game/vehicles/spacepods/spacepod.dm
@@ -127,6 +127,7 @@
occupant2 << "[i]"
if(i == 0)
explosion(loc, 2, 4, 8)
+ qdel(src)
sleep(10)
update_icons()
From 06ee04e839a29c26df65682554c96263550efc1e Mon Sep 17 00:00:00 2001
From: ZomgPonies
Date: Thu, 5 Mar 2015 15:53:15 -0500
Subject: [PATCH 10/27] Superhero update
---
code/game/machinery/wishgranter.dm | 74 +++++++++++++++++-----------
code/modules/events/event_manager.dm | 2 +-
2 files changed, 45 insertions(+), 31 deletions(-)
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 22e89cfe000..1f14f105557 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -7,46 +7,33 @@
use_power = 0
anchored = 1
density = 1
-
- var/charges = 1
- var/insisting = 0
-
+ var/datum/mind/target
+ var/list/types = list("Owlman", "The Griffin")
/obj/machinery/wish_granter/attack_hand(var/mob/user as mob)
usr.set_machine(src)
- if(charges <= 0)
- user << "The Wish Granter lies silent."
- return
-
- else if(!istype(user, /mob/living/carbon/human))
+ if(!istype(user, /mob/living/carbon/human))
user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's."
return
else if(is_special_character(user))
user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away."
- else if (!insisting)
- user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?"
- insisting++
-
else
user << "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?"
- ticker.mode.traitors += user.mind
- user.mind.special_role = "The Hero The Station Deserves"
-
+ var/wish
+ if(types.len == 1)
+ wish = pick(types)
+ else
+ wish = input("You want to become...","Wish") as null|anything in types
var/mob/living/carbon/human/M = user
-
- var/wish = input("You want to...","Wish") as anything in list("Protect the innocent","Hunt the guilty")
switch(wish)
- if("Protect the innocent")
+ if("Owlman")
+ types -= "Owlman"
M.fully_replace_character_name(M.real_name, "Owlman")
- var/datum/objective/protect/protect = new
- protect.owner = user.mind
- user.mind.objectives += protect
-
for(var/obj/item/W in M)
M.unEquip(W)
@@ -64,12 +51,18 @@
M.regenerate_icons()
- if("Hunt the guilty")
- M.fully_replace_character_name(M.real_name, "The Griffin")
+ var/datum/objective/protect/protect = new
+ protect.owner = user.mind
+ if(target)
+ protect.target = target
+ else
+ protect.find_target()
+ target = protect.target
+ user.mind.objectives += protect
- var/datum/objective/assassinate/assasinate = new
- assasinate.owner = user.mind
- user.mind.objectives += assasinate
+ if("The Griffin")
+ types -= "The Griffin"
+ M.fully_replace_character_name(M.real_name, "The Griffin")
for(var/obj/item/W in M)
M.unEquip(W)
@@ -88,14 +81,25 @@
M.regenerate_icons()
+ var/datum/objective/assassinate/assasinate = new
+ assasinate.owner = user.mind
+ if(target)
+ assasinate.target = target
+ else
+ assasinate.find_target()
+ target = assasinate.target
+ user.mind.objectives += assasinate
+
+ ticker.mode.traitors += user.mind
+ user.mind.special_role = wish
+
var/obj_count = 1
for(var/datum/objective/OBJ in user.mind.objectives)
user << "Objective #[obj_count]: [OBJ.explanation_text]"
obj_count++
- charges--
- insisting = 0
+ //Time to hand out the powers, since they are currently generic
if (!(HULK in user.mutations))
user.dna.SetSEState(HULKBLOCK,1)
@@ -122,4 +126,14 @@
user.update_mutations()
+ //Remove the wishgranter or teleport it randomly on the station
+ if(!types.len)
+ user << "The wishgranter slowly fades into mist..."
+ qdel(src)
+ return
+ else
+ var/impact_area = findEventArea()
+ var/turf/T = pick(get_area_turfs(impact_area))
+ if(T)
+ src.loc = T
return
\ No newline at end of file
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index 08614d68c9c..cdb1dc9a4b4 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -299,7 +299,7 @@
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
-/datum/event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
+/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
var/area/candidate = null
var/list/safe_areas = list(
From abd25690e1e1c50b4b47da36a73aead13238ce8c Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Thu, 5 Mar 2015 22:24:36 +0100
Subject: [PATCH 11/27] Adds pool controller
---
code/game/machinery/poolcontroller.dm | 66 +++++++++++++++++++++++++++
paradise.dme | 1 +
2 files changed, 67 insertions(+)
create mode 100644 code/game/machinery/poolcontroller.dm
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
new file mode 100644
index 00000000000..662649f087f
--- /dev/null
+++ b/code/game/machinery/poolcontroller.dm
@@ -0,0 +1,66 @@
+/obj/machinery/poolcontroller
+ name = "Pool Controller"
+ desc = "A controller for the nearby pool."
+ icon = 'icons/obj/airlock_machines.dmi'
+ icon_state = "airlock_control_standby"
+ var/list/linkedturfs = list()
+ var/temperature = "normal"
+ var/srange = 5
+
+/obj/machinery/poolcontroller/New()
+ for(var/turf/simulated/floor/beach/water/W in range(srange,src))
+ src.linkedturfs += W
+ processing_objects.Add(src)
+
+/obj/machinery/poolcontroller/attack_hand()
+ if(!Adjacent(usr))
+ usr << "You moved away."
+ return
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Hot","Cold","Normal","Cancel")
+ switch(temp)
+ if("Hot")
+ temperature = "hot"
+ if("Cold")
+ temperature = "cold"
+ if("Normal")
+ temperature = "normal"
+ if("Cancel")
+ return
+
+ usr << "You flick the pool temperature to [temperature]."
+
+/obj/machinery/poolcontroller/process()
+ if(!linkedturfs)
+ processing_objects.Remove(src)
+ return
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs)
+ for(var/mob/M in W)
+ if(M)
+ updateMobs()
+
+/obj/machinery/poolcontroller/proc/updateMobs()
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs)
+ for(var/mob/M in W)
+ switch(temperature)
+ if("hot")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bodytemperature = min(500, H.bodytemperature + 35)
+ H.adjustFireLoss(5)
+ H << "The water is searing hot!"
+ else
+ M.bodytemperature = min(500, M.bodytemperature + 35)
+ M << "The water is searing hot!"
+
+ if("cold")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.bodytemperature = max(80, H.bodytemperature - 80)
+ H.adjustFireLoss(5)
+ H << "The water is freezing!"
+ else
+ M.bodytemperature = max(80, M.bodytemperature - 80)
+ M << "The water is freezing!"
+
+ if("normal")
+ return
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index d84b2c5f513..488f052f047 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -449,6 +449,7 @@
#include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm"
#include "code\game\machinery\PDApainter.dm"
+#include "code\game\machinery\poolcontroller.dm"
#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\programmable_unloader.dm"
From f58d3a9b75d4e2c1d28647d07d44006d8950e3cf Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Thu, 5 Mar 2015 22:46:36 +0100
Subject: [PATCH 12/27] Poolcontroller update-fix
---
code/game/machinery/poolcontroller.dm | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 662649f087f..e8730ccc895 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -33,10 +33,7 @@
if(!linkedturfs)
processing_objects.Remove(src)
return
- for(var/turf/simulated/floor/beach/water/W in linkedturfs)
- for(var/mob/M in W)
- if(M)
- updateMobs()
+ updateMobs()
/obj/machinery/poolcontroller/proc/updateMobs()
for(var/turf/simulated/floor/beach/water/W in linkedturfs)
@@ -48,9 +45,11 @@
H.bodytemperature = min(500, H.bodytemperature + 35)
H.adjustFireLoss(5)
H << "The water is searing hot!"
+ return
else
M.bodytemperature = min(500, M.bodytemperature + 35)
M << "The water is searing hot!"
+ return
if("cold")
if(ishuman(M))
@@ -58,9 +57,11 @@
H.bodytemperature = max(80, H.bodytemperature - 80)
H.adjustFireLoss(5)
H << "The water is freezing!"
+ return
else
M.bodytemperature = max(80, M.bodytemperature - 80)
M << "The water is freezing!"
+ return
if("normal")
return
\ No newline at end of file
From 0ffe412121280d555a1b17e8baa4d08b20316f35 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Thu, 5 Mar 2015 18:33:18 -0500
Subject: [PATCH 13/27] Pressure protection
---
code/modules/mob/living/carbon/human/life.dm | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 6f308b89e10..9c0c1c0fee0 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -146,10 +146,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent.
- if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE))
- pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT
- if(head && (head.flags & STOPSPRESSUREDMAGE))
- pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT
+ if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed.
+ pressure_adjustment_coefficient = 0
pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0
pressure_difference = pressure_difference * pressure_adjustment_coefficient
if(pressure > ONE_ATMOSPHERE)
From a74bb8a710f69ea681b7dcdfe6bb422565f75c81 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Thu, 5 Mar 2015 20:30:18 -0500
Subject: [PATCH 14/27] Fire Fixes
---
code/ZAS/Fire.dm | 2 +-
code/modules/mob/living/carbon/species.dm | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index dfc78987eb3..6af57fc4870 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -153,7 +153,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
//im not sure how to implement a version that works for every creature so for now monkeys are firesafe
for(var/mob/living/carbon/human/M in loc)
- M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
+// M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
loc.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
for(var/atom/A in loc)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index c7dd21ab74d..2990c210f48 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -655,9 +655,9 @@
cold_level_3 = -1
heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
- heat_level_2 = 1000
- heat_level_3 = 2000
- heat_level_3_breathe = 2000
+ heat_level_2 = 540
+ heat_level_3 = 600
+ heat_level_3_breathe = 600
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
From 7e542873fe74185cea7abc874fdd97f4ad514c93 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Fri, 6 Mar 2015 01:13:03 -0500
Subject: [PATCH 15/27] Fixes
---
code/datums/uplink_item.dm | 2 +-
.../objects/items/devices/radio/encryptionkey.dm | 7 -------
code/game/turfs/simulated/walls_reinforced.dm | 5 +++--
.../research/designs/mechfabricator_designs.dm | 3 ++-
code/modules/research/designs/medical_designs.dm | 3 +++
code/modules/research/designs/power_designs.dm | 12 ++++++++----
maps/cyberiad.dmm | 2 +-
7 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1aae642647b..bf2e773651c 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -521,7 +521,7 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/cipherkey
name = "Syndicate Encryption Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel."
- item = /obj/item/device/encryptionkey/syndicate/hacked
+ item = /obj/item/device/encryptionkey/syndicate
cost = 5
/datum/uplink_item/device_tools/hacked_module
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 2c112dc12d0..e16d07ec59b 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -21,13 +21,6 @@
origin_tech = "syndicate=3"
syndie = 1 //Signifies that it de-crypts Syndicate transmissions
-/obj/item/device/encryptionkey/syndicate/hacked
- name = "Standard Encryption Key"
- desc = "An encryption key for a radio headset. Has no special codes in it. Looks more sophisticated than usual."
- channels = list("Command" = 0, "Security" = 0, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0, "Syndicate" = 1)
- origin_tech = "syndicate=3"
- syndie = 1
-
/obj/item/device/encryptionkey/binary
name = "binary translator key"
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 9514e9c7afd..1ff89a02a3f 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -13,6 +13,7 @@
var/d_state = 0
/turf/simulated/wall/r_wall/attack_hand(mob/user as mob)
+ user.changeNext_move(CLICK_CD_MELEE)
if (HULK in user.mutations)
if (prob(10) || rotting)
usr << text("\blue You smash through the wall.")
@@ -34,7 +35,7 @@
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
-
+ user.changeNext_move(CLICK_CD_MELEE)
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "You don't have the dexterity to do this!"
return
@@ -286,7 +287,7 @@
else if( istype(W,/obj/item/apc_frame) )
var/obj/item/apc_frame/AH = W
AH.try_build(src)
-
+
else if(istype(W,/obj/item/newscaster_frame))
var/obj/item/newscaster_frame/AH = W
AH.try_build(src)
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index fe9acc74a7c..b7d49332314 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -849,7 +849,8 @@
build_type = MECHFAB
req_tech = list("combat" = 4, "syndicate" = 3)
build_path = /obj/item/borg/upgrade/syndicate
- category = "Cyborg Upgrade Modules"
+ materials = list("$metal"=10000,"$glass"=15000,"$diamond" = 10000)
+ construction_time = 120
category = list("Cyborg Upgrade Modules")
/datum/design/borg_upgrade_jetpack
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index b6b01c63872..0c03f1c6756 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -75,6 +75,7 @@
req_tech = list("programming" = 2, "biotech" = 3)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1000, "$glass" = 500)
+ construction_time = 75
reliability_base = 76
build_path = /obj/item/device/mmi
category = list("Misc","Medical")
@@ -107,6 +108,7 @@
req_tech = list("programming" = 2, "biotech" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1200, "$glass" = 500)
+ construction_time = 75
reliability_base = 74
build_path = /obj/item/device/mmi/radio_enabled
category = list("Misc","Medical")
@@ -139,6 +141,7 @@
req_tech = list("magnets" = 3, "combat" = 2)
build_type = MECHFAB
materials = list("$metal" = 750, "$glass" = 750)
+ construction_time = 100
reliability_base = 76
build_path = /obj/item/device/flash/synthetic
category = list("Misc")
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index 9edc8400e3e..76524f5429a 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -9,6 +9,7 @@
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 50)
+ construction_time=100
build_path = /obj/item/weapon/stock_parts/cell
category = list("Misc","Power")
@@ -19,9 +20,10 @@
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 60)
+ construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/high
category = list("Misc","Power")
-
+
/datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
desc = "A power cell that holds 30000 units of energy"
@@ -30,9 +32,10 @@
reliability_base = 70
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
+ construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/hyper
category = list("Misc","Power")
-
+
/datum/design/super_cell
name = "Super-Capacity Power Cell"
desc = "A power cell that holds 20000 units of energy"
@@ -41,9 +44,10 @@
reliability_base = 75
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 70)
+ construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/super
category = list("Misc","Power")
-
+
/datum/design/pacman
name = "Machine Board (PACMAN-type Generator)"
desc = "The circuit board that for a PACMAN-type portable generator."
@@ -54,7 +58,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/pacman
category = list("Engineering Machinery")
-
+
/datum/design/mrspacman
name = "Machine Board (MRSPACMAN-type Generator)"
desc = "The circuit board that for a MRSPACMAN-type portable generator."
diff --git a/maps/cyberiad.dmm b/maps/cyberiad.dmm
index 07a8e6e722e..28bc95721f3 100644
--- a/maps/cyberiad.dmm
+++ b/maps/cyberiad.dmm
@@ -8352,7 +8352,7 @@
"deF" = (/obj/structure/table,/obj/item/weapon/grenade/syndieminibomb{pixel_x = 4; pixel_y = 2; pixel_z = 0},/obj/item/weapon/grenade/syndieminibomb{pixel_x = -1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"deG" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/bush,/turf/unsimulated/floor{tag = "icon-gravsnow_corner (WEST)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"deH" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
-"deI" = (/obj/machinery/telecomms/allinone,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
+"deI" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"deJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"deK" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"deL" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgicaldrill,/obj/item/weapon/scalpel,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
From 438efadc7eb6c3dc1ce819b47d99e6c3e2d5a65e Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Fri, 6 Mar 2015 02:35:36 -0500
Subject: [PATCH 16/27] Cryo Fixes
---
code/game/machinery/cryo.dm | 42 ++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 22 deletions(-)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 0d92be24127..d60fefe0b34 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -13,6 +13,7 @@
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/autoeject = 0
+ var/next_trans = 0
var/current_heat_capacity = 50
var/efficiency
@@ -38,7 +39,7 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
-/obj/machinery/atmospherics/unary/cryo_cell/New()
+/obj/machinery/atmospherics/unary/cryo_cell/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/cryo_tube(src)
@@ -128,15 +129,13 @@
if(!on)
return
- if(occupant)
- if(occupant.stat != 2)
- process_occupant()
-
if(air_contents)
temperature_archived = air_contents.temperature
heat_gas_contents()
expel_gas()
+ if(occupant)
+ process_occupant()
if(abs(temperature_archived-air_contents.temperature) > 1)
network.update = 1
@@ -220,7 +219,7 @@
data["beakerVolume"] += R.volume
data["autoeject"] = autoeject
-
+
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
@@ -319,11 +318,11 @@
if(air_contents.total_moles() < 10)
return
if(occupant)
- if(occupant.stat == 2)
+ if(occupant.stat == 2 || occupant.health >= 100) //Why waste energy on dead or healthy people
+ occupant.bodytemperature = T0C
return
occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity())
occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise
- occupant.stat = 1
if(occupant.bodytemperature < T0C)
occupant.sleeping = max(5/efficiency, (1/occupant.bodytemperature)*2000/efficiency)
occupant.Paralyse(max(5/efficiency, (1/occupant.bodytemperature)*3000/efficiency))
@@ -333,17 +332,17 @@
occupant.adjustOxyLoss(-1)
//severe damage should heal waaay slower without proper chemicals
if(occupant.bodytemperature < 225)
- if (occupant.getToxLoss())
+ if(occupant.getToxLoss())
occupant.adjustToxLoss(max(-efficiency, (-20*(efficiency ** 2)) / occupant.getToxLoss()))
var/heal_brute = occupant.getBruteLoss() ? min(efficiency, 20*(efficiency**2) / occupant.getBruteLoss()) : 0
var/heal_fire = occupant.getFireLoss() ? min(efficiency, 20*(efficiency**2) / occupant.getFireLoss()) : 0
occupant.heal_organ_damage(heal_brute,heal_fire)
- var/has_cryo = occupant.reagents.get_reagent_amount("cryoxadone") >= 1
- var/has_clonexa = occupant.reagents.get_reagent_amount("clonexadone") >= 1
- var/has_cryo_medicine = has_cryo || has_clonexa
- if(beaker && !has_cryo_medicine)
- beaker.reagents.trans_to(occupant, 1, 1)
+ if(beaker && next_trans == 0)
+ beaker.reagents.trans_to(occupant, 1, 10)
beaker.reagents.reaction(occupant)
+ next_trans++
+ if(next_trans == 10)
+ next_trans = 0
/obj/machinery/atmospherics/unary/cryo_cell/proc/heat_gas_contents()
if(air_contents.total_moles() < 1)
@@ -357,13 +356,12 @@
/obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas()
if(air_contents.total_moles() < 1)
return
-// var/datum/gas_mixture/expel_gas = new
-// var/remove_amount = air_contents.total_moles()/50
-// expel_gas = air_contents.remove(remove_amount)
-
- // Just have the gas disappear to nowhere.
- //expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
- //loc.assume_air(expel_gas)
+ var/datum/gas_mixture/expel_gas = new
+ var/remove_amount = air_contents.total_moles()/100
+ expel_gas = air_contents.remove(remove_amount)
+ expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
+ loc.assume_air(expel_gas)
+ update_nearby_tiles()
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
if(!( occupant ))
@@ -415,7 +413,7 @@
if (usr.stat == 2)//and he's not dead....
return
usr << "\blue Release sequence activated. This will take two minutes."
- sleep(1200)
+ sleep(600)
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
return
go_out()//and release him from the eternal prison.
From d09e3cca3571670e4435499c001f6a3761279fba Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Fri, 6 Mar 2015 07:15:21 -0500
Subject: [PATCH 17/27] Xeno attack borg fix
---
.../modules/mob/living/silicon/robot/robot.dm | 65 +++++++++++++++----
1 file changed, 52 insertions(+), 13 deletions(-)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 79c5fc8b469..3f70e98c3ac 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -904,24 +904,63 @@ var/list/robot_verbs_default = list(
usr << "You unlock your cover."
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (M.a_intent =="disarm")
- if(!(lying))
+ if (!ticker)
+ M << "You cannot attack people before the game has started."
+ return
+
+ if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ M << "No attacking people at spawn, you jackass."
+ return
+
+ switch(M.a_intent)
+
+ if ("help")
+ for(var/mob/O in viewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1)
+
+ if ("grab")
+ if (M == src || anchored)
+ return
+ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
+
+ M.put_in_active_hand(G)
+
+ G.synch()
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("[M] has grabbed [src] passively!")
+
+ if ("harm")
M.do_attack_animation(src)
- if (prob(85))
- Stun(7)
- step(src,get_dir(M,src))
- spawn(5)
- step(src,get_dir(M,src))
- add_logs(M, src, "pushed", admin=0)
- playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
- visible_message("[M] has forced back [src]!", \
- "[M] has forced back [src]!")
+ var/damage = rand(10, 20)
+ if (prob(90))
+ playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
+ visible_message("[M] has slashed at [src]!",\
+ "[M] has slashed at [src]!")
+ if(prob(8))
+ flick("noise", flash)
+ adjustBruteLoss(damage)
+ updatehealth()
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("[M] took a swipe at [src]!", \
"[M] took a swipe at [src]!")
- else
- ..()
+
+ if ("disarm")
+ if(!(lying))
+ M.do_attack_animation(src)
+ if (prob(85))
+ Stun(7)
+ step(src,get_dir(M,src))
+ spawn(5)
+ step(src,get_dir(M,src))
+ playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
+ visible_message("[M] has forced back [src]!",\
+ "[M] has forced back [src]!")
+ else
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
+ visible_message("[M] attempted to force back [src]!",\
+ "[M] attempted to force back [src]!")
return
From 769c5630ea83ce268a0bb6bf066f8af02efc8f84 Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Fri, 6 Mar 2015 07:15:47 -0500
Subject: [PATCH 18/27] Revert "Xeno attack borg fix"
This reverts commit d09e3cca3571670e4435499c001f6a3761279fba.
---
.../modules/mob/living/silicon/robot/robot.dm | 65 ++++---------------
1 file changed, 13 insertions(+), 52 deletions(-)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 3f70e98c3ac..79c5fc8b469 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -904,63 +904,24 @@ var/list/robot_verbs_default = list(
usr << "You unlock your cover."
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
-
- switch(M.a_intent)
-
- if ("help")
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1)
-
- if ("grab")
- if (M == src || anchored)
- return
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
-
- M.put_in_active_hand(G)
-
- G.synch()
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- visible_message("[M] has grabbed [src] passively!")
-
- if ("harm")
+ if (M.a_intent =="disarm")
+ if(!(lying))
M.do_attack_animation(src)
- var/damage = rand(10, 20)
- if (prob(90))
- playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
- visible_message("[M] has slashed at [src]!",\
- "[M] has slashed at [src]!")
- if(prob(8))
- flick("noise", flash)
- adjustBruteLoss(damage)
- updatehealth()
+ if (prob(85))
+ Stun(7)
+ step(src,get_dir(M,src))
+ spawn(5)
+ step(src,get_dir(M,src))
+ add_logs(M, src, "pushed", admin=0)
+ playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
+ visible_message("[M] has forced back [src]!", \
+ "[M] has forced back [src]!")
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("[M] took a swipe at [src]!", \
"[M] took a swipe at [src]!")
-
- if ("disarm")
- if(!(lying))
- M.do_attack_animation(src)
- if (prob(85))
- Stun(7)
- step(src,get_dir(M,src))
- spawn(5)
- step(src,get_dir(M,src))
- playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
- visible_message("[M] has forced back [src]!",\
- "[M] has forced back [src]!")
- else
- playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
- visible_message("[M] attempted to force back [src]!",\
- "[M] attempted to force back [src]!")
+ else
+ ..()
return
From 0c751dc7f6c0356cfc2aa5daeb663cb2dad20aae Mon Sep 17 00:00:00 2001
From: Fox-McCloud
Date: Fri, 6 Mar 2015 07:20:57 -0500
Subject: [PATCH 19/27] Xeno attack borg fix
---
.../modules/mob/living/silicon/robot/robot.dm | 65 +++++++++++++++----
1 file changed, 52 insertions(+), 13 deletions(-)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 79c5fc8b469..3f70e98c3ac 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -904,24 +904,63 @@ var/list/robot_verbs_default = list(
usr << "You unlock your cover."
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (M.a_intent =="disarm")
- if(!(lying))
+ if (!ticker)
+ M << "You cannot attack people before the game has started."
+ return
+
+ if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ M << "No attacking people at spawn, you jackass."
+ return
+
+ switch(M.a_intent)
+
+ if ("help")
+ for(var/mob/O in viewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O.show_message(text("[M] caresses [src]'s plating with its scythe like arm."), 1)
+
+ if ("grab")
+ if (M == src || anchored)
+ return
+ var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
+
+ M.put_in_active_hand(G)
+
+ G.synch()
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ visible_message("[M] has grabbed [src] passively!")
+
+ if ("harm")
M.do_attack_animation(src)
- if (prob(85))
- Stun(7)
- step(src,get_dir(M,src))
- spawn(5)
- step(src,get_dir(M,src))
- add_logs(M, src, "pushed", admin=0)
- playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
- visible_message("[M] has forced back [src]!", \
- "[M] has forced back [src]!")
+ var/damage = rand(10, 20)
+ if (prob(90))
+ playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
+ visible_message("[M] has slashed at [src]!",\
+ "[M] has slashed at [src]!")
+ if(prob(8))
+ flick("noise", flash)
+ adjustBruteLoss(damage)
+ updatehealth()
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("[M] took a swipe at [src]!", \
"[M] took a swipe at [src]!")
- else
- ..()
+
+ if ("disarm")
+ if(!(lying))
+ M.do_attack_animation(src)
+ if (prob(85))
+ Stun(7)
+ step(src,get_dir(M,src))
+ spawn(5)
+ step(src,get_dir(M,src))
+ playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
+ visible_message("[M] has forced back [src]!",\
+ "[M] has forced back [src]!")
+ else
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
+ visible_message("[M] attempted to force back [src]!",\
+ "[M] attempted to force back [src]!")
return
From 8b66dfc0633721422100c05d29299a0a123c015f Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Fri, 6 Mar 2015 17:19:51 +0100
Subject: [PATCH 20/27] Final pool controller commit, Warm and Cool modes
added, Hot and Cold moved to emag-only.
---
code/game/machinery/poolcontroller.dm | 138 ++++++++++++++++++--------
1 file changed, 96 insertions(+), 42 deletions(-)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index e8730ccc895..51885cbcc5b 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -3,65 +3,119 @@
desc = "A controller for the nearby pool."
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_control_standby"
- var/list/linkedturfs = list()
- var/temperature = "normal"
- var/srange = 5
+ var/list/linkedturfs = list() //List contains all of the linked pool turfs to this controller, assignment happens on New()
+ var/temperature = "normal" //The temperature of the pool, starts off on normal, which has no effects.
+ var/srange = 5 //The range of the search for pool turfs, change this for bigger or smaller pools.
-/obj/machinery/poolcontroller/New()
- for(var/turf/simulated/floor/beach/water/W in range(srange,src))
- src.linkedturfs += W
- processing_objects.Add(src)
+/obj/machinery/poolcontroller/New() //This proc automatically happens on world start
+ for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange
+ src.linkedturfs += W //Add found pool turfs to the central list.
+ processing_objects.Add(src) //Add the pool controller to the processing queue to tie mob effects to the air controller.
+
+/obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer.
+ if(!emagged) //If it is not already emagged, emag it.
+ user << "\red You disable \the [src]'s temperature safeguards." //Inform the mob of what emagging does.
+ emagged = 1 //Set the emag var to true.
+
+/obj/machinery/poolcontroller/attackby(obj/item/P as obj, mob/user as mob, params) //Proc is called when a user hits the pool controller with something.
+
+ if(istype(P,/obj/item/device/multitool)) //If the mob hits the pool controller with a multitool, reset the emagged status
+ if(emagged) //Check the emag status
+ user << "\red You re-enable \the [src]'s temperature safeguards." //Inform the user that they have just fixed the safeguards.
+ emagged = 0 //Set the emagged var to false.
+ return
+ else
+ user << "\red Nothing happens." //If not emagged, don't do anything, and don't tell the user that it can be emagged.
+
+ return //Return, nothing else needs to be done.
+ else //If it's not a multitool, defer to /obj/machinery/proc/attackby
+ ..()
/obj/machinery/poolcontroller/attack_hand()
if(!Adjacent(usr))
usr << "You moved away."
return
- var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Hot","Cold","Normal","Cancel")
- switch(temp)
- if("Hot")
- temperature = "hot"
- if("Cold")
- temperature = "cold"
- if("Normal")
- temperature = "normal"
- if("Cancel")
- return
- usr << "You flick the pool temperature to [temperature]."
+ if(emagged) //Emagging unlocks more (deadly) options.
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Hot","Cold", "Warm", "Cool", "Normal","Cancel") //Allow user to choose which temperature they want.
+
+ switch(temp) //Used for setting the actual temperature var based on user input.
+ if("Hot")
+ temperature = "hot"
+ usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
+ return
+ if("Cold")
+ temperature = "cold"
+ usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
+ return
+
+ //Regular non-traitorous temperature choices still avalible.
+ if("Warm")
+ temperature = "warm"
+ if("Cool")
+ temperature = "cool"
+ if("Normal")
+ temperature = "normal"
+ if("Cancel")
+ return
+
+ usr << "You flick the pool temperature to [temperature]." //Inform the mob of the temperature they just picked.
+ return
+
+ else
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Warm","Cool","Normal","Cancel") //Allow user to choose which temperature they want.
+
+ switch(temp) //Used for setting the actual temperature var based on user input.
+ if("Warm")
+ temperature = "warm"
+ if("Cool")
+ temperature = "cool"
+ if("Normal")
+ temperature = "normal"
+ if("Cancel") //Cancel does nothing and leaves the temperature at it's previous state.
+ return
+
+ usr << "You flick the pool temperature to [temperature]." //Display what the user picked.
+ return
/obj/machinery/poolcontroller/process()
- if(!linkedturfs)
+ if(!linkedturfs) //If no pool tiles are linked, remove the controller from the processing queue, no sense wasting processing power on it.
processing_objects.Remove(src)
return
- updateMobs()
+
+ updateMobs() //Call the mob affecting proc
/obj/machinery/poolcontroller/proc/updateMobs()
- for(var/turf/simulated/floor/beach/water/W in linkedturfs)
- for(var/mob/M in W)
- switch(temperature)
- if("hot")
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs) //Check for pool-turfs linked to the controller.
+ for(var/mob/M in W) //Check for mobs in the linked pool-turfs.
+ switch(temperature) //Apply different effects based on what the temperature is set to.
+ if("hot") //Burn the mob.
if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.bodytemperature = min(500, H.bodytemperature + 35)
+ var/mob/living/carbon/human/H = M //If humanoid, directly apply fire damage for quicker effect.
H.adjustFireLoss(5)
- H << "The water is searing hot!"
- return
- else
- M.bodytemperature = min(500, M.bodytemperature + 35)
- M << "The water is searing hot!"
- return
- if("cold")
+ M.bodytemperature = min(500, M.bodytemperature + 35) //heat mob at 35k(elvin) per cycle
+ M << "The water is searing hot!"
+ return
+
+ if("cold") //Freeze the mob.
if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.bodytemperature = max(80, H.bodytemperature - 80)
+ var/mob/living/carbon/human/H = M //If humanoid, directly apply fire damage for quicker effect.
H.adjustFireLoss(5)
- H << "The water is freezing!"
- return
- else
- M.bodytemperature = max(80, M.bodytemperature - 80)
- M << "The water is freezing!"
- return
- if("normal")
+ M.bodytemperature = max(80, M.bodytemperature - 80) //Quickly cool mob at -80k per cycle
+ M << "The water is freezing!"
+ return
+
+ if("normal") //Normal temp does nothing, because it's just room temperature water.
+ return
+
+ if("warm") //Gently warm the mob.
+ M.bodytemperature = min(330, M.bodytemperature + 10) //Heats up mobs to just over normal, not enough to burn
+ M << "The water is quite warm." //Inform the mob it's warm water.
+ return
+
+ if("cool") //Gently cool the mob.
+ M.bodytemperature = max(290, M.bodytemperature - 15) //Cools mobs to just below normal, not enough to burn
+ M << "The water is chilly." //Inform the mob it's chilly water.
return
\ No newline at end of file
From 5262b56abd913ac7687a8769aa687ec49957bf3f Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Fri, 6 Mar 2015 18:32:36 +0100
Subject: [PATCH 21/27] Hot mode now spawns mist on the pool as a warning
---
code/game/machinery/poolcontroller.dm | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 51885cbcc5b..031a0a2de76 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -6,6 +6,8 @@
var/list/linkedturfs = list() //List contains all of the linked pool turfs to this controller, assignment happens on New()
var/temperature = "normal" //The temperature of the pool, starts off on normal, which has no effects.
var/srange = 5 //The range of the search for pool turfs, change this for bigger or smaller pools.
+ var/linkedmist = list() //Used to keep track of created mist
+ var/misted = 0 //Used to check for mist.
/obj/machinery/poolcontroller/New() //This proc automatically happens on world start
for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange
@@ -41,12 +43,14 @@
switch(temp) //Used for setting the actual temperature var based on user input.
if("Hot")
+ miston()
temperature = "hot"
usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
return
if("Cold")
temperature = "cold"
usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
+ mistoff() //this won't get called otherwise
return
//Regular non-traitorous temperature choices still avalible.
@@ -59,6 +63,7 @@
if("Cancel")
return
+ mistoff()
usr << "You flick the pool temperature to [temperature]." //Inform the mob of the temperature they just picked.
return
@@ -75,6 +80,7 @@
if("Cancel") //Cancel does nothing and leaves the temperature at it's previous state.
return
+ mistoff()
usr << "You flick the pool temperature to [temperature]." //Display what the user picked.
return
@@ -118,4 +124,18 @@
if("cool") //Gently cool the mob.
M.bodytemperature = max(290, M.bodytemperature - 15) //Cools mobs to just below normal, not enough to burn
M << "The water is chilly." //Inform the mob it's chilly water.
- return
\ No newline at end of file
+ return
+
+/obj/machinery/poolcontroller/proc/miston()
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs)
+ var/M = new /obj/effect/mist(W)
+ if(misted)
+ return
+ linkedmist += M
+
+ misted = 1
+
+/obj/machinery/poolcontroller/proc/mistoff()
+ for(var/obj/effect/mist/M in linkedmist)
+ del(M)
+ misted = 0
\ No newline at end of file
From 59ec3b8df771a8cfc071c3166ab36f07b38a77b6 Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Fri, 6 Mar 2015 18:52:10 +0100
Subject: [PATCH 22/27] Change process system in accordance to MarkvA's line
comments
---
code/game/machinery/poolcontroller.dm | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 031a0a2de76..ad7137a81b2 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -12,7 +12,7 @@
/obj/machinery/poolcontroller/New() //This proc automatically happens on world start
for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange
src.linkedturfs += W //Add found pool turfs to the central list.
- processing_objects.Add(src) //Add the pool controller to the processing queue to tie mob effects to the air controller.
+ ..() //Changed to call parent as per MarkvA's recommendation
/obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer.
if(!emagged) //If it is not already emagged, emag it.
@@ -85,10 +85,6 @@
return
/obj/machinery/poolcontroller/process()
- if(!linkedturfs) //If no pool tiles are linked, remove the controller from the processing queue, no sense wasting processing power on it.
- processing_objects.Remove(src)
- return
-
updateMobs() //Call the mob affecting proc
/obj/machinery/poolcontroller/proc/updateMobs()
From 7c7c54a795bfdbd01ec776e26b520ce04a840d8b Mon Sep 17 00:00:00 2001
From: Tigercat2000
Date: Fri, 6 Mar 2015 23:07:08 +0100
Subject: [PATCH 23/27] Update Pool Controller to fox's recommendations
---
code/game/machinery/poolcontroller.dm | 44 +++++++++++----------------
1 file changed, 18 insertions(+), 26 deletions(-)
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index ad7137a81b2..937629589ed 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -39,19 +39,19 @@
return
if(emagged) //Emagging unlocks more (deadly) options.
- var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Hot","Cold", "Warm", "Cool", "Normal","Cancel") //Allow user to choose which temperature they want.
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Scalding","Frigid", "Warm", "Cool", "Normal","Cancel") //Allow user to choose which temperature they want.
switch(temp) //Used for setting the actual temperature var based on user input.
- if("Hot")
- miston()
- temperature = "hot"
+ if("Scalding")
+ miston() //Turn on warning mist for the pool
+ temperature = "scalding" //Burn em!
usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
- return
- if("Cold")
- temperature = "cold"
+ return //Return to avoid calling the un-unique message.
+ if("Frigid")
+ temperature = "frigid"
usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
mistoff() //this won't get called otherwise
- return
+ return //Return to avoid calling the un-unique message.
//Regular non-traitorous temperature choices still avalible.
if("Warm")
@@ -63,7 +63,7 @@
if("Cancel")
return
- mistoff()
+ mistoff() //Remove all mist, setting it to scalding returns before now, only regular temperatures will call it
usr << "You flick the pool temperature to [temperature]." //Inform the mob of the temperature they just picked.
return
@@ -80,7 +80,7 @@
if("Cancel") //Cancel does nothing and leaves the temperature at it's previous state.
return
- mistoff()
+ mistoff() //Remove all mist, because it shouldn't be here if the pool is not set to scalding
usr << "You flick the pool temperature to [temperature]." //Display what the user picked.
return
@@ -91,21 +91,13 @@
for(var/turf/simulated/floor/beach/water/W in linkedturfs) //Check for pool-turfs linked to the controller.
for(var/mob/M in W) //Check for mobs in the linked pool-turfs.
switch(temperature) //Apply different effects based on what the temperature is set to.
- if("hot") //Burn the mob.
- if(ishuman(M))
- var/mob/living/carbon/human/H = M //If humanoid, directly apply fire damage for quicker effect.
- H.adjustFireLoss(5)
-
+ if("scalding") //Burn the mob.
M.bodytemperature = min(500, M.bodytemperature + 35) //heat mob at 35k(elvin) per cycle
M << "The water is searing hot!"
return
- if("cold") //Freeze the mob.
- if(ishuman(M))
- var/mob/living/carbon/human/H = M //If humanoid, directly apply fire damage for quicker effect.
- H.adjustFireLoss(5)
-
- M.bodytemperature = max(80, M.bodytemperature - 80) //Quickly cool mob at -80k per cycle
+ if("frigid") //Freeze the mob.
+ M.bodytemperature = max(80, M.bodytemperature - 35) //cool mob at -35k per cycle
M << "The water is freezing!"
return
@@ -118,20 +110,20 @@
return
if("cool") //Gently cool the mob.
- M.bodytemperature = max(290, M.bodytemperature - 15) //Cools mobs to just below normal, not enough to burn
+ M.bodytemperature = max(290, M.bodytemperature - 10) //Cools mobs to just below normal, not enough to burn
M << "The water is chilly." //Inform the mob it's chilly water.
return
-/obj/machinery/poolcontroller/proc/miston()
+/obj/machinery/poolcontroller/proc/miston() //Spawn /obj/effect/mist (from the shower) on all linked pool tiles
for(var/turf/simulated/floor/beach/water/W in linkedturfs)
var/M = new /obj/effect/mist(W)
if(misted)
return
linkedmist += M
- misted = 1
+ misted = 1 //var just to keep track of when the mist on proc has been called.
-/obj/machinery/poolcontroller/proc/mistoff()
+/obj/machinery/poolcontroller/proc/mistoff() //Delete all /obj/effect/mist from all linked pool tiles.
for(var/obj/effect/mist/M in linkedmist)
del(M)
- misted = 0
\ No newline at end of file
+ misted = 0 //no mist left, turn off the tracking var
\ No newline at end of file
From d2d0627d43495ea5d1a5a95d5d308018def33f85 Mon Sep 17 00:00:00 2001
From: DZD
Date: Fri, 6 Mar 2015 18:34:45 -0500
Subject: [PATCH 24/27] NanoUI pAIs
---
code/game/objects/items/devices/paicard.dm | 3 +
code/modules/mob/living/silicon/pai/pai.dm | 13 +-
.../mob/living/silicon/pai/software.dm | 805 +++---------------
.../living/silicon/pai/software_modules.dm | 539 ++++++++++++
code/modules/nano/nanointeraction.dm | 4 +-
nano/templates/pai_atmosphere.tmpl | 36 +
nano/templates/pai_directives.tmpl | 50 ++
nano/templates/pai_doorjack.tmpl | 44 +
nano/templates/pai_interface.tmpl | 45 +
nano/templates/pai_manifest.tmpl | 86 ++
nano/templates/pai_medrecords.tmpl | 86 ++
nano/templates/pai_messenger.tmpl | 80 ++
nano/templates/pai_radio.tmpl | 48 ++
nano/templates/pai_secrecords.tmpl | 76 ++
nano/templates/pai_signaller.tmpl | 33 +
paradise.dme | 1 +
16 files changed, 1241 insertions(+), 708 deletions(-)
create mode 100644 code/modules/mob/living/silicon/pai/software_modules.dm
create mode 100644 nano/templates/pai_atmosphere.tmpl
create mode 100644 nano/templates/pai_directives.tmpl
create mode 100644 nano/templates/pai_doorjack.tmpl
create mode 100644 nano/templates/pai_interface.tmpl
create mode 100644 nano/templates/pai_manifest.tmpl
create mode 100644 nano/templates/pai_medrecords.tmpl
create mode 100644 nano/templates/pai_messenger.tmpl
create mode 100644 nano/templates/pai_radio.tmpl
create mode 100644 nano/templates/pai_secrecords.tmpl
create mode 100644 nano/templates/pai_signaller.tmpl
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index b5d14aa8982..2c2c5d9ea07 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -286,6 +286,8 @@
src.overlays.Cut()
src.overlays += "pai-off"
+/obj/item/device/paicard
+ var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
src.overlays.Cut()
@@ -299,6 +301,7 @@
if(7) src.overlays += "pai-sad"
if(8) src.overlays += "pai-angry"
if(9) src.overlays += "pai-what"
+ current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
var/turf/T = get_turf_or_move(src.loc)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 005ad324045..b1ca37d8ddc 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -60,19 +60,24 @@
var/secHUD = 0 // Toggles whether the Security HUD is active or not
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
+ var/medical_cannotfind = 0
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
var/datum/data/record/medicalActive2
+ var/security_cannotfind = 0
var/datum/data/record/securityActive1 // Could probably just combine all these into one
var/datum/data/record/securityActive2
var/obj/machinery/door/hackdoor // The airlock being hacked
var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check
+ var/hack_aborted = 0
var/obj/item/radio/integrated/signal/sradio // AI's signaller
var/translator_on = 0 // keeps track of the translator module
+ var/current_pda_messaging = null
+
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
canmove = 0
src.loc = paicard
@@ -82,14 +87,14 @@
if(!card.radio)
card.radio = new /obj/item/device/radio(src.card)
radio = card.radio
-
+
//Default languages without universal translator software
add_language("Galactic Common", 1)
add_language("Sol Common", 1)
add_language("Tradeband", 1)
- add_language("Gutter", 1)
- add_language("Trinary", 1)
-
+ add_language("Gutter", 1)
+ add_language("Trinary", 1)
+
//Verbs for pAI mobile form, chassis and Say flavor text
verbs += /mob/living/silicon/pai/proc/choose_chassis
verbs += /mob/living/silicon/pai/proc/choose_verbs
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index a663ae6a738..de1a8067b7e 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -1,724 +1,125 @@
-// TODO:
-// - Additional radio modules
-// - Potentially roll HUDs and Records into one
-// - Shock collar/lock system for prisoner pAIs?
-// - Put cable in user's hand instead of on the ground
-// - Camera jack
+var/list/pai_emotions = list(
+ "Happy" = 1,
+ "Cat" = 2,
+ "Extremely Happy" = 3,
+ "Face" = 4,
+ "Laugh" = 5,
+ "Off" = 6,
+ "Sad" = 7,
+ "Angry" = 8,
+ "What" = 9
+ )
-/mob/living/silicon/pai/var/list/available_software = list(
- "crew manifest" = 5,
- "digital messenger" = 5,
- "medical records" = 15,
- "security records" = 15,
- //"camera jack" = 10,
- "door jack" = 30,
- "atmosphere sensor" = 5,
- //"heartbeat sensor" = 10,
- "security HUD" = 20,
- "medical HUD" = 20,
- "universal translator" = 35,
- //"projection array" = 15
- "remote signaller" = 5,
- )
+var/global/list/pai_software_by_key = list()
+var/global/list/default_pai_software = list()
+/hook/startup/proc/populate_pai_software_list()
+ var/r = 1 // I would use ., but it'd sacrifice runtime detection
+ for(var/type in typesof(/datum/pai_software) - /datum/pai_software)
+ var/datum/pai_software/P = new type()
+ if(pai_software_by_key[P.id])
+ var/datum/pai_software/O = pai_software_by_key[P.id]
+ world << "pAI software module [P.name] has the same key as [O.name]!"
+ r = 0
+ continue
+ pai_software_by_key[P.id] = P
+ if(P.default)
+ default_pai_software[P.id] = P
+ return r
+
+/mob/living/silicon/pai/New()
+ ..()
+ software = default_pai_software.Copy()
/mob/living/silicon/pai/verb/paiInterface()
set category = "pAI Commands"
set name = "Software Interface"
- var/dat = ""
- var/left_part = ""
- var/right_part = softwareMenu()
- src.set_machine(src)
- if(temp)
- left_part = temp
- else if(src.stat == 2) // Show some flavor text if the pAI is dead
- left_part = "ÈRrÖR Ða†Ä ÇÖRrÚþ†Ìoñ" //This file has to be saved as ANSI or this will not display correctly
- right_part = "Program index hash not found
"
+ ui_interact(src)
- else
- switch(src.screen) // Determine which interface to show here
- if("main")
- left_part = ""
- if("directives")
- left_part = src.directives()
- if("pdamessage")
- left_part = src.pdamessage()
- if("buy")
- left_part = downloadSoftware()
- if("manifest")
- left_part = src.softwareManifest()
- if("medicalrecord")
- left_part = src.softwareMedicalRecord()
- if("securityrecord")
- left_part = src.softwareSecurityRecord()
- if("translator")
- left_part = src.softwareTranslator()
- if("atmosensor")
- left_part = src.softwareAtmo()
- if("securityhud")
- left_part = src.facialRecognition()
- if("medicalhud")
- left_part = src.medicalAnalysis()
- if("doorjack")
- left_part = src.softwareDoor()
- if("camerajack")
- left_part = src.softwareCamera()
- if("signaller")
- left_part = src.softwareSignal()
- if("radio")
- left_part = src.softwareRadio()
+/mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ if(user != src)
+ if(ui) ui.set_status(STATUS_CLOSE, 0)
+ return
- //usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
+ if(ui_key != "main")
+ var/datum/pai_software/S = software[ui_key]
+ if(S && !S.toggle)
+ S.on_ui_interact(src, ui, force_open)
+ else
+ if(ui) ui.set_status(STATUS_CLOSE, 0)
+ return
+ var/data[0]
- // Declaring a doctype is necessary to enable BYOND's crappy browser's more advanced CSS functionality
- dat = {"
-
-
-
-
-
-
-
-
-
-
-
-
- "}
- usr << browse(dat, "window=pai;size=685x449;border=0;can_close=1;can_resize=1;can_minimize=1;titlebar=1")
- onclose(usr, "pai")
- temp = null
- return
+ data["emotions"] = emotions
+ data["current_emotion"] = card.current_emotion
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/mob/living/silicon/pai/Topic(href, href_list)
- ..()
+ . = ..()
+ if(.) return
- if(href_list["priv_msg"]) // Admin-PMs were triggering the interface popup. Hopefully this will stop it.
- return
- var/soft = href_list["software"]
- var/sub = href_list["sub"]
- if(!soft && !sub)
- return
- if(soft)
- src.screen = soft
- if(sub)
- src.subscreen = text2num(sub)
- switch(soft)
- // Purchasing new software
- if("buy")
- if(src.subscreen == 1)
- var/target = href_list["buy"]
- if(available_software.Find(target))
- var/cost = src.available_software[target]
- if(src.ram >= cost)
- src.ram -= cost
- src.software.Add(target)
- else
- src.temp = "Insufficient RAM available."
- else
- src.temp = "Trunk \"[target]\" not found."
-
- // Configuring onboard radio
- if("radio")
- if(href_list["freq"])
- var/new_frequency = (radio.frequency + text2num(href_list["freq"]))
- if(new_frequency < 1441 || new_frequency > 1599)
- new_frequency = sanitize_frequency(new_frequency)
- else
- radio.set_frequency(new_frequency)
- else if (href_list["talk"])
- radio.broadcasting = text2num(href_list["talk"])
- else if (href_list["listen"])
- radio.listening = text2num(href_list["listen"])
-
- if("image")
- var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What")
- var/pID = 1
-
- switch(newImage)
- if("Happy")
- pID = 1
- if("Cat")
- pID = 2
- if("Extremely Happy")
- pID = 3
- if("Face")
- pID = 4
- if("Laugh")
- pID = 5
- if("Off")
- pID = 6
- if("Sad")
- pID = 7
- if("Angry")
- pID = 8
- if("What")
- pID = 9
- src.card.setEmotion(pID)
-
- if("signaller")
-
- if(href_list["send"])
-
- sradio.send_signal("ACTIVATE")
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
-
- if(href_list["freq"])
-
- var/new_frequency = (sradio.frequency + text2num(href_list["freq"]))
- if(new_frequency < 1200 || new_frequency > 1600)
- new_frequency = sanitize_frequency(new_frequency)
- sradio.set_frequency(new_frequency)
-
- if(href_list["code"])
-
- sradio.code += text2num(href_list["code"])
- sradio.code = round(sradio.code)
- sradio.code = min(100, sradio.code)
- sradio.code = max(1, sradio.code)
-
-
-
- if("directive")
- if(href_list["getdna"])
- var/mob/living/M = src.loc
- var/count = 0
- while(!istype(M, /mob/living))
- if(!M || !M.loc) return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
- M = M.loc
- count++
- if(count >= 6)
- src << "You are not being carried by anyone!"
- return 0
- spawn CheckDNA(M, src)
-
- if("pdamessage")
- if(!isnull(pda))
- if(href_list["toggler"])
- pda.toff = !pda.toff
- else if(href_list["ringer"])
- pda.silent = !pda.silent
- else if(href_list["target"])
- if(silence_time)
- return alert("Communications circuits remain uninitialized.")
-
- var/target = locate(href_list["target"])
- pda.create_message(src, target)
-
- // Accessing medical records
- if("medicalrecord")
- if(src.subscreen == 1)
- var/datum/data/record/record = locate(href_list["med_rec"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = record
- if (!( data_core.general.Find(R) ))
- src.temp = "Unable to locate requested medical record. Record may have been deleted, or never have existed."
- else
- for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- src.medicalActive1 = R
- src.medicalActive2 = M
- if("securityrecord")
- if(src.subscreen == 1)
- var/datum/data/record/record = locate(href_list["sec_rec"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = record
- if (!( data_core.general.Find(R) ))
- src.temp = "Unable to locate requested security record. Record may have been deleted, or never have existed."
- else
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- src.securityActive1 = R
- src.securityActive2 = M
- if("securityhud")
- if(href_list["toggle"])
- src.secHUD = !src.secHUD
- if("medicalhud")
- if(href_list["toggle"])
- src.medHUD = !src.medHUD
- if("translator")
- if(href_list["toggle"])
- src.translator_toggle()
- if("doorjack")
- if(href_list["jack"])
- if(src.cable && src.cable.machine)
- src.hackdoor = src.cable.machine
- src.hackloop()
- if(href_list["cancel"])
- src.hackdoor = null
- if(href_list["cable"])
- var/turf/T = get_turf_or_move(src.loc)
- src.cable = new /obj/item/weapon/pai_cable(T)
- for (var/mob/M in viewers(T))
- M.show_message("\red A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "\red You hear the soft click of something light and hard falling to the ground.", 2)
- //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
- src.paiInterface() // So we'll just call the update directly rather than doing some default checks
- return
-
-// MENUS
-
-/mob/living/silicon/pai/proc/softwareMenu() // Populate the right menu
- var/dat = ""
-
- dat += "Refresh
"
- // Built-in
- dat += "Directives
"
- dat += "Radio Configuration
"
- dat += "Screen Display
"
- //dat += "Text Messaging
"
- dat += "
"
-
- // Basic
- dat += "Basic
"
- for(var/s in src.software)
- if(s == "digital messenger")
- dat += "Digital Messenger [(pda.toff) ? "•" : "•"]
"
- if(s == "crew manifest")
- dat += "Crew Manifest
"
- if(s == "medical records")
- dat += "Medical Records
"
- if(s == "security records")
- dat += "Security Records
"
- if(s == "camera")
- dat += "Camera Jack
"
- if(s == "remote signaller")
- dat += "Remote Signaller
"
- dat += "
"
-
- // Advanced
- dat += "Advanced
"
- for(var/s in src.software)
- if(s == "atmosphere sensor")
- dat += "Atmospheric Sensor
"
- if(s == "heartbeat sensor")
- dat += "Heartbeat Sensor
"
- if(s == "security HUD") //This file has to be saved as ANSI or this will not display correctly
- dat += "Facial Recognition Suite [(src.secHUD) ? "•" : "•"]
"
- if(s == "medical HUD") //This file has to be saved as ANSI or this will not display correctly
- dat += "Medical Analysis Suite [(src.medHUD) ? "•" : "•"]
"
- if(s == "universal translator") //This file has to be saved as ANSI or this will not display correctly
- dat += "Universal Translator [(src.translator_on) ? "•" : "•"]
"
- if(s == "projection array")
- dat += "Projection Array
"
- if(s == "camera jack")
- dat += "Camera Jack
"
- if(s == "door jack")
- dat += "Door Jack
"
- dat += "
"
- dat += "
"
- dat += "Download additional software"
- return dat
-
-
-
-/mob/living/silicon/pai/proc/downloadSoftware()
- var/dat = ""
-
- dat += "CentComm pAI Module Subversion Network
"
- dat += "Remaining Available Memory: [src.ram]
"
- dat += "Trunks available for checkout
"
-
- for(var/s in available_software)
- if(!software.Find(s))
- var/cost = src.available_software[s]
- var/displayName = uppertext(s)
- dat += "- [displayName] ([cost])
"
+ if(href_list["software"])
+ var/soft = href_list["software"]
+ var/datum/pai_software/S = software[soft]
+ if(S.toggle)
+ S.toggle(src)
else
- var/displayName = lowertext(s)
- dat += "- [displayName] (Download Complete)
"
- dat += "
"
- return dat
+ ui_interact(src, ui_key = soft)
+ return 1
+ else if(href_list["stopic"])
+ var/soft = href_list["stopic"]
+ var/datum/pai_software/S = software[soft]
+ if(S)
+ return S.Topic(href, href_list)
-/mob/living/silicon/pai/proc/directives()
- var/dat = ""
+ else if(href_list["purchase"])
+ var/soft = href_list["purchase"]
+ var/datum/pai_software/S = pai_software_by_key[soft]
+ if(S && (ram >= S.ram_cost))
+ ram -= S.ram_cost
+ software[S.id] = S
+ return 1
- dat += "[(src.master) ? "Your master: [src.master] ([src.master_dna])" : "You are bound to no one."]"
- dat += "
"
- dat += "Request carrier DNA sample
"
- dat += "Directives
"
- dat += "Prime Directive
"
- dat += " [src.pai_law0]
"
- dat += "Supplemental Directives
"
- dat += " [src.pai_laws]
"
- dat += "
"
- dat += {"Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of
- comprehending the subtle nuances of human language. You may parse the \"spirit\" of a directive and follow its intent,
- rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build
- only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are.
- Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of
- simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your
- prime directive to the best of your ability.
- "}
- return dat
-
-/mob/living/silicon/pai/proc/CheckDNA(var/mob/M, var/mob/living/silicon/pai/P)
- var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
- if(answer == "Yes")
- var/turf/T = get_turf_or_move(P.loc)
- for (var/mob/v in viewers(T))
- v.show_message("\blue [M] presses \his thumb against [P].", 3, "\blue [P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
- var/datum/dna/dna = M.dna
- P << "[M]'s UE string : [dna.unique_enzymes]
"
- if(dna.unique_enzymes == P.master_dna)
- P << "DNA is a match to stored Master DNA."
- else
- P << "DNA does not match stored Master DNA."
- else
- P << "[M] does not seem like \he is going to provide a DNA sample willingly."
-
-// -=-=-=-= Software =-=-=-=- //
-
-//Remote Signaller
-/mob/living/silicon/pai/proc/softwareSignal()
- var/dat = ""
- dat += "Remote Signaller
"
- dat += {"Frequency/Code for signaler:
- Frequency:
- -
- -
- [format_frequency(src.sradio.frequency)]
- +
- +
-
- Code:
- -
- -
- [src.sradio.code]
- +
- +
-
- Send Signal
"}
- return dat
-
-//Station Bounced Radio
-/mob/living/silicon/pai/proc/softwareRadio()
- var/dat = ""
- dat += "Station Bounced Radio
"
- if(!istype(src, /obj/item/device/radio/headset)) //Headsets don't get a mic button
- dat += "Microphone: [radio.broadcasting ? "Engaged" : "Disengaged"]
"
- dat += {"
- Speaker: [radio.listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(radio.frequency)]
- +
- +
- "}
-
- for (var/ch_name in radio.channels)
- dat+=radio.text_sec_channel(ch_name, radio.channels[ch_name])
- dat+={"[radio.text_wires()]