diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 52025a7b23a..3d04818ef2a 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -1143,7 +1143,7 @@
"vY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/space)
"vZ" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/obj/docking_port/mobile{dir = 2; dwidth = 5; height = 7; id = "arrival"; name = "arrival shuttle"; travelDir = -90; width = 15},/obj/docking_port/stationary{dir = 2; dwidth = 5; height = 7; id = "arrival_home"; name = "port bay 1"; width = 15},/turf/simulated/shuttle/floor,/area/space)
"wa" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space)
-"wb" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/floor/plating,/area/hallway/primary/central)
+"wb" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/internals/emergency_oxygen,/turf/simulated/floor/plating,/area/hallway/primary/central)
"wc" = (/turf/simulated/wall,/area/crew_quarters/heads{name = "\improper Job Assignment"})
"wd" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet,/turf/simulated/floor/plating,/area/hallway/primary/central)
"we" = (/obj/structure/piano,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
@@ -1385,7 +1385,7 @@
"AG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/obj/structure/dispenser,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AI" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"AJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"AJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AK" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering"; req_access_txt = "10"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"AL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering)
"AM" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 5ae648be540..04feb549c9c 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -223,7 +223,7 @@
"aeo" = (/obj/structure/cable,/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport)
"aep" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/prison)
"aeq" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 9},/turf/simulated/floor/plating,/area/security/transfer)
-"aer" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/tank/anesthetic{pixel_x = -3; pixel_y = 1},/obj/item/weapon/tank/oxygen/red{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/prison)
+"aer" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/tank/internals/anesthetic{pixel_x = -3; pixel_y = 1},/obj/item/weapon/tank/internals/oxygen/red{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/security/prison)
"aes" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 5},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/security/transfer)
"aet" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison)
"aeu" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison)
@@ -781,7 +781,7 @@
"apa" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"apb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"apc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/light/small{dir = 4},/obj/machinery/power/apc{dir = 2; name = "Fitness Room APC"; pixel_x = 0; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
-"apd" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/fsmaint)
+"apd" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/internals/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/fsmaint)
"ape" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/fsmaint)
"apf" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"apg" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
@@ -1023,10 +1023,10 @@
"atI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/maintenance/fpmaint2)
"atK" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"atL" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28; shattered = 1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"atL" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28; shattered = 1},/obj/machinery/iv_drip,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atM" = (/obj/structure/computerframe,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atN" = (/obj/structure/mirror{icon_state = "mirror_broke"; pixel_y = 28; shattered = 1},/obj/item/weapon/shard{icon_state = "medium"},/obj/item/weapon/circuitboard/operating,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"atO" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"atO" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atP" = (/obj/item/weapon/airlock_painter,/obj/structure/lattice,/obj/structure/closet,/turf/space,/area/space)
"atQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{tag = "icon-manifold (WEST)"; icon_state = "manifold"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"atR" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -1201,9 +1201,9 @@
"axe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry)
"axf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"axg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
-"axh" = (/obj/structure/closet/wardrobe/white,/obj/item/clothing/shoes/jackboots,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"axh" = (/obj/structure/closet/wardrobe/white,/obj/item/clothing/shoes/jackboots,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"axi" = (/obj/structure/table/glass,/obj/item/weapon/hemostat,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"axj" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
+"axj" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"axk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"axl" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
"axm" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
@@ -2297,7 +2297,7 @@
"aSi" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/storage/emergency2)
"aSj" = (/obj/machinery/light/small,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency2)
"aSk" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency2)
-"aSl" = (/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)
+"aSl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency2)
"aSm" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/storage/tools)
"aSn" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel,/area/storage/tools)
"aSo" = (/obj/structure/table,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plasteel,/area/storage/tools)
@@ -3165,7 +3165,7 @@
"biS" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/storage/emergency)
"biT" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency)
"biU" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency)
-"biV" = (/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/emergency)
+"biV" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency)
"biW" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"biX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"biY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
@@ -3800,7 +3800,7 @@
"bvd" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter)
"bve" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/teleporter)
"bvf" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/teleporter)
-"bvg" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/teleporter)
+"bvg" = (/obj/structure/rack,/obj/item/weapon/tank/internals/oxygen,/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/teleporter)
"bvh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bvi" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Medbay"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/medbay)
"bvj" = (/obj/machinery/door/window/eastleft{name = "Medical Delivery"; req_access_txt = "5"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/medbay)
@@ -3939,7 +3939,7 @@
"bxM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
"bxN" = (/obj/structure/stool/bed/chair,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
"bxO" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
-"bxP" = (/obj/structure/closet/wardrobe/pjs,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Medbay Treatment Center"; dir = 4; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bxP" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Medbay Treatment Center"; dir = 4; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bxQ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bxR" = (/obj/effect/landmark/start{name = "Medical Doctor"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bxS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
@@ -4003,7 +4003,7 @@
"byY" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
"byZ" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
"bza" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/sleeper)
-"bzb" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bzb" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bzc" = (/obj/machinery/light,/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bzd" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bze" = (/obj/structure/table/reinforced,/obj/item/weapon/wrench{pixel_x = 5; pixel_y = -5},/turf/simulated/floor/plasteel,/area/medical/sleeper)
@@ -4053,7 +4053,7 @@
"bzW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bzX" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bzY" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"bzZ" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
+"bzZ" = (/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_x = 32; pixel_y = 40; tag = "icon-direction_sec (NORTH)"},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = 32; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = 32; pixel_y = 24; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central)
"bAa" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bAb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bAc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/status_display{pixel_y = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
@@ -4131,7 +4131,7 @@
"bBw" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bBx" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/camera{c_tag = "Medbay Storage"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bBy" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bBz" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bBz" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bBA" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/sleeper)
"bBB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/medical/medbay)
"bBC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4195,7 +4195,7 @@
"bCI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bCJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bCK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bCL" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bCL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bCM" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Medbay Storage"; req_access_txt = "45"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bCN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay)
"bCO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4272,7 +4272,7 @@
"bEh" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/weapon/storage/belt/medical{pixel_x = 0; pixel_y = 2},/obj/item/clothing/tie/stethoscope,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bEi" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bEj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bEk" = (/obj/structure/disposalpipe/segment,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bEk" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bEl" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = -30; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay South"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bEm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bEn" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/cmo)
@@ -4340,9 +4340,9 @@
"bFx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitehall"},/area/medical/sleeper)
"bFy" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/structure/sign/nosmoking_2{pixel_x = -28},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/sleeper)
"bFz" = (/obj/structure/table/glass,/obj/machinery/camera{c_tag = "Medbay Cryogenics"; dir = 2; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel,/area/medical/sleeper)
-"bFA" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bFA" = (/obj/machinery/vending/wallmed{pixel_x = 28; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bFB" = (/obj/structure/grille,/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/structure/window/reinforced/fulltile,/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/engine,/area/toxins/explab)
-"bFC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bFC" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bFD" = (/obj/structure/flora/tree/festivus,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/crew_quarters/hor)
"bFE" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bFF" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/door_control{id = "medpriv4"; name = "Privacy Shutters"; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4405,16 +4405,16 @@
"bGK" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/sleeper)
"bGL" = (/obj/machinery/camera{c_tag = "Telescience Test Chamber"; dir = 1; network = list("SS13","RD")},/obj/machinery/light,/obj/structure/sign/nosmoking_2{pixel_y = -32},/turf/simulated/floor/engine,/area/toxins/explab)
"bGM" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/medical/sleeper)
-"bGN" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/medical/sleeper)
+"bGN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGP" = (/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGQ" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel,/area/medical/sleeper)
"bGR" = (/obj/structure/table,/obj/machinery/light,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGS" = (/obj/structure/table,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/reagent_containers/glass/beaker/large/charcoal,/obj/item/weapon/reagent_containers/glass/beaker/large/epinephrine,/obj/item/weapon/reagent_containers/glass/beaker/large/styptic,/obj/item/weapon/reagent_containers/glass/beaker/large/silver_sulfadiazine,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGT" = (/obj/structure/table,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGU" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/o2{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGV" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/brute{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/brute{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bGW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGT" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/o2{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGU" = (/obj/structure/table,/obj/machinery/requests_console{announcementConsole = 0; department = "Medbay"; departmentType = 1; name = "Medbay RC"; pixel_x = 0; pixel_y = -30; pixel_z = 0},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/fire{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/fire{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGV" = (/obj/structure/table,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1485; listening = 1; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -30},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/toxin{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bGW" = (/obj/machinery/light,/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bGX" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bGY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bGZ" = (/obj/machinery/door/airlock/medical{name = "Patient Room"; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4480,7 +4480,7 @@
"bIh" = (/obj/effect/landmark{name = "blobstart"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bIi" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bIj" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bIk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall,/area/medical/sleeper)
+"bIk" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/brute{pixel_x = -3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
"bIl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bIm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bIn" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/shieldwallgen{req_access = list(55)},/turf/simulated/floor/plating,/area/toxins/xenobiology)
@@ -4717,7 +4717,7 @@
"bMK" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
"bML" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/yellow/visible,/turf/space,/area/space)
"bMM" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/wall/r_wall,/area/medical/virology)
-"bMN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"bMN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/medical/sleeper)
"bMO" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/machinery/camera{c_tag = "Virology Break Room"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"bMP" = (/obj/machinery/light{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"bMQ" = (/obj/item/weapon/bedsheet,/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
@@ -4795,7 +4795,7 @@
"bOk" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"bOl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"bOm" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/toxins/misc_lab)
-"bOn" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/vending/wallmed{pixel_x = 28; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Recovery Room"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bOn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/wall/r_wall,/area/medical/sleeper)
"bOo" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/toxins/misc_lab)
"bOp" = (/turf/simulated/wall,/area/toxins/misc_lab)
"bOq" = (/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -4810,7 +4810,7 @@
"bOz" = (/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction)
"bOA" = (/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"bOB" = (/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 5},/area/hallway/primary/aft)
-"bOC" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 7; pixel_y = -3},/obj/item/weapon/reagent_containers/glass/bottle/morphine,/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/syringe,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bOC" = (/turf/simulated/wall/r_wall,/area/medical/medbay)
"bOD" = (/obj/structure/dispenser{pixel_x = -1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/atmos)
"bOE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel,/area/atmos)
"bOF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
@@ -4923,7 +4923,7 @@
"bQI" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/hazardvest,/turf/simulated/floor/plating,/area/construction)
"bQJ" = (/obj/structure/table,/obj/item/stack/cable_coil{amount = 5},/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/construction)
"bQK" = (/obj/structure/table,/turf/simulated/floor/plating,/area/construction)
-"bQL" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/atmos)
+"bQL" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/table,/obj/item/weapon/tank/internals/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/internals/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/atmos)
"bQM" = (/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = -32},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/atmos)
"bQN" = (/obj/machinery/computer/station_alert,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_control{id = "atmos"; name = "Atmospherics Lockdown"; pixel_x = 24; pixel_y = 4; req_access_txt = "24"},/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/atmos)
"bQO" = (/obj/structure/table,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 7},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/machinery/light{dir = 8},/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/atmos)
@@ -5408,7 +5408,7 @@
"bZZ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/port)
"caa" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft)
"cab" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/aft)
-"cac" = (/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,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft)
+"cac" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft)
"cad" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
"cae" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft)
"caf" = (/obj/item/clothing/head/hardhat,/turf/simulated/floor/plating/airless,/area/space)
@@ -5717,7 +5717,7 @@
"cfW" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"cfX" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"cfY" = (/obj/machinery/door/poddoor/preopen{id = "telelab"; name = "test chamber blast door"},/obj/machinery/door/firedoor/heavy,/turf/simulated/floor/engine,/area/toxins/explab)
-"cfZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{step_x = 0; step_y = 0},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
+"cfZ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/clothing/mask/breath{step_x = 0; step_y = 0},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"cga" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"cgb" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/engine/engineering)
"cgc" = (/turf/simulated/wall,/area/engine/engineering)
@@ -6009,7 +6009,7 @@
"clC" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering)
"clD" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"clF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
+"clF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
"clG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"clH" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"clI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
@@ -6139,7 +6139,7 @@
"coc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering)
"cod" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"coe" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
-"cof" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
+"cof" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/internals/plasma,/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
"cog" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/engine/engineering)
"coh" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engineering)
"coi" = (/obj/structure/particle_accelerator/particle_emitter/left,/turf/simulated/floor/plating,/area/engine/engineering)
@@ -6263,6 +6263,7 @@
"cqw" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Room"; req_access_txt = "17;65"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat)
"cqx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer)
"cqy" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
+"cqz" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty{pixel_x = -3; pixel_y = -3},/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/BMinus{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/blood/BPlus{pixel_x = 1; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = -2; pixel_y = -1},/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cqA" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity West"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cqB" = (/obj/machinery/camera/emp_proof{c_tag = "Singularity East"; dir = 1; network = list("Singularity")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"cqC" = (/obj/item/device/radio/intercom{dir = 8; freerange = 1; name = "Station Intercom (Telecoms)"; pixel_x = 0; pixel_y = 26},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
@@ -6305,7 +6306,10 @@
"crn" = (/obj/machinery/door_control{id = "teledoor"; name = "AI Satellite Teleport Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "17;65"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat)
"cro" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/aisat)
"crp" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"crq" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"crr" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sign/directions/security{dir = 4; icon_state = "direction_sec"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_sec (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"crs" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior)
+"crt" = (/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = 32; pixel_y = 28; tag = "icon-direction_evac (EAST)"},/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_x = 32; pixel_y = 36; tag = "icon-direction_sec (NORTH)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cru" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/aisat)
"crv" = (/obj/machinery/door/poddoor/shutters{id = "teledoor"; name = "AI Satellite Teleport Access"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/aisat)
"crw" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "65"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior)
@@ -6468,6 +6472,8 @@
"cux" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure)
"cuy" = (/obj/structure/table,/obj/item/stack/sheet/mineral/plasma{layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/secure)
"cuz" = (/obj/docking_port/stationary{dir = 2; dwidth = 11; height = 22; id = "whiteship_ss13"; name = "SS13 Arrival Docking"; width = 35},/turf/space,/area/space)
+"cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
+"cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6581,11 +6587,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaekaCXaOualQaCZaDaaDbaDcaDdaDealQaDgaDfavMaBGaDhaAvaDiaDjaDkaDlaDmaDnayuaDoazEazEazEazEaDpaDqbRJaDsaDtaDuaBYaBYaBYaBYaBYaBYaBYaAEaaaazNaDvaDwaDxaDyaDzazNaaaaxoaxuaxvaDAaDBaDCaDDaDEaxvapNaDFaxxaxxaDGaATaDHaATaDIaxxaxxaDJaDKaxKaDLaxKayQamwayRacAaeUapTapTapTapTapTaDMaDNaDOaDPaDQaDRaDRaDRaDSayZaDTayZaDUaDVaDWaBdaBeaApallallallallallallallallallallallallallaDXallallallallawTaBtaDYaDZaEaaDZaEbaEcaEdaEdaEeaEfaEfaEfaEfaEfaEgaEhaEiaEiaEiaEiaEiaEiaBDaEjaEkaElaBDaBDaBDaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaEmaEmaEnalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFaEGaEGaEGaEGaEGaEHaEIaAEaafazNaEJaDwaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeaFhaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQalQaGaalQaEoalQaEoaGbaEoalQaEoalQaDgaEpavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEazEaGiayuaGjaGkaBYaBYaBYaGlaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGCaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaGMaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaHbaHcaHdaEfaHeaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYaHZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIkaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHoalQaEoalQaEoalQaEoalQaEoalQaDgaEpavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYbzZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIkaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDgaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaKbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaGWaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaLYaLZaMaaMbaMcaMdaMeaMfaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKiaNdaKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaOaaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaOCaOCaOCaOCaOCaJsaODaOCaIkaOEaOFaOGaIpaIpaIpaOHaOIaIpaIpaIpaIpaGWaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaOCaOCaOCaOCaPTaJsaODaPUaPVaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaReaRgaRgaRgaRhaRiaRjaRkaRlaRmaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaRHaRIaQqaQqaRJaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6595,9 +6601,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaXraXsaOCaOCaOCaXsaOCaODaOCaPUaPUaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavMavMaBGaxaaXXaTraXYaWvaWvaWvaXZaYaaTraRTaYbaYcaUQaWAaYdaYeaYfaYgaWAaYhaYiaYjaOeaYkaYlaYmaRZaOeaYnaYoaYpaYpaYpaYpaYqaYpaYpaYraYsaYsaYsaYtaYsaYuaYvaKAaKAaYwaYxaYxaYxaYxaYxaYxaYyaYzaYAaYBaXgaYCaYDaYDaYEaYFaYDaYCaXiaYGaYHaYIaYJaYHaYHaYHaYHaYHaYHaYKaKAaKAaIkaYLaYMaYNaYOaOCaOCaOCaYPaYQaYRaOCaYSaYTaYUaIpaIpaIpaYVaYWaYWaYWaIpaIpaIpaYXaQhaQhaYYaYZaZaaZbaYYaGWaZcaXFaZdaEfaZeaZfaZgaZhaZiaZjaTgaUuaZkaBDaZlaEjaZmaQqaQqaZmaEjaZnaBDaZoaZpaZqaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaZraNZaZsaRTaTtaZtaTtaTraZuaZvaZwaTtaRTaZxaZyaZzaWAaWAaWAaZAaZBaWAaZCaZDaZEaOeaYkaYlaYmaRZaOeaYnaYoaYpaZFaZGaZGaZGaZHaYpaZIaZJaZKaZLaYvaYvaYvaYvaHYaHYaZMaZNaZOaZPaZQaZRaZSaZTaZUaZVaZWaZXaYDaYDaZYaZZaZYaYDaYDbaababbacbadbaebafbagbahbaibajaYHaXqaHYaHYaIkaIkaIkaIkaIkbakaRdbakbalbamaIkaIkaIkaIkaIkbanbaobaobaobaobaobaobapbaobanaYYbaqbaqaYYbaraXFaXFaXFbanaZcaXFaZdaEfaEfaEfbasbatbasaEfbasaEfaEfaBDaBDbaubaubaubaubaubauaBDaBDbavaNRbawaROaNRaNRaRQaPdaPdaRQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaQyaxaaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTbaxbaybazaWAbaAbaBaZAbaCaWAbaDbaEbaDaOeaYkaYlaYmaRZaOeaYnaYoaYpaZGbaFbaFaZGbaFaYpaZIbaGbaHbaHbaIbaJbaKaYvbaLaHYaWUbXubaNbaObaPbaQbaQbaRbaSbaTaZWbaUaYDaYDaZYbaVaZYaYDaYDbaWbabbaXbaYbaZbbabbbbbcbajbbdaYHaXqbbeaHYaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbbgaXFaXFaXFaXFbbhaXFaXFaXFaXFaXFaXFaXFaXFbbfaXFaXFaXFaXFbaraXFaXFaXFbbibbjaXFaXFbbkaXFaXFaXFbblaXFaXFaXFaXFaXFbbhbbmaXFaXFaXFaXFaXFaXFbbfbbnaRNaNRbbobbpbbqbbraLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaQyaxaaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTbaxbaybazaWAbaAbaBaZAbaCaWAbaDbaEbaDaOeaYkaYlaYmaRZaOeaYnaYoaYpaZGbaFbaFaZGbaFaYpaZIbaGbaHbaHbaIbaJbaKaYvbaLaHYaWUbXubaNbaObaPbaQbaQbaRbaSbaTaZWbaUaYDaYDaZYbaVaZYaYDaYDbaWbabbaXbaYbaZbbabbbbbcbajbbdaYHaXqbbecrtaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbbgaXFaXFaXFaXFbbhaXFaXFaXFaXFaXFaXFaXFaXFbbfaXFaXFaXFaXFbaraXFaXFaXFbbibbjaXFaXFbbkaXFaXFaXFbblaXFaXFaXFaXFaXFbbhbbmaXFaXFaXFaXFaXFaXFbbfbbnaRNaNRbbobbpbbqbbraLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavQavPavPavPavPavPavPavPavPavQavPbbsbbtaxabbuaRWbbvaWPaWPaWPbbwbbxbbyaOcbbzbbAbbBaWAaWAaWAbbCbbDaWAaOeaOeaOeaOeaYkaYlbbEbbFaOeaYnaYoaYpaZGbbGaZGbaFbbHaYpaZIbbIbaHbaHbaHbbJbbKaYvbbLaHYaWUbXvbbMbaObbNbbObbPbbQbbRbbSaZWbbTaZYaYDbbUbbVbbUaYDaZYbbWbabbbXbbYbbZbcabcbbbcbajbajaYHbccaHYaHYaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbcdaXFaXFaXFaXFaXFaXFbcebcfbcfbcfbcgaXFaXFbbfaXFaXFaXFaXFbaraXFaXFbchaWbbciaWbaWbaWbaWbaWbaWbbcjaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbaWbbckbclbcmbcnbcnbcoaROaNRaNRbcpaPdaPdbcpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafavMawZaxaawZaxbaxaaxaaxcawZaxaawZaxbaxabcqaHqbcrbcsbctbcrbcrbcrbcubcvaOcaOcaOcbcwaUQaWAaYdbcxbcybczaWAbcAbcBbcAaOeaOeaOebcCbcDaOcaYnaYoaYpbcEaZGbaFbcFbcGaYpaZIaYvbcHbaHbaHbcIbcJbcKbcLaHYaWUbXvbcMbaObbNbcNbcObcPbaSbaOaZWbcQbcRaYDbcSbcTbcUaYDbcVbcWbabbcXbcYbcZbdabdabdbbajbdcaYHbddbdeaHYaGybbfaXFaXFbdfaXFbdgbdhbdhbdhbdibdhbdhbdhbdjaXFaXFaXFaXFaXFaXFbdkbdlbdmbbfaXFaXFaXFaXFbarbdnbdobdpbdqbdraXFaXFaXFaXFaXFbdsbdtaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFbbfbdubdvbdwbdxaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafavMawZaxaawZaxbaxaaxaaxcawZaxaawZaxbaxabcqaHqbcrbcsbctbcrbcrbcrbcubcvaOcaOcaOcbcwaUQaWAaYdbcxbcybczaWAbcAbcBbcAaOeaOeaOebcCbcDaOcaYnaYoaYpbcEaZGbaFbcFbcGaYpaZIaYvbcHbaHbaHbcIbcJbcKbcLaHYaWUbXvbcMbaObbNbcNbcObcPbaSbaOaZWbcQbcRaYDbcSbcTbcUaYDbcVbcWbabbcXbcYbcZbdabdabdbbajbdcaYHbddbdecuAaGybbfaXFaXFbdfaXFbdgbdhbdhbdhbdibdhbdhbdhbdjaXFaXFaXFaXFaXFaXFbdkbdlbdmbbfaXFaXFaXFaXFbarbdnbdobdpbdqbdraXFaXFaXFaXFaXFbdsbdtaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFbbfbdubdvbdwbdxaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxabdzavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbehaXfbeibejbekbekbekbelbemaXkbenbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubqnbfUbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhpbgdbhqbgdbhpbhrbgdbeAbhsbhtbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJbhKbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6614,18 +6620,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbkNaYpbkNbkNbkNbwibwibwibwibwjbwkbwkbwibwibwlbwlbwmbwnbuQbwobwpbwqbwrbuQbsnbqHaHZaIcaIcbliblibwsbliblibwtbliaHUaHUaHUbwubwvbsubwwbwxaHUaHUaHUbpubpubpubpubpubpubpubpubpubvhaHYbwybtXbtXbtXbwzbtXbtXbtXbwAbvpbwBbwCbwDbwEbwFbwGbwHbwIbwDbhkbjZbsPbwJbwKbwLbwMbwNbwObrAbrAbrAbwPbwQbwRbwSbwTbwTbwTbwTbwUbwTbwTbwTbwVbwVbwWbwXbwYbwYbwZbxabqibuxbxbbxcbxdbxebxfbxgbxhbrVbrVbFBbFBbFBbrVcfYbrVbtnbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibxkbxlbxmbxnbxobxpbwkbxqbxrbxsbxtbxubxvbxwbxxbxybuQbsnbqHaHYaHYaHYbxzaKQbxAaKAbxBbxCbxDaVLaVLaVLbxEbxFbxGbxHbxIaHYaHYaHYaHYaKQaHYaKAaHYaHYaHYbxzaHYbvhaHYbxJbtXbxKbxLbxMbxNbxObtXbxPbxQbxRbxSbwDbwEbwEbxTbxUbxVbwDbhkbxWbsPbrAbxXbxYbxZbwQbyabybbycbydbncbncbeHbyebwTbyfbygbyhbyibyjbykbwTbylbymbynbyobypbwYbyqbyrbysbytbyubyvbywbyxbyybyzbxhchfchfchfchfchfchfchfbrVbtnbgxbsdbsebjoaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwkbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObxxbyPbuQbsnbyQaHYaHYaHYaHYaHYaHYaKAaHYbqHaHYaHYaHYaHYaHYbyRbySbyTaHYaHYaHYaHYaHYaHYaHYaKAbyUaHYaHYaHYaHYbvhbyVbyWbtSbyXbyYbyZbyYbzabtXbzbbvpbvqbzcbtXbzdbzebzfbzgbzhbtXbhkbjZbsPbsPbsPbsPbsPbncbncbncbncbncbncbzibgibzjbwTbzkbzlbzmbznbzobzpbwTbzqbzrbzsbztbzubwYbyqbzvbzwbzxbzybzzbzzbzzbzAbzBbxhchfchfctEctDchfchfchfbrVbtnbgxbsdbsebjobjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIbzJbwkbxrbxrbzKbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYbzZbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbGLchfchfchfbrVbtnbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibzEbzFbzGbzHbzIbzJbwkbxrbxrbzKbzLbuRbzMbzNbzObzPbuQbzQbzRbzSbzSbzSbzTbzSbzSbzUbzSbzVaHYbzWbzXbzYbzYcuBbAabAbbAcbAdbAeaVLaVLbAfaVLbAgbAhaVLbAibAjbAkbAlaHYaHYbtXbAmbAnbAobtWbApbtXbtWbAqbArbtXbtXbtXbtXbtXbtXbtXbtXbhkbjZbfXbAsbAtbAubAvbAwbAxbAybAzbAAbAwbzibgibABbwTbACbADbAEbAFbAGbAHbwTbAIbAJbAKbALbAMbwYbyqbANbAObuybAPbAQbARbASbATbAUbxhchfchfchfbGLchfchfchfbrVbtnbqtbAWbqvbqwbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbtnbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtbCubCvbCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobDpbDqbDqbDrbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaeZaekaelaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobEHbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbOnbtXbFAbCCbCCbCCbOCbFCbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbGabGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGNbtXbGObGPbGQbtXbGRbGSbGUbGTbGVbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbIkbmSbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbIHbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbGabGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbGTbGVbGUbIkbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbIHbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHnaeZbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobEHbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMbJUbJVbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZamIbJWbJXajZbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebtnbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBbLCbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbtnbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMbMNbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebtnbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUbMUbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebtnbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebtnbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebtnbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbPbbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbtnbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbPxbGnbGnbGnbPybBcaaaaaaaaaaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbQBbQCbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaabBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbRdbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbCWbCWbRhbRibKKbRjbKKbRkbRlbCWbCWbCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbjobRxbRybjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 1941f1d6bf2..d831d1ba2ae 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -287,7 +287,7 @@
"fA" = (/obj/machinery/flasher{id = "shuttle_flasher"; pixel_x = -24; pixel_y = 6},/obj/machinery/flasher_button{id = "shuttle_flasher"; pixel_x = -24; pixel_y = -6},/turf/simulated/shuttle/floor4,/area/space)
"fB" = (/turf/simulated/shuttle/floor4,/area/space)
"fC" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/simulated/shuttle/floor,/area/space)
-"fD" = (/obj/structure/rack,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/unsimulated/floor{tag = "icon-warning"; icon_state = "warning"; dir = 2; heat_capacity = 1},/area/centcom/ferry)
+"fD" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"fE" = (/obj/structure/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"fF" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"fG" = (/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/space)
@@ -301,9 +301,9 @@
"fO" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"fP" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"fQ" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
-"fR" = (/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine/loyalpin,/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine/loyalpin,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
+"fR" = (/obj/structure/table/reinforced,/obj/item/weapon/soap/nanotrasen,/obj/item/device/flash/handheld,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"fS" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"fT" = (/obj/structure/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
+"fT" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/device/flashlight/seclite,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"fU" = (/obj/machinery/door/airlock/centcom{name = "Dressing Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/ferry)
"fV" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/centcom/control)
"fW" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/control)
@@ -323,9 +323,9 @@
"gk" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency,/obj/docking_port/stationary{dir = 4; dwidth = 9; height = 11; id = "emergency_away"; name = "Centcom"; width = 22},/turf/simulated/shuttle/plating,/area/space)
"gl" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/shuttle/floor,/area/space)
"gm" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor,/area/space)
-"gn" = (/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"go" = (/obj/structure/rack,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/teargas,/obj/item/weapon/storage/box/flashbangs,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"gp" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space)
+"gn" = (/obj/structure/table/reinforced,/obj/item/weapon/extinguisher,/obj/item/device/flash/handheld,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"go" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/shuttle/floor,/area/space)
+"gp" = (/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"gq" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/space)
"gr" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space)
"gs" = (/turf/unsimulated/floor{name = "plating"},/area/space)
@@ -337,8 +337,8 @@
"gy" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"gz" = (/turf/unsimulated/wall,/area/syndicate_mothership)
"gA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/centcom/ferry)
-"gB" = (/obj/machinery/door/airlock/centcom{name = "Equipment Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"gC" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/plating,/area/space)
+"gB" = (/obj/structure/table/reinforced,/obj/item/weapon/extinguisher,/obj/item/device/flashlight/seclite,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"gC" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"gD" = (/obj/machinery/computer/shuttle/ferry/request,/turf/simulated/shuttle/floor,/area/space)
"gE" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor,/area/space)
"gF" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry)
@@ -348,40 +348,40 @@
"gJ" = (/obj/structure/flora/grass/brown,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
"gK" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
"gL" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
-"gM" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/weapon/weldingtool/largetank,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"gN" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"gO" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"gP" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"gQ" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"gR" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/weapon/weldingtool/largetank,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"gS" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor,/area/space)
+"gM" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/space)
+"gN" = (/obj/structure/table/reinforced,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"gO" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space)
+"gP" = (/obj/machinery/door/poddoor{id = "deathmechs"; name = "combat exosuit bay"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space)
+"gQ" = (/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space)
+"gR" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"gS" = (/turf/unsimulated/floor{tag = "icon-blue"; icon_state = "blue"; dir = 2; heat_capacity = 1},/area/space)
"gT" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; travelDir = 180; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; turf_type = /turf/unsimulated/floor; width = 5},/turf/simulated/shuttle/floor,/area/space)
"gU" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry)
"gV" = (/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry)
"gW" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/ferry)
"gX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac)
-"gY" = (/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"gZ" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/space)
+"gY" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/space)
+"gZ" = (/turf/unsimulated/floor{tag = "icon-yellow"; icon_state = "yellow"; dir = 2},/area/space)
"ha" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry)
-"hb" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "109"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"hb" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/turf/unsimulated/floor{icon_state = "floor"},/area/space)
"hc" = (/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership)
-"hd" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"he" = (/obj/mecha/combat/gygax,/turf/unsimulated/floor{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/centcom/ferry)
-"hf" = (/obj/mecha/working/ripley,/turf/unsimulated/floor{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/centcom/ferry)
-"hg" = (/obj/machinery/mech_bay_recharge_port{tag = "icon-recharge_port (WEST)"; icon_state = "recharge_port"; dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hh" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space)
+"hd" = (/obj/machinery/door/airlock/glass_large{name = "Medical Equipment"; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"he" = (/obj/machinery/door/airlock/glass_large{name = "Security Equipment"; req_access = null; req_access_txt = "103"; req_one_access = null},/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"hf" = (/obj/machinery/door/airlock/glass_large{name = "Engineering Equipment"; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "floor"},/area/space)
+"hg" = (/obj/structure/table/reinforced,/obj/item/weapon/melee/baton/loaded{pixel_x = -3; pixel_y = 0},/obj/item/weapon/melee/baton/loaded{pixel_x = 4; pixel_y = 0},/obj/item/weapon/reagent_containers/hypospray/combat/nanites{pixel_x = 4},/obj/item/weapon/reagent_containers/hypospray/combat/nanites,/turf/unsimulated/floor{tag = "icon-blue (WEST)"; icon_state = "blue"; dir = 8},/area/space)
+"hh" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health{pixel_x = -2; pixel_y = -1},/obj/item/weapon/defibrillator/combatdefibrillator/loaded,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health{pixel_x = -2; pixel_y = -1},/obj/item/weapon/defibrillator/combatdefibrillator/loaded,/turf/unsimulated/floor{tag = "icon-blue (EAST)"; icon_state = "blue"; dir = 4; heat_capacity = 1},/area/space)
"hi" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space)
"hj" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/ferry)
"hk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac)
-"hl" = (/obj/structure/reagent_dispensers/fueltank,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"hl" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/space)
"hm" = (/turf/unsimulated/wall/fakeglass,/area/centcom/ferry)
"hn" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/simulated/shuttle/plating,/area/space)
"ho" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/shuttle/floor,/area/space)
-"hp" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/weapon/weldingtool/largetank,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hq" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hr" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
+"hp" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/pulse,/obj/item/weapon/shield/riot/tele{pixel_x = 3; pixel_y = -3},/obj/item/weapon/shield/riot/tele{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4; heat_capacity = 1},/area/space)
+"hq" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/glasses/meson,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{tag = "icon-yellow (WEST)"; icon_state = "yellow"; dir = 8},/area/space)
+"hr" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/device/multitool,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd{matter = 200; name = "military rapid-construction-device (RCD)"},/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{tag = "icon-yellow (EAST)"; icon_state = "yellow"; dir = 4; heat_capacity = 1},/area/space)
"hs" = (/turf/unsimulated/wall,/area/centcom/holding)
-"ht" = (/obj/machinery/door/airlock/centcom{name = "ERT Ready Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"ht" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/syringes{pixel_x = -3; pixel_y = -3},/obj/item/weapon/gun/syringe/rapidsyringe,/turf/unsimulated/floor{tag = "icon-blue (WEST)"; icon_state = "blue"; dir = 8},/area/space)
"hu" = (/obj/machinery/door/airlock/centcom{name = "Centcom"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/evac)
"hv" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/simulated/shuttle/floor,/area/space)
"hw" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/space)
@@ -390,13 +390,13 @@
"hz" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/centcom/ferry)
"hA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/centcom/ferry)
"hB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/centcom/ferry)
-"hC" = (/obj/machinery/suit_storage_unit/ertMed,/turf/unsimulated/floor{tag = "icon-blue (WEST)"; icon_state = "blue"; dir = 8},/area/centcom/ferry)
-"hD" = (/obj/structure/rack,/obj/item/clothing/glasses/hud/health,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -2; pixel_y = 4},/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/reagent_containers/hypospray/combat/nanites,/obj/item/weapon/defibrillator/combatdefibrillator/loaded,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hE" = (/obj/structure/rack,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle{pin = /obj/item/device/firing_pin},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hF" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hG" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hH" = (/obj/structure/rack,/obj/item/device/aicard,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hI" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry)
+"hC" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/brute,/turf/unsimulated/floor{tag = "icon-blue (EAST)"; icon_state = "blue"; dir = 4; heat_capacity = 1},/area/space)
+"hD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/box/flashbangs{pixel_x = -4; pixel_y = -4},/obj/item/weapon/storage/box/handcuffs{pixel_x = 3; pixel_y = -3},/obj/item/weapon/storage/box/flashbangs{pixel_x = -4; pixel_y = -4},/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/space)
+"hE" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/security,/obj/item/weapon/melee/baton/loaded,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/hud/security/sunglasses,/obj/item/weapon/storage/belt/security,/obj/item/weapon/melee/baton/loaded,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/hud/security/sunglasses,/turf/unsimulated/floor{tag = "icon-red (EAST)"; icon_state = "red"; dir = 4; heat_capacity = 1},/area/space)
+"hF" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/weapon/storage/box/metalfoam,/obj/item/weapon/stock_parts/cell/high,/turf/unsimulated/floor{tag = "icon-yellow (WEST)"; icon_state = "yellow"; dir = 8},/area/space)
+"hG" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/device/multitool,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd{matter = 90; name = "military rapid-construction-device (RCD)"},/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{tag = "icon-yellow (EAST)"; icon_state = "yellow"; dir = 4; heat_capacity = 1},/area/space)
+"hH" = (/turf/unsimulated/floor{name = "plating"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space)
+"hI" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{icon_state = "swall_f9"},/area/space)
"hJ" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/space)
"hK" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/space)
"hL" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
@@ -404,15 +404,15 @@
"hN" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/space)
"hO" = (/obj/structure/grille,/obj/machinery/door/poddoor/shutters{id = "syndieshutters"; name = "blast shutters"},/obj/structure/window/reinforced/fulltile,/turf/simulated/shuttle/plating,/area/space)
"hP" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/space)
-"hQ" = (/obj/machinery/mech_bay_recharge_port{on = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hR" = (/obj/mecha/medical/odysseus,/turf/unsimulated/floor{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/centcom/ferry)
-"hS" = (/obj/machinery/door/poddoor{name = "Emergency Response Team Armoury"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hT" = (/obj/structure/closet/syndicate/ertEngi,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hU" = (/obj/structure/closet/syndicate/ertMed,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hV" = (/obj/structure/closet/syndicate/ertSec,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hW" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hX" = (/obj/structure/rack,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/obj/item/weapon/stock_parts/cell/high,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"hY" = (/obj/structure/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/weapon/soap/nanotrasen,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"hQ" = (/turf/unsimulated/floor{name = "plating"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space)
+"hR" = (/obj/machinery/door/airlock/centcom{name = "Transport Shuttle"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"hS" = (/obj/machinery/door/airlock/centcom{name = "briefing room"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hT" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -10; tag = "icon-sink (WEST)"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hU" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hV" = (/obj/structure/dresser,/obj/structure/mirror{pixel_x = 0; pixel_y = 30},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hW" = (/obj/structure/closet/secure_closet/ertCom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hX" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"hY" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 5},/obj/item/weapon/pen/blue,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
"hZ" = (/turf/unsimulated/wall,/area/tdome/tdomeobserve)
"ia" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 9},/area/tdome/tdomeobserve)
"ib" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/tdome/tdomeobserve)
@@ -431,8 +431,8 @@
"io" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership)
"ip" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/grass/both,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
"iq" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/tree/pine,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"},/area/syndicate_mothership)
-"ir" = (/obj/machinery/door/airlock/glass_large{name = "Medical Equipment"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"is" = (/obj/machinery/door/airlock/glass_large{name = "Miscellaneous Equipment"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"ir" = (/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"is" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue (EAST)"; icon_state = "darkblue"; dir = 4},/area/centcom/ferry)
"it" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iu" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iv" = (/turf/unsimulated/wall/fakeglass,/area/tdome/tdomeobserve)
@@ -449,17 +449,17 @@
"iG" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/area/syndicate_mothership)
"iH" = (/obj/item/weapon/storage/fancy/crayons,/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"iI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"iJ" = (/obj/structure/lattice,/turf/space,/area/space)
-"iK" = (/obj/structure/table/reinforced,/obj/item/ammo_box/a357,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"iL" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/clothing/glasses/hud/security/night,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"iM" = (/obj/structure/rack,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/belt/security,/obj/item/device/flash/handheld,/obj/item/weapon/grenade/flashbang,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"iN" = (/obj/effect/landmark{name = "Emergencyresponseteam"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/ferry)
-"iO" = (/turf/unsimulated/floor{tag = "icon-bluecorner (EAST)"; icon_state = "bluecorner"; dir = 4},/area/centcom/ferry)
-"iP" = (/turf/unsimulated/floor{tag = "icon-blue (NORTH)"; icon_state = "blue"; dir = 1},/area/centcom/ferry)
-"iQ" = (/turf/unsimulated/floor{tag = "icon-bluecorner (NORTH)"; icon_state = "bluecorner"; dir = 1},/area/centcom/ferry)
-"iR" = (/turf/unsimulated/floor{tag = "icon-neutralcorner (EAST)"; icon_state = "neutralcorner"; dir = 4},/area/centcom/ferry)
-"iS" = (/turf/unsimulated/floor{tag = "icon-neutral (NORTH)"; icon_state = "neutral"; dir = 1},/area/centcom/ferry)
-"iT" = (/turf/unsimulated/floor{tag = "icon-neutralcorner (NORTH)"; icon_state = "neutralcorner"; dir = 1},/area/centcom/ferry)
+"iJ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iK" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{dir = 8; icon_state = "vault"},/area/centcom/ferry)
+"iL" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-darkbrown (EAST)"; icon_state = "darkbrown"; dir = 4},/area/centcom/ferry)
+"iM" = (/obj/machinery/vending/cigarette{products = list(/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate = 7, /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust = 2, /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori = 1, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/lighter/random = 4, /obj/item/weapon/storage/fancy/rollingpapers = 5)},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iN" = (/obj/structure/sign/map/left,/turf/unsimulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
+"iO" = (/obj/structure/sign/map/right,/turf/unsimulated/floor{tag = "icon-light_on"; icon_state = "light_on"},/area/centcom/ferry)
+"iP" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred (EAST)"; icon_state = "darkred"; dir = 4},/area/centcom/ferry)
+"iQ" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iR" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iS" = (/obj/structure/table/wood,/obj/item/weapon/storage/box/drinkingglasses,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"iT" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/gun/syringe/rapidsyringe,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"iU" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iV" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
"iW" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeobserve)
@@ -482,7 +482,7 @@
"jn" = (/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"jo" = (/obj/structure/stool/bed/chair/comfy/teal,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"jp" = (/obj/structure/bookcase,/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/weapon/book/manual/robotics_cyborgs,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/weapon/book/manual/detective,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
-"jq" = (/obj/machinery/door/airlock/centcom{name = "Commander's Room"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
+"jq" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = -5},/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey{pixel_x = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"jr" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/tdome/tdomeobserve)
"js" = (/obj/structure/lattice,/turf/space/transit,/area/wizard_station)
"jt" = (/obj/item/weapon/shard{color = "#008000"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station)
@@ -499,14 +499,12 @@
"jE" = (/mob/living/simple_animal/hostile/retaliate/bat{desc = "A Syndicate experiment in weaponized space carp technology. Its fangs seem to have been intentionally dulled down to prevent accidents."; faction = list("syndicate"); harm_intent_damage = 5; health = 50; icon_dead = "carp_dead"; icon_gib = "carp_gib"; icon_living = "carp"; icon_state = "carp"; name = "Cayenne"; real_name = "Cayenne"; response_disarm = "lightly brushes aside"; response_help = "pets"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jF" = (/obj/machinery/door/airlock/centcom{name = "Study"; opacity = 1; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"jG" = (/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
-"jH" = (/obj/machinery/suit_storage_unit/ertCom,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"jI" = (/obj/structure/closet/syndicate/ertCom,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"jJ" = (/turf/unsimulated/floor{tag = "icon-redcorner"; icon_state = "redcorner"; dir = 2},/area/centcom/ferry)
-"jK" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/ferry)
-"jL" = (/turf/unsimulated/floor{tag = "icon-redcorner (WEST)"; icon_state = "redcorner"; dir = 8},/area/centcom/ferry)
-"jM" = (/turf/unsimulated/floor{tag = "icon-yellowcorner"; icon_state = "yellowcorner"; dir = 2},/area/centcom/ferry)
-"jN" = (/turf/unsimulated/floor{tag = "icon-yellow"; icon_state = "yellow"; dir = 2},/area/centcom/ferry)
-"jO" = (/turf/unsimulated/floor{tag = "icon-yellowcorner (WEST)"; icon_state = "yellowcorner"; dir = 8},/area/centcom/ferry)
+"jH" = (/obj/structure/closet/secure_closet/ertMed,/turf/unsimulated/floor{tag = "icon-darkblue"; icon_state = "darkblue"; dir = 2},/area/centcom/ferry)
+"jI" = (/obj/structure/closet/secure_closet/ertSec,/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/ferry)
+"jJ" = (/obj/structure/closet/secure_closet/ertEngi,/obj/structure/extinguisher_cabinet{pixel_y = -28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry)
+"jK" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"jL" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"jM" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"jP" = (/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/tdome/tdomeobserve)
"jQ" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/tdome/tdomeobserve)
"jR" = (/turf/unsimulated/floor{dir = 10; icon_state = "green"},/area/centcom/evac)
@@ -527,15 +525,12 @@
"kg" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (NORTHWEST)"; icon_state = "podhatch"; dir = 9},/area/syndicate_mothership)
"kh" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"ki" = (/obj/structure/table/wood,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
-"kj" = (/obj/machinery/door/airlock/glass_large{name = "Security Equipment"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"kk" = (/obj/machinery/door/airlock/glass_large{name = "Engineering Equipment"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"kl" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve)
"km" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve)
"kn" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve)
"ko" = (/turf/unsimulated/floor{icon_state = "green"; dir = 6},/area/tdome/tdomeobserve)
"kp" = (/turf/unsimulated/wall/fakedoor{name = "Centcom"},/area/centcom/evac)
"kq" = (/obj/structure/showcase{desc = "A strange machine supposedly from another world. The Wizard Federation has been meddling with it for years."; icon_state = "processor"; name = "byond random number generator"},/turf/unsimulated/floor{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station)
-"kr" = (/obj/item/weapon/gun/energy/pulse_rifle,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
"ks" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"kt" = (/obj/structure/showcase{desc = "A historical figure of great importance to the wizard federation. He spent his long life learning magic, stealing artifacts, and harassing idiots with swords. May he rest forever, Rodney."; icon = 'icons/mob/mob.dmi'; icon_state = "nim"; name = "wizard of yendor showcase"},/turf/unsimulated/floor{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station)
"ku" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
@@ -545,13 +540,6 @@
"ky" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kz" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/drinks/beer{pixel_x = 5; pixel_y = -2; step_x = 0},/obj/item/toy/cards/deck/syndicate{icon_state = "deck_syndicate_full"; pixel_x = -6; pixel_y = 6},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"kA" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (WEST)"; icon_state = "podhatch"; dir = 8},/area/syndicate_mothership)
-"kB" = (/obj/mecha/combat/marauder{operation_req_access = null},/turf/unsimulated/floor{icon_state = "recharge_floor"; name = "mech bay recharge floor"; tag = "icon-recharge_floor"},/area/centcom/ferry)
-"kC" = (/obj/machinery/door/poddoor{name = "Death Squad Equipment Room"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"kD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"kE" = (/obj/machinery/suit_storage_unit/ertSec,/turf/unsimulated/floor{dir = 8; icon_state = "red"},/area/centcom/ferry)
-"kF" = (/obj/structure/rack,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/belt/security,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot/tele,/obj/item/device/flash/handheld,/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine/loyalpin,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"kG" = (/obj/machinery/suit_storage_unit/ertEngi,/turf/unsimulated/floor{tag = "icon-yellow (WEST)"; icon_state = "yellow"; dir = 8},/area/centcom/ferry)
-"kH" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/glasses/meson,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/device/multitool,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/rcd{matter = 200; name = "military rapid-construction-device (RCD)"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"kI" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 6; icon_state = "fakewindows2"},/area/wizard_station)
"kJ" = (/obj/effect/forcefield,/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Bridge"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"kK" = (/turf/unsimulated/wall/normal{tag = "icon-uranium6"; icon_state = "uranium6"},/area/wizard_station)
@@ -559,7 +547,6 @@
"kM" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership)
"kN" = (/turf/unsimulated/floor,/area/syndicate_mothership)
"kO" = (/obj/machinery/door/poddoor/shutters{id = "nukeop_ready"; name = "shuttle dock"},/turf/unsimulated/floor,/area/syndicate_mothership)
-"kP" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/glasses/meson,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/device/multitool,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/rcd{matter = 90; name = "military rapid-construction-device (RCD)"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"kQ" = (/turf/space,/area/tdome/tdomeobserve)
"kR" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-cultdamage6"; icon_state = "cultdamage6"},/area/wizard_station)
"kS" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
@@ -572,11 +559,6 @@
"kZ" = (/obj/machinery/computer/telecrystals/uplinker,/turf/unsimulated/floor{tag = "icon-podhatch (SOUTHWEST)"; icon_state = "podhatch"; dir = 10},/area/syndicate_mothership)
"la" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"lb" = (/obj/structure/toilet{pixel_y = 8},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/machinery/door/window{name = "Tactical Toilet"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"lc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/weapon/weldingtool/largetank,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"ld" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"le" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"lf" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/hud/security/sunglasses,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
-"lg" = (/obj/structure/table/reinforced,/obj/item/weapon/stock_parts/cell/high,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"lh" = (/turf/simulated/shuttle/wall{icon_state = "swall0"; dir = 2},/area/wizard_station)
"li" = (/turf/unsimulated/wall/fakedoor{name = "Squad 4 Pod"},/area/wizard_station)
"lj" = (/turf/simulated/shuttle/wall{icon_state = "swall4"; dir = 2},/area/wizard_station)
@@ -648,7 +630,6 @@
"mx" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"my" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/bush,/turf/unsimulated/floor{tag = "icon-gravsnow_corner (NORTH)"; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 1},/area/syndicate_mothership)
"mz" = (/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
-"mA" = (/obj/machinery/door/airlock/centcom{name = "Deathsquad Equipment Room"; opacity = 1; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/ferry)
"mB" = (/turf/unsimulated/wall,/area/tdome/arena)
"mC" = (/obj/machinery/igniter,/turf/simulated/floor/plasteel,/area/tdome/arena)
"mD" = (/turf/simulated/floor/plasteel,/area/tdome/arena)
@@ -671,8 +652,6 @@
"mU" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mV" = (/obj/structure/table,/obj/item/weapon/weldingtool/largetank{pixel_y = 3},/obj/item/device/multitool,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"mW" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
-"mX" = (/obj/structure/rack,/obj/item/clothing/suit/space/deathsquad,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/clothing/mask/gas/sechailer/swat,/obj/item/clothing/head/helmet/space/deathsquad,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"mY" = (/obj/structure/rack,/obj/item/clothing/suit/space/deathsquad,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/clothing/mask/gas/sechailer/swat,/obj/item/clothing/head/helmet/space/deathsquad,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
"mZ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/sneakers/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"na" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"nb" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
@@ -733,13 +712,10 @@
"oe" = (/turf/unsimulated/floor{tag = "icon-cultdamage4"; icon_state = "cultdamage4"},/area/wizard_station)
"of" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"og" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
-"oh" = (/obj/structure/rack,/obj/item/weapon/c4,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/pinpointer,/obj/item/weapon/shield/energy,/obj/item/clothing/glasses/thermal,/obj/item/weapon/tank/emergency_oxygen,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/storage/backpack/security,/turf/unsimulated/floor{dir = 4; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
-"oi" = (/obj/structure/rack,/obj/item/weapon/c4,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/pinpointer,/obj/item/weapon/shield/energy,/obj/item/clothing/glasses/thermal,/obj/item/weapon/tank/emergency_oxygen,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/storage/backpack/security,/turf/unsimulated/floor{dir = 8; heat_capacity = 1; icon_state = "warning"},/area/centcom/ferry)
"oj" = (/obj/structure/door_assembly{anchored = 1; icon_state = "door_as_uranium1"; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ok" = (/turf/unsimulated/wall/normal{tag = "icon-uranium15"; icon_state = "uranium15"},/area/wizard_station)
"ol" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Dooruranium.dmi'; name = "Corridor A"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"om" = (/obj/structure/table,/obj/item/robot_parts/r_arm,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
-"on" = (/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/space)
"oo" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgicaldrill,/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
"op" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/space)
"oq" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space)
@@ -966,13 +942,13 @@ abababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcWcJdIdfcOdJdKcDcXabababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcBdzcVdLcVdIcBababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdMdNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcBdOdPdQdRdScBababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdTdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcWdsdsdsdsdscXababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdUdGdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdVdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdWdNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdGdHdHdHdHdHdGdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdXeBdHdHdHeGeadwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwebecedededeceedwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwefegegegehdwdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababcWdsdsdsdsdscXabababababababababababaDfRfDgnfTgpgpgpgpgpgpgCgBgNgpgpgOgpabababababababababdwdGdHdHdHdHdUdGdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgPgOgOgOgQgQgQgQgQgQgQgOgOgOgOgOgOgRabababababababababdwdGdHdHdHdHdHdVdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaDgpgSgSgpgpgpgYgYgpgpgpgZgZgpgpgBhbabababababababababdwdGdHdHdHdHdHdWdNababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaDaDhdgpaDaDaDhegpaDaDaDhfgpaDaDaDaDabababababababababdwdGdHdHdHdHdHdGdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaDhggpgphhaDhlgpgphpaDhqgpgphraDabababababababababababdwdXeBdHdHdHeGeadwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaDhtgpgphCaDhDgpgphEaDhFgpgphGaDabababababababababababdwebecedededeceedwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDabababababababababababdwdwefegegegehdwdwababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdwdwdwdwdwdwdwabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -986,40 +962,40 @@ abababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeiePeQeRePeieoekeJeJeJeJekabababdGeSeTeUeVdHeNeWdGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababeieXeYeZePeieoekeJfafbfcekababdAfddBdBfedBfffgdBfddCabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhababeiePeQfifjeieoekfkflfmfnekababdGfofofoezfpdHfqfrfsezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhabababababababababababababababababababfhftfufvfhaDeieifweieieieieiekeJeJeJeJfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfDfDfDfhfhababababababababababababababababababfhfEfFfFfhfGfHemfIfIfIfIfHfJekeJeJeJeJfKfLfKfMfBfNfNezfOfPfQdHfqezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfRfSfSfSfTfhababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfUfhfhfJfVemfWfXfYfIfVfJekfxfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfRfSfSfSfTfhababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcgdfSgefhfJfVgfemememggfVfJekghgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababfhgnfSfSfSgofhababababfhgbgpdBdBgqdBdBdBezdBdBgrgsgtgdgugefhfJfVexemememeygvfJekghgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzabababababababababababababababfhfhfhfhgAgBgAfhfhfhfhababfhgCgaeNgDgEgEgEgEgEgEgEgqgFgGgdgugefhfJgvexemememeseieQekgHgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzabababababababababababababababfhgMgNgOfSfSfSgPgQgRfhababfhgCgSdHdHdHdHdHdHdHdHdHgTgUgVgdgugWfhgAfherememememememgigigigigjgXababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzabababababababababababababababgAfSfSgYfSfSfSgdfSfSfhababfhgCgZeDeDeDeDeDeDeDeDeDgqgFhagdgufShbfSfSemememememememgigigigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzabababababababababababababababfhhdhegYfSfSfSgdhfhgfhababfhgbhhdBdBgqdBdBdBezdBdBhigsgtgdguhjfhgAfhgfemememggeieQekhkgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzabababababababababababababababfhfhfhfhfSfShlfhfhfhfhababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmgdfSgefhfJfHevemememewfHfJekghgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzabababababababababababababababfhhphqhrfSfSfSfhabababababhshshshshshshshshshshshshshshshshtfhhsfJfVevemememewfVfJekfxfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzabababababababababababababababgAfSfSgYfSfSfSfhhzhAhAhBfhfhfhfhfhfhfhhCfSfShDfhhEhFhGhHfhhIfhhsfJgvevemememewgvfJekgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababfhhQhRgYfSfSfSfSfSfSfSfShSfShThUhVhWfhhCfSfShDfhhXfSfShYfhhIfhhshZhZiaibicidiehZhZekgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfSfSfSfSfSfhfhirfSfhfhfhisfSfhfhhIfhhsitiuiviwixiyiviuiuekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzababababababababababababababiJabababiJababfhiKiLiMgAfSiNiNiNfSfSiOiPiPiQfSiRiSiSiTfShIfhhsiuiUiViwixiyiViWiuekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzababababababababababababababiJabababiJababgAfSfSfSjqfSiNiNiNfShIhIhIhIhIhIhIhIhIhIhIhIfhhsjriujriwixiyjriujrekgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzababababababababababababababiJabababiJababfhjHfSjIgAfSfSiNfSfSfSjJjKjKjLfSjMjNjNjOfSfSfhhsjPiuiuiwixiyiuiujQekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfSfSfSfSfSfhfhkjfSfhfhfhkkfSfhfhfhfhhsklkmkmiwixiyknknkoekekkpekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqkrjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababfhhdkBgYfSfSfSfSfSfSfSfSkCfShThUhVkDfhkEfSfSkFfhkGfSfSkHfhababhshZhZhZhZixhZhZhZhZekeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzababababababababababababababgAfSfSgYfSfSfSfhhzhAhAhBfhfhfhfhfhfhfhkEfSfSkFfhkGfSfSkPfhababababababhZixhZkQkQkQeoeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSkTjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababfhlcldlefSfSfSfhababababababababababfhfSlflffSfhfSlglgfSfhhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaaaalhliljlklllmjvlnjsaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihlolphNkuihkvhNhNnrlrhPlsgzltlulvlulujijijilwlxlxlygzabababababababababababababfhfhfhfhfSfShlfhababababababababababfhfhfhfhfhfhfhfhfhfhhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaaaalBlClDlElFlljvlGlHlIjsjsaaaaaaaaaaaaaaaaababababababgzlJgIhNkUihihlKhNihihihhNihihihhNjBgzlLlMlLlLlNjijijigzlOlPlygzabababababababababababababfhhdkBgYfSfSfSfhabababababababababababababababababababablQlzlzlzlRlzlzlzlzlzlzlzlRlzlzlzlQababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaajsaaljlSlSlTlljvlUlGlIaalVlWaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihlXihihihlYihihihhNiGgzgzkglZmambgzmcjigzgzgzgzgzabababababababababababababgAfSfSgYfSfSfSfhababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaalnjsaaaajsmdmejWmfjWlnjsjsaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihmgihihihmhihihmihNmjmjlsgzgzgzgzgzmkmkmlmmmnmogzabababababababababababababfhlcldlefSfSfSfhababababababababababababababababababababhZidmpmpmpmpmpmpmpmpmpmpmpmpmpibhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaakKmqmrmsmtmumtmtmqmvmsmtmtmumtmtaajsaaaaaaaaaaababababababgzgIhMhNhNhNhNhNhNmwihihhNhNhNhNhNhNhPmxmxmxmylsgzmzmzmzmzmzmzgzabababababababababababababfhfhfhfhgAmAgAfhfhabababababababababababmBmBmBmBmBmBmBmBmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBmBmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaamEmFjvjvmFmEmGmHjvjvjvmImJmEmKmLlnmMjsjsaaaaaaababababababgzgIhNmNmNmOmPmQhNihihihhNmRmSmTmUmVhNgIgJgIgIgLjmmzmzmzmzmzmWgzabababababababababababababababfhmXfSfSfSmYfhabababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaanhnijvjvninhmMmMjvjvjvjvnjnhnknllSlSnmaaaaaaaaababababababgzgIhNihihihloihnnihihihnoihloihlonphNgIhcgKgJhcgznqnqnqnqnqlqgzabababababababababababababababfhmXfSfSfSmYfhabababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaanunvjvlGjvnwlUlGjvnxjvjvnynunznAnBnCnDnEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababfhmXfSfSfSmYfhabababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaanMnijvjWlUnNjWjvjvnOjvjvjvnMnPnQnmnRlhaaaaaaaaababababababgzgIhNnFihihnSnThNnUnVnUhNnWnXihihihhNgIgKgIhciGgzababababababababababababababababababababababfhfhgAfSgAfhfhabababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDnJnYnJmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaajdnZjvjvnZjdoajvlGjWjvjvoajdobocodoeaaaaaaaaaaababababababgzgIhNihihihhNhNhNofogihhNhNhNihihihhNgIgIgJgIiGgzababababababababababababababababababababababfhohfSfSfSoifhabababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaajwmqojmsmtokmtmqkIolkImsmtokmtmqjsjsjsaaaaaaaaababababababgzgIhNomonoohNgIhNopopophNgIhNiloqorhNgIgIgIgIiGgzababababababababababababababababababababababfhohfSfSfSoifhabababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaamdlGaajsaajsoslmmdaaaajsaaaaaaaajsaaaaaaaaababababababgzgIhNopopophNgIjyotegoujAgIhNopopophNgIgIgIgIiGgzababababababababababababababababababababababfhohfSfSfSoifhabababababababababababmBmBmBovovovovovmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBovovovovovmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababaaaaaaaaaaaaaaaaaajsjsaaowlGaaoxoymdjsaalUaaaaaaaaaaaaaaaaaaababababababgzgIjyotegoujAgIgIgIgIgIgIgIjyotegoujAgIgIgIgIiGgzababababababababababababababababababababababfhfhfhfhfhfhfhabababababababababababababmBozozozozozmBoAoBoBoBoBoBoBoBoBoBoBoBoBoBoCmBoDoDoDoDoDmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhftfufvfhaDeieifweieieieieiekeJeJeJeJfxfyfzdGfAfBfBfCdHdHdHdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfEfFfFfhfGfHemfIfIfIfIfHfJekeJeJeJeJfKfLfKfMfBfNfNezfOfPfQdHfqezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfUfhfhfJfVemfWfXfYfIfVfJekfxfzfZfxfyfyfzdXdBdBdBgafQfQfQdHfqdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbgcgdfSgefhfJfVgfemememggfVfJekghgigigjfKfLfKgkdHgldHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababfhgbhHdBdBgqdBdBdBezdBdBgrgsgtgdgugefhfJfVexemememeygvfJekghgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababfhhHhIeNgDgEgEgEgEgEgEgEgqgFgGgdgugefhfJgvexemememeseieQekgHgigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgJgIgIgIgKgLgIgIgIgKgIgIgIgIgIgIgKgIgIgzababababababababababababababababababababababababababababfhgodHdHdHdHdHdHdHdHdHdHgTgUgVgdgugWfhgAfherememememememgigigigigjgXababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgJgIgIgIgIgIgIgIgIgIgIgIgKgIgIgIgIgIgKgIgIgIgIgIgzababababababababababababababababababababababababababababfhhQeBgMgMeDeDeDeDeDeDeDgqgFhagdgufShRfSfSemememememememgigigigigjekababezfPdHgwgxdHgwgxdHgyezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhcgIgIgIgIgIgJgIgIgLgKgIgIgKgIgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhgbhQdBdBgqdBdBdBezdBdBhigsgtgdguhjfhgAfhgfemememggeieQekhkgigigjfxfyfzdGfPdHgwgxdHgwgxdHgydGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgKgLgIgIgKgIgLgzababababababababababababababababababababababababababababfhgbgbgbgbgbgbgbgbgbgbgbgbgbhmgdfSgefhfJfHevemememewfHfJekghgigigjfKfLfKhndHhodHdHdHdHdHdHgmdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJgIgIgIgIgIgLgIgKgLgIgKgIgzababababababababababababababababababababababababababababfhfhfhfhfhfhfhhzhAhAhBfhfhfhfhfhhSfhfhfJfVevemememewfVfJekfxfzhufxfyfyfzdXdBdBhvdBhwezhxezezeaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIhyhyhyhyhyhyhygIgIgIgIgIgIgIgKgIgIhcgLgIgIgIgzabababababababababababababababababababababababababababababababfhhThVhUhUhUhUhUhUhWhYhXhUhUhUfhfJgvevemememewgvfJekgigigigjfKfLfKhnhJhJhJhKdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababababababababababababababababababfhhUhUhUhUirirhUhUhUhUhUhUhUisfhhZhZiaibicidiehZhZekgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKhUhUhUhUhUhUiLfhitiuiviwixiyiviuiuekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababfhiMhUiriKiNiOiKirhUhUhUhUhUiPfhiuiUiViwixiyiViWiuekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUiriKiKiKiKhUhUhUhUhUhUiRfhjriujriwixiyjriujrekgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzabababababababababababababababababababababababababababababfhiShUhUhUirirhUhUhUhUhUhUhUiTfhjPiuiuiwixiyiuiujQekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUjHjJjIjKiTjLfhklkmkmiwixiyknknkoekekkpekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababababababababababababababababababfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhfhhZhZhZhZixhZhZhZhZekeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababababababababababhZixhZkQkQkQeoeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSkTjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababababababababababababababababababababababababababababababkQhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaaaalhliljlklllmjvlnjsaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihlolphNkuihkvhNhNnrlrhPlsgzltlulvlulujijijilwlxlxlygzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaaaalBlClDlElFlljvlGlHlIjsjsaaaaaaaaaaaaaaaaababababababgzlJgIhNkUihihlKhNihihihhNihihihhNjBgzlLlMlLlLlNjijijigzlOlPlygzababababababababababababababababababababababababababababababababababababababababablQlzlzlzlRlzlzlzlzlzlzlzlRlzlzlzlQababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaajsaaljlSlSlTlljvlUlGlIaalVlWaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihlXihihihlYihihihhNiGgzgzkglZmambgzmcjigzgzgzgzgzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaalnjsaaaajsmdmejWmfjWlnjsjsaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihmgihihihmhihihmihNmjmjlsgzgzgzgzgzmkmkmlmmmnmogzabababababababababababababababababababababababababababababababababababababababababhZidmpmpmpmpmpmpmpmpmpmpmpmpmpibhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaakKmqmrmsmtmumtmtmqmvmsmtmtmumtmtaajsaaaaaaaaaaababababababgzgIhMhNhNhNhNhNhNmwihihhNhNhNhNhNhNhPmxmxmxmylsgzmzmzmzmzmzmzgzabababababababababababababababababababababababababababababababababmBmBmBmBmBmBmBmBmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBmBmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaamEmFjvjvmFmEmGmHjvjvjvmImJmEmKmLlnmMjsjsaaaaaaababababababgzgIhNmNmNmOmPmQhNihihihhNmRmSmTmUmVhNgIgJgIgIgLjmmzmzmzmzmzmWgzabababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaanhnijvjvninhmMmMjvjvjvjvnjnhnknllSlSnmaaaaaaaaababababababgzgIhNihihihloihnnihihihnoihloihlonphNgIhcgKgJhcgznqnqnqnqnqlqgzabababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaanunvjvlGjvnwlUlGjvnxjvjvnynunznAnBnCnDnEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaanMnijvjWlUnNjWjvjvnOjvjvjvnMnPnQnmnRlhaaaaaaaaababababababgzgIhNnFihihnSnThNnUnVnUhNnWnXihihihhNgIgKgIhciGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDnJnYnJmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaajdnZjvjvnZjdoajvlGjWjvjvoajdobocodoeaaaaaaaaaaababababababgzgIhNihihihhNhNhNofogihhNhNhNihihihhNgIgIgJgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaajwmqojmsmtokmtmqkIolkImsmtokmtmqjsjsjsaaaaaaaaababababababgzgIhNomjMoohNgIhNopopophNgIhNiloqorhNgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaamdlGaajsaajsoslmmdaaaajsaaaaaaaajsaaaaaaaaababababababgzgIhNopopophNgIjyotegoujAgIhNopopophNgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababmBmBmBovovovovovmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBovovovovovmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababaaaaaaaaaaaaaaaaaajsjsaaowlGaaoxoymdjsaalUaaaaaaaaaaaaaaaaaaababababababgzgIjyotegoujAgIgIgIgIgIgIgIjyotegoujAgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababababmBozozozozozmBoAoBoBoBoBoBoBoBoBoBoBoBoBoBoCmBoDoDoDoDoDmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjsaaoElGoFaaaaaajsaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababababmBmBmBmBmBmBmBoGoHoHoHoHoHoIoJoKoHoHoHoHoHoGmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsmumqoLmsmujsaajsjsaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababababababababababababababababababababababoMoGoGoGoNoGoOoOoOoOoOoGoNoGoGoGoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaamEoPoQoRmEownllFoSoTjsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababoMoMoUoMoMoMoMoVoWoXoMoMoMoMoUoMoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
diff --git a/_maps/map_files/generic/z3.dmm b/_maps/map_files/generic/z3.dmm
index 8f2722e3b71..745e704fc30 100644
--- a/_maps/map_files/generic/z3.dmm
+++ b/_maps/map_files/generic/z3.dmm
@@ -34,7 +34,7 @@
"aH" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/derelict/ship)
"aI" = (/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"aJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f14"; icon_state = "swall_f14"},/area/space)
-"aK" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
+"aK" = (/obj/structure/rack,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"aL" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"aM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_f11"; icon_state = "swall_f11"},/area/space)
"aN" = (/obj/structure/lattice,/turf/space,/area/space)
@@ -56,7 +56,7 @@
"bd" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/space)
"be" = (/obj/structure/stool/bed/chair{dir = 4},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"bf" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
-"bg" = (/obj/structure/table,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
+"bg" = (/obj/structure/table,/obj/item/weapon/tank/internals/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"bh" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/space)
"bi" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/derelict/ship)
"bj" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/derelict/ship)
diff --git a/_maps/map_files/generic/z5.dmm b/_maps/map_files/generic/z5.dmm
index 6d9fc6f20dd..201c0a384ca 100644
--- a/_maps/map_files/generic/z5.dmm
+++ b/_maps/map_files/generic/z5.dmm
@@ -210,7 +210,7 @@
"eb" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp)
"ec" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=1-Storage"; location = "Sleeper"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp)
"ed" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp)
-"ee" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
+"ee" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/closet/crate/internals,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"ef" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"eg" = (/obj/machinery/bot/secbot/beepsky{desc = "Powered by tears and swet of laborer."; name = "Prison Ofitser"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=2-NMine"; location = "1-Storage"},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
"eh" = (/obj/structure/plasticflaps/mining,/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 71a290ec08f..9945a13fcad 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -37,12 +37,12 @@
return t
//Removes a few problematic characters
-/proc/sanitize_simple(var/t,var/list/repl_chars = list("\n"="#","\t"="#","�"="�"))
+/proc/sanitize_simple(var/t,var/list/repl_chars = list("\n"="#","\t"="#"))
for(var/char in repl_chars)
var/index = findtext(t, char)
while(index)
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+1)
- index = findtext(t, char)
+ index = findtext(t, char, index+1)
return t
//Runs byond's sanitization proc along-side sanitize_simple
@@ -147,32 +147,63 @@
return t_out
-//this proc strips html properly, but it's not lazy like the other procs.
-//this means that it doesn't just remove < and > and call it a day. seriously, who the fuck thought that would be useful.
+//this proc strips html properly, this means that it removes everything between < and >, and between "http" and "://"
//also limit the size of the input, if specified to
/proc/strip_html_properly(var/input,var/max_length=MAX_MESSAGE_LEN)
if(!input)
return
- var/opentag = 1 //These store the position of < and > respectively.
- var/closetag = 1
- while(1)
- opentag = findtext(input, "<")
- closetag = findtext(input, ">")
- if(closetag && opentag)
- if(closetag < opentag)
- input = copytext(input, (closetag + 1))
- else
- input = copytext(input, 1, opentag) + copytext(input, (closetag + 1))
- else if(closetag || opentag)
- if(opentag)
- input = copytext(input, 1, opentag)
- else
- input = copytext(input, (closetag + 1))
- else
- break
+
if(max_length)
input = copytext(input,1,max_length)
- return input
+
+ var/sanitized_output
+ var/next_html_tag = findtext(input, "<")
+ var/next_http = findtext(input, "http", 1, next_html_tag)
+
+ //the opening and closing of the expression to skip, e.g '<' and '>'
+ var/opening = non_zero_min(next_html_tag, next_http)
+ var/closing
+
+ sanitized_output = copytext(input, 1, opening)
+
+ while(next_html_tag || next_http)
+
+ //we treat < ... >
+ if(opening == next_html_tag)
+ closing = findtext(input, ">", opening + 1)
+ if(closing)
+ next_html_tag = findtext(input, "<", closing)
+ next_http = findtext(input, "http", closing, next_html_tag)
+ else //no matching ">"
+ next_html_tag = 0
+
+ //we treat "http(s)://"
+ else
+ closing = findtext(input, "://", opening + 1)
+ if(closing)
+ closing += 2 //skip these extra //
+ next_http = findtext(input, "http", closing)
+ next_html_tag = findtext(input, "<", closing, next_http)
+ else //no matching "://"
+ next_http = 0
+
+ //check if we've something to skip
+ if(closing)
+ opening = non_zero_min(next_html_tag, next_http)
+ sanitized_output += copytext(input, closing + 1, opening)
+
+ sanitized_output += copytext(input, opening) //don't forget the remaining text
+
+ return sanitized_output
+
+//strip_html_properly helper proc that returns the smallest non null of two numbers
+//or 0 if they're both null (needed because of findtext returning 0 when a value is not present)
+/proc/non_zero_min(var/a, var/b)
+ if(!a)
+ return b
+ if(!b)
+ return a
+ return (a < b ? a : b)
/*
* Text searches
diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index fe655216354..e8512549c1c 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1,4 +1,4 @@
-var/global/obj/effect/datacore/data_core = null
+var/global/datum/datacore/data_core = null
//var/global/defer_powernet_rebuild = 0 // true if net rebuild will be called manually after an event
//Noble idea, but doing this made GC fail. The gains from waiting on deffering are lost by using del()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 7225f85733b..e23a1e42479 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -133,29 +133,29 @@
C << "You are not wearing a mask."
return 1
else
- if(istype(C.l_hand, /obj/item/weapon/tank))
+ if(istype(C.l_hand, /obj/item/weapon/tank/internals))
C << "You are now running on internals from the [C.l_hand] on your left hand."
C.internal = C.l_hand
- else if(istype(C.r_hand, /obj/item/weapon/tank))
+ else if(istype(C.r_hand, /obj/item/weapon/tank/internals))
C << "You are now running on internals from the [C.r_hand] on your right hand."
C.internal = C.r_hand
else if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(istype(H.s_store, /obj/item/weapon/tank))
+ if(istype(H.s_store, /obj/item/weapon/tank/internals))
H << "You are now running on internals from the [H.s_store] on your [H.wear_suit]."
H.internal = H.s_store
- else if(istype(H.belt, /obj/item/weapon/tank))
+ else if(istype(H.belt, /obj/item/weapon/tank/internals))
H << "You are now running on internals from the [H.belt] on your belt."
H.internal = H.belt
- else if(istype(H.l_store, /obj/item/weapon/tank))
+ else if(istype(H.l_store, /obj/item/weapon/tank/internals))
H << "You are now running on internals from the [H.l_store] in your left pocket."
H.internal = H.l_store
- else if(istype(H.r_store, /obj/item/weapon/tank))
+ else if(istype(H.r_store, /obj/item/weapon/tank/internals))
H << "You are now running on internals from the [H.r_store] in your right pocket."
H.internal = H.r_store
//Seperate so CO2 jetpacks are a little less cumbersome.
- if(!C.internal && istype(C.back, /obj/item/weapon/tank))
+ if(!C.internal && istype(C.back, /obj/item/weapon/tank/internals))
C << "You are now running on internals from the [C.back] on your back."
C.internal = C.back
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 690453df1e6..ec70b9aebe2 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -175,6 +175,10 @@ var/const/tk_maxrange = 15
overlays += icon(focus.icon,focus.icon_state)
return
+obj/item/tk_grab/suicide_act(mob/user)
+ user.visible_message("[user] is using \his telekinesis to choke \himself! It looks like \he's trying to commit suicide.")
+ return (OXYLOSS)
+
/*Not quite done likely needs to use something thats not get_step_to
/obj/item/tk_grab/proc/check_path()
var/turf/ref = get_turf(src.loc)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index e04adb83d04..4014d4eb0eb 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -1,6 +1,5 @@
-/obj/effect/datacore
- name = "datacore"
+/datum/datacore
var/medical[] = list()
var/medicalPrintCount = 0
var/general[] = list()
@@ -25,7 +24,7 @@
var/time = ""
var/dataId = 0
-/obj/effect/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "")
+/datum/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "")
var/datum/data/crime/c = new /datum/data/crime
c.crimeName = cname
c.crimeDetails = cdetails
@@ -34,14 +33,14 @@
c.dataId = ++securityCrimeCounter
return c
-/obj/effect/datacore/proc/addMinorCrime(id = "", var/datum/data/crime/crime)
+/datum/datacore/proc/addMinorCrime(id = "", var/datum/data/crime/crime)
for(var/datum/data/record/R in security)
if(R.fields["id"] == id)
var/list/crimes = R.fields["mi_crim"]
crimes |= crime
return
-/obj/effect/datacore/proc/removeMinorCrime(id, cDataId)
+/datum/datacore/proc/removeMinorCrime(id, cDataId)
for(var/datum/data/record/R in security)
if(R.fields["id"] == id)
var/list/crimes = R.fields["mi_crim"]
@@ -50,7 +49,7 @@
crimes -= crime
return
-/obj/effect/datacore/proc/removeMajorCrime(id, cDataId)
+/datum/datacore/proc/removeMajorCrime(id, cDataId)
for(var/datum/data/record/R in security)
if(R.fields["id"] == id)
var/list/crimes = R.fields["ma_crim"]
@@ -59,14 +58,14 @@
crimes -= crime
return
-/obj/effect/datacore/proc/addMajorCrime(id = "", var/datum/data/crime/crime)
+/datum/datacore/proc/addMajorCrime(id = "", var/datum/data/crime/crime)
for(var/datum/data/record/R in security)
if(R.fields["id"] == id)
var/list/crimes = R.fields["ma_crim"]
crimes |= crime
return
-/obj/effect/datacore/proc/manifest(var/nosleep = 0)
+/datum/datacore/proc/manifest(var/nosleep = 0)
spawn()
if(!nosleep)
sleep(40)
@@ -74,12 +73,12 @@
manifest_inject(H)
return
-/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
+/datum/datacore/proc/manifest_modify(var/name, var/assignment)
var/datum/data/record/foundrecord = find_record("name", name, data_core.general)
if(foundrecord)
foundrecord.fields["rank"] = assignment
-/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
+/datum/datacore/proc/get_manifest(monochrome, OOC)
var/list/heads = list()
var/list/sec = list()
var/list/eng = list()
@@ -135,49 +134,49 @@
misc[name] = rank
if(heads.len > 0)
dat += "
| Heads |
"
- for(name in heads)
+ for(var/name in heads)
dat += "| [name] | [heads[name]] |
"
even = !even
if(sec.len > 0)
dat += "| Security |
"
- for(name in sec)
+ for(var/name in sec)
dat += "| [name] | [sec[name]] |
"
even = !even
if(eng.len > 0)
dat += "| Engineering |
"
- for(name in eng)
+ for(var/name in eng)
dat += "| [name] | [eng[name]] |
"
even = !even
if(med.len > 0)
dat += "| Medical |
"
- for(name in med)
+ for(var/name in med)
dat += "| [name] | [med[name]] |
"
even = !even
if(sci.len > 0)
dat += "| Science |
"
- for(name in sci)
+ for(var/name in sci)
dat += "| [name] | [sci[name]] |
"
even = !even
if(sup.len > 0)
dat += "| Supply |
"
- for(name in sup)
+ for(var/name in sup)
dat += "| [name] | [sup[name]] |
"
even = !even
if(civ.len > 0)
dat += "| Civilian |
"
- for(name in civ)
+ for(var/name in civ)
dat += "| [name] | [civ[name]] |
"
even = !even
// in case somebody is insane and added them to the manifest, why not
if(bot.len > 0)
dat += "| Silicon |
"
- for(name in bot)
+ for(var/name in bot)
dat += "| [name] | [bot[name]] |
"
even = !even
// misc guys
if(misc.len > 0)
dat += "| Miscellaneous |
"
- for(name in misc)
+ for(var/name in misc)
dat += "| [name] | [misc[name]] |
"
even = !even
@@ -188,7 +187,7 @@
var/record_id_num = 1001
-/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
+/datum/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(H.mind && (H.mind.assigned_role != "MODE"))
var/assignment
if(H.mind.assigned_role)
@@ -199,6 +198,11 @@ var/record_id_num = 1001
assignment = "Unassigned"
var/id = num2hex(record_id_num++,6)
+ var/image = get_id_photo(H)
+ var/obj/item/weapon/photo/photo_front = new()
+ var/obj/item/weapon/photo/photo_side = new()
+ photo_front.photocreate(null, icon(image, dir = SOUTH))
+ photo_side.photocreate(null, icon(image, dir = WEST))
//These records should ~really~ be merged or something
//General Record
@@ -207,10 +211,14 @@ var/record_id_num = 1001
G.fields["name"] = H.real_name
G.fields["rank"] = assignment
G.fields["age"] = H.age
+ if(config.mutant_races)
+ G.fields["species"] = H.dna.species.name
G.fields["fingerprint"] = md5(H.dna.uni_identity)
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["sex"] = H.gender
+ G.fields["photo_front"] = photo_front
+ G.fields["photo_side"] = photo_side
general += G
//Medical Record
@@ -251,7 +259,166 @@ var/record_id_num = 1001
L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.struc_enzymes
L.fields["identity"] = H.dna.uni_identity
- L.fields["image"] = getFlatIcon(H) //This is god-awful
+ L.fields["image"] = image
locked += L
return
+/datum/datacore/proc/get_id_photo(var/mob/living/carbon/human/H)
+ var/icon/photo = null
+ var/g = (H.gender == FEMALE) ? "f" : "m"
+ if(!config.mutant_races || H.dna.species.use_skintones)
+ photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]_s")
+ else
+ photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]_s")
+ photo.Blend("#[H.dna.mutant_color]", ICON_MULTIPLY)
+
+ var/icon/eyes_s
+ if(EYECOLOR in H.dna.species.specflags)
+ eyes_s = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]_s")
+ eyes_s.Blend("#[H.eye_color]", ICON_MULTIPLY)
+
+ var/datum/sprite_accessory/S
+ S = hair_styles_list[H.hair_style]
+ if(S && (HAIR in H.dna.species.specflags))
+ var/icon/hair_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s")
+ hair_s.Blend("#[H.hair_color]", ICON_MULTIPLY)
+ eyes_s.Blend(hair_s, ICON_OVERLAY)
+
+ S = facial_hair_styles_list[H.facial_hair_style]
+ if(S && (FACEHAIR in H.dna.species.specflags))
+ var/icon/facial_s = icon("icon" = S.icon, "icon_state" = "[S.icon_state]_s")
+ facial_s.Blend("#[H.facial_hair_color]", ICON_MULTIPLY)
+ eyes_s.Blend(facial_s, ICON_OVERLAY)
+
+ if(eyes_s)
+ photo.Blend(eyes_s, ICON_OVERLAY)
+
+ var/icon/clothes_s = null
+ switch(H.mind.assigned_role)
+ if("Assistant")
+ clothes_s = icon('icons/mob/uniform.dmi', "grey_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Scientist")
+ clothes_s = icon('icons/mob/uniform.dmi', "toxinswhite_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_tox"), ICON_OVERLAY)
+ if("Station Engineer")
+ clothes_s = icon('icons/mob/uniform.dmi', "engine_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Security Officer")
+ clothes_s = icon('icons/mob/uniform.dmi', "security_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
+ if("Medical Doctor")
+ clothes_s = icon('icons/mob/uniform.dmi', "medical_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
+ if("Cargo Technician")
+ clothes_s = icon('icons/mob/uniform.dmi', "cargo_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Shaft Miner")
+ clothes_s = icon('icons/mob/uniform.dmi', "miner_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Atmospheric Technician")
+ clothes_s = icon('icons/mob/uniform.dmi', "atmos_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Botanist")
+ clothes_s = icon('icons/mob/uniform.dmi', "hydroponics_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY)
+ if("Chemist")
+ clothes_s = icon('icons/mob/uniform.dmi', "chemistrywhite_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_chem"), ICON_OVERLAY)
+ if("Cook")
+ clothes_s = icon('icons/mob/uniform.dmi', "chef_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "chef"), ICON_OVERLAY)
+ if("Janitor")
+ clothes_s = icon('icons/mob/uniform.dmi', "janitor_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Geneticist")
+ clothes_s = icon('icons/mob/uniform.dmi', "geneticswhite_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_gen"), ICON_OVERLAY)
+ if("Virologist")
+ clothes_s = icon('icons/mob/uniform.dmi', "virologywhite_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_vir"), ICON_OVERLAY)
+ if("Roboticist")
+ clothes_s = icon('icons/mob/uniform.dmi', "robotics_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
+ if("Lawyer")
+ clothes_s = icon('icons/mob/uniform.dmi', "bluesuit_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY)
+ if("Clown")
+ clothes_s = icon('icons/mob/uniform.dmi', "clown_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY)
+ if("Mime")
+ clothes_s = icon('icons/mob/uniform.dmi', "mime_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY)
+ if("Bartender")
+ clothes_s = icon('icons/mob/uniform.dmi', "ba_suit_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "armoralt"), ICON_OVERLAY)
+ if("Quartermaster")
+ clothes_s = icon('icons/mob/uniform.dmi', "qm_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Chaplain")
+ clothes_s = icon('icons/mob/uniform.dmi', "chapblack_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ if("Research Director")
+ clothes_s = icon('icons/mob/uniform.dmi', "director_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
+ if("Chief Medical Officer")
+ clothes_s = icon('icons/mob/uniform.dmi', "cmo_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY)
+ if("Captain")
+ clothes_s = icon('icons/mob/uniform.dmi', "captain_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY)
+ if("Head of Security")
+ clothes_s = icon('icons/mob/uniform.dmi', "hos_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "hostrench"), ICON_OVERLAY)
+ if("Warden")
+ clothes_s = icon('icons/mob/uniform.dmi', "warden_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY)
+ if("Detective")
+ clothes_s = icon('icons/mob/uniform.dmi', "detective_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
+ clothes_s.Blend(icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY)
+ clothes_s.Blend(icon('icons/mob/suit.dmi', "detective"), ICON_OVERLAY)
+ if("Chief Engineer")
+ clothes_s = icon('icons/mob/uniform.dmi', "chief_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
+ clothes_s.Blend(icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
+ if("Head of Personnel")
+ clothes_s = icon('icons/mob/uniform.dmi', "hop_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ if("Librarian")
+ clothes_s = icon('icons/mob/uniform.dmi', "red_suit_s")
+ clothes_s.Blend(icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+
+ if(clothes_s)
+ photo.Blend(clothes_s, ICON_OVERLAY)
+
+ return photo
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 60f50050301..28b08852240 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -396,7 +396,7 @@ var/list/advance_cures = list(
if(D.symptoms.len > 0)
- var/new_name = input(user, "Name your new disease.", "New Name")
+ var/new_name = stripped_input(user, "Name your new disease.", "New Name")
if(!new_name)
return
D.AssignName(new_name)
diff --git a/code/datums/diseases/advance/symptoms/fire.dm b/code/datums/diseases/advance/symptoms/fire.dm
new file mode 100644
index 00000000000..bc63c170960
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/fire.dm
@@ -0,0 +1,40 @@
+/*
+//////////////////////////////////////
+
+Spontaneous Combustion
+
+ Slightly hidden.
+ Lowers resistance tremendously.
+ Decreases stage tremendously.
+ Decreases transmittablity tremendously.
+ Fatal Level.
+
+Bonus
+ Ignites infected mob.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/fire
+
+ name = "Spontaneous Combustion"
+ stealth = 1
+ resistance = -4
+ stage_speed = -4
+ transmittable = -4
+ level = 6
+ severity = 5
+
+/datum/symptom/fire/Activate(var/datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4)
+ M.adjust_fire_stacks(5)
+ M.IgniteMob()
+
+ if(5)
+ M.adjust_fire_stacks(10)
+ M.IgniteMob()
+ return
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 1280be88102..16e16c914a6 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -58,7 +58,7 @@ Bonus
/datum/symptom/heal/metabolism
- name = "Anti-Bodies Metabolism "
+ name = "Anti-Bodies Metabolism"
stealth = -1
resistance = -1
stage_speed = -1
diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm
new file mode 100644
index 00000000000..d2bcf627358
--- /dev/null
+++ b/code/datums/diseases/advance/symptoms/skin.dm
@@ -0,0 +1,86 @@
+/*
+//////////////////////////////////////
+Vitiligo
+
+ Extremely Noticable.
+ Decreases resistance slightly.
+ Reduces stage speed slightly.
+ Reduces transmission.
+ Critical Level.
+
+BONUS
+ Makes the mob lose skin pigmentation.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/vitiligo
+
+ name = "Vitiligo"
+ stealth = -3
+ resistance = -1
+ stage_speed = -1
+ transmittable = -2
+ level = 4
+ severity = 1
+
+/datum/symptom/vitiligo/Activate(var/datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.skin_tone == "albino")
+ return
+ switch(A.stage)
+ if(5)
+ H.skin_tone = "albino"
+ H.update_body(0)
+ else
+ H.visible_message("[H] looks a bit pale...", "You look a bit pale...")
+
+ return
+
+
+/*
+//////////////////////////////////////
+Revitiligo
+
+ Extremely Noticable.
+ Decreases resistance slightly.
+ Reduces stage speed slightly.
+ Reduces transmission.
+ Critical Level.
+
+BONUS
+ Makes the mob gain skin pigmentation.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/revitiligo
+
+ name = "Revitiligo"
+ stealth = -3
+ resistance = -1
+ stage_speed = -1
+ transmittable = -2
+ level = 4
+ severity = 1
+
+/datum/symptom/vitiligo/Activate(var/datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ if(istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.skin_tone == "african2")
+ return
+ switch(A.stage)
+ if(5)
+ H.skin_tone = "african2"
+ H.update_body(0)
+ else
+ H.visible_message("[H] looks a bit dark...", "You look a bit dark...")
+
+ return
\ No newline at end of file
diff --git a/code/datums/diseases/advance/symptoms/visionloss.dm b/code/datums/diseases/advance/symptoms/vision.dm
similarity index 54%
rename from code/datums/diseases/advance/symptoms/visionloss.dm
rename to code/datums/diseases/advance/symptoms/vision.dm
index c80b5a35d6c..b63a4ee729f 100644
--- a/code/datums/diseases/advance/symptoms/visionloss.dm
+++ b/code/datums/diseases/advance/symptoms/vision.dm
@@ -1,49 +1,89 @@
-/*
-//////////////////////////////////////
-
-Hyphema (Eye bleeding)
-
- Slightly noticable.
- Lowers resistance tremendously.
- Decreases stage speed tremendously.
- Decreases transmittablity.
- Critical Level.
-
-Bonus
- Causes blindness.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/visionloss
-
- name = "Hyphema"
- stealth = -1
- resistance = -4
- stage_speed = -4
- transmittable = -3
- level = 5
- severity = 4
-
-/datum/symptom/visionloss/Activate(var/datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- switch(A.stage)
- if(1, 2)
- M << "Your eyes itch."
- if(3, 4)
- M << "Your eyes ache."
- M.eye_blurry = 10
- M.eye_stat += 1
- else
- M << "Your eyes burn horrificly!"
- M.eye_blurry = 20
- M.eye_stat += 5
- if (M.eye_stat >= 10)
- M.disabilities |= NEARSIGHT
- if (prob(M.eye_stat - 10 + 1) && !(M.eye_blind))
- M << "You go blind!"
- M.disabilities |= BLIND
- M.eye_blind = 1
- return
\ No newline at end of file
+/*
+//////////////////////////////////////
+
+Hyphema (Eye bleeding)
+
+ Slightly noticable.
+ Lowers resistance tremendously.
+ Decreases stage speed tremendously.
+ Decreases transmittablity.
+ Critical Level.
+
+Bonus
+ Causes blindness.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/visionloss
+
+ name = "Hyphema"
+ stealth = -1
+ resistance = -4
+ stage_speed = -4
+ transmittable = -3
+ level = 5
+ severity = 4
+
+/datum/symptom/visionloss/Activate(var/datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(1, 2)
+ M << "Your eyes itch."
+ if(3, 4)
+ M << "Your eyes ache."
+ M.eye_blurry = 10
+ M.eye_stat += 1
+ else
+ M << "Your eyes burn horrificly!"
+ M.eye_blurry = 20
+ M.eye_stat += 5
+ if (M.eye_stat >= 10)
+ M.disabilities |= NEARSIGHT
+ if (prob(M.eye_stat - 10 + 1) && !(M.eye_blind))
+ M << "You go blind!"
+ M.disabilities |= BLIND
+ M.eye_blind = 1
+ return
+
+
+/*
+//////////////////////////////////////
+
+Ocular Restoration
+
+ Noticable.
+ Lowers resistance significantly.
+ Decreases stage speed moderately..
+ Decreases transmittablity tremendously.
+ High level.
+
+Bonus
+ Restores eyesight.
+
+//////////////////////////////////////
+*/
+
+/datum/symptom/visionaid
+
+ name = "Ocular Restoration"
+ stealth = -1
+ resistance = -3
+ stage_speed = -2
+ transmittable = -4
+ level = 4
+
+/datum/symptom/visionaid/Activate(var/datum/disease/advance/A)
+ ..()
+ if(prob(SYMPTOM_ACTIVATION_PROB * 5))
+ var/mob/living/M = A.affected_mob
+ switch(A.stage)
+ if(4, 5)
+ if (M.reagents.get_reagent_amount("oculine") < 20)
+ M.reagents.add_reagent("oculine", 20)
+ else
+ if(prob(SYMPTOM_ACTIVATION_PROB * 5))
+ M << "[pick("Your eyes feel great.", "You are now blinking manually.", "You don't feel the need to blink.")]"
+ return
diff --git a/code/datums/diseases/advance/symptoms/vitiligo.dm b/code/datums/diseases/advance/symptoms/vitiligo.dm
deleted file mode 100644
index e24be2c36b5..00000000000
--- a/code/datums/diseases/advance/symptoms/vitiligo.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-//////////////////////////////////////
-Vitiligo
-
- Extremely Noticable.
- Decreases resistance slightly.
- Reduces stage speed slightly.
- Reduces transmission.
- Critical Level.
-
-BONUS
- Makes the mob lose skin pigmentation.
-
-//////////////////////////////////////
-*/
-
-/datum/symptom/vitiligo
-
- name = "Vitiligo"
- stealth = -3
- resistance = -1
- stage_speed = -1
- transmittable = -2
- level = 5
- severity = 1
-
-/datum/symptom/vitiligo/Activate(var/datum/disease/advance/A)
- ..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
- var/mob/living/M = A.affected_mob
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.skin_tone == "albino")
- return
- switch(A.stage)
- if(5)
- H.skin_tone = "albino"
- H.update_body(0)
- else
- H.visible_message("[H] looks a bit pale...", "You look a bit pale...")
-
- return
\ No newline at end of file
diff --git a/code/datums/goon_mutations_disabilities.dm b/code/datums/goon_mutations_disabilities.dm
index decfd10a987..44555ce8c4b 100644
--- a/code/datums/goon_mutations_disabilities.dm
+++ b/code/datums/goon_mutations_disabilities.dm
@@ -31,51 +31,52 @@
/datum/mutation/human/smile/say_mod(var/message)
if(message)
+ message = " [message] "
//Time for a friendly game of SS13
- message = replacetext(message,"stupid","smart")
- message = replacetext(message,"retard","genius")
- message = replacetext(message,"unrobust","robust")
- message = replacetext(message,"dumb","smart")
- message = replacetext(message,"awful","great")
- message = replacetext(message,"gay",pick("nice","ok","alright"))
- message = replacetext(message,"horrible","fun")
- message = replacetext(message,"terrible","terribly fun")
- message = replacetext(message,"terrifying","wonderful")
- message = replacetext(message,"gross","cool")
- message = replacetext(message,"disgusting","amazing")
- message = replacetext(message,"loser","winner")
- message = replacetext(message,"useless","useful")
- message = replacetext(message,"oh god","cheese and crackers")
- message = replacetext(message,"jesus","gee wiz")
- message = replacetext(message,"weak","strong")
- message = replacetext(message,"kill","hug")
- message = replacetext(message,"murder","tease")
- message = replacetext(message,"ugly","beautiful")
- message = replacetext(message,"douchbag","nice guy")
- message = replacetext(message,"whore","lady")
- message = replacetext(message,"nerd","smart guy")
- message = replacetext(message,"moron","fun person")
- message = replacetext(message,"IT'S LOOSE","EVERYTHING IS FINE")
- message = replacetext(message,"sex","hug fight")
- message = replacetext(message,"idiot","genius")
- message = replacetext(message,"fat","thin")
- message = replacetext(message,"beer","water with ice")
- message = replacetext(message,"drink","water")
- message = replacetext(message,"feminist","empowered woman")
- message = replacetext(message,"i hate you","you're mean")
- message = replacetext(message,"nigger","african american")
- message = replacetext(message,"jew","jewish")
- message = replacetext(message,"shit","shiz")
- message = replacetext(message,"crap","poo")
- message = replacetext(message,"slut","tease")
- message = replacetext(message,"ass","butt")
- message = replacetext(message,"damn","dang")
- message = replacetext(message,"fuck","")
- message = replacetext(message,"penis","privates")
- message = replacetext(message,"cunt","privates")
- message = replacetext(message,"dick","jerk")
- message = replacetext(message,"vagina","privates")
- return message
+ message = replacetext(message," stupid "," smart ")
+ message = replacetext(message," retard "," genius ")
+ message = replacetext(message," unrobust "," robust ")
+ message = replacetext(message," dumb "," smart ")
+ message = replacetext(message," awful "," great ")
+ message = replacetext(message," gay ",pick(" nice "," ok "," alright "))
+ message = replacetext(message," horrible "," fun ")
+ message = replacetext(message," terrible "," terribly fun ")
+ message = replacetext(message," terrifying "," wonderful ")
+ message = replacetext(message," gross "," cool ")
+ message = replacetext(message," disgusting "," amazing ")
+ message = replacetext(message," loser "," winner ")
+ message = replacetext(message," useless "," useful ")
+ message = replacetext(message," oh god "," cheese and crackers ")
+ message = replacetext(message," jesus "," gee wiz ")
+ message = replacetext(message," weak "," strong ")
+ message = replacetext(message," kill "," hug ")
+ message = replacetext(message," murder "," tease ")
+ message = replacetext(message," ugly "," beautiful ")
+ message = replacetext(message," douchbag "," nice guy ")
+ message = replacetext(message," whore "," lady ")
+ message = replacetext(message," nerd "," smart guy ")
+ message = replacetext(message," moron "," fun person ")
+ message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ")
+ message = replacetext(message," sex "," hug fight ")
+ message = replacetext(message," idiot "," genius ")
+ message = replacetext(message," fat "," thin ")
+ message = replacetext(message," beer "," water with ice ")
+ message = replacetext(message," drink "," water ")
+ message = replacetext(message," feminist "," empowered woman ")
+ message = replacetext(message," i hate you "," you're mean ")
+ message = replacetext(message," nigger "," african american ")
+ message = replacetext(message," jew "," jewish ")
+ message = replacetext(message," shit "," shiz ")
+ message = replacetext(message," crap "," poo ")
+ message = replacetext(message," slut "," tease ")
+ message = replacetext(message," ass "," butt ")
+ message = replacetext(message," damn "," dang ")
+ message = replacetext(message," fuck "," ")
+ message = replacetext(message," penis "," privates ")
+ message = replacetext(message," cunt "," privates ")
+ message = replacetext(message," dick "," jerk ")
+ message = replacetext(message," vagina "," privates ")
+ return trim(message)
/datum/mutation/human/unintelligable
name = "Unintelligable"
@@ -129,30 +130,29 @@
/datum/mutation/human/chav/say_mod(var/message)
if(message)
- message = replacetext(message,"dick","prat")
- message = replacetext(message,"comdom","knob'ead")
- message = replacetext(message,"looking at","gawpin' at")
- message = replacetext(message,"great","bangin'")
- message = replacetext(message,"man","mate")
- message = replacetext(message,"friend",pick("mate","bruv","bledrin"))
- message = replacetext(message,"what","wot")
- message = replacetext(message,"drink","wet")
- message = replacetext(message,"get","giz")
- message = replacetext(message,"what","wot")
- message = replacetext(message,"no thanks","wuddent fukken do one")
- message = replacetext(message,"i don't know","wot mate")
- message = replacetext(message,"no","naw")
- message = replacetext(message,"robust","chin")
- message = replacetext(message,"hi","how what how")
- message = replacetext(message,"hello","sup bruv")
- message = replacetext(message,"kill","bang")
- message = replacetext(message,"murder","bang")
- message = replacetext(message,"windows","windies")
- message = replacetext(message,"window","windy")
- message = replacetext(message,"break","do")
- message = replacetext(message,"your","yer")
- message = replacetext(message,"security","coppers")
- return message
+ message = " [message] "
+ message = replacetext(message," looking at "," gawpin' at ")
+ message = replacetext(message," great "," bangin' ")
+ message = replacetext(message," man "," mate ")
+ message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin "))
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," drink "," wet ")
+ message = replacetext(message," get "," giz ")
+ message = replacetext(message," what "," wot ")
+ message = replacetext(message," no thanks "," wuddent fukken do one ")
+ message = replacetext(message," i don't know "," wot mate ")
+ message = replacetext(message," no "," naw ")
+ message = replacetext(message," robust "," chin ")
+ message = replacetext(message," hi "," how what how ")
+ message = replacetext(message," hello "," sup bruv ")
+ message = replacetext(message," kill "," bang ")
+ message = replacetext(message," murder "," bang ")
+ message = replacetext(message," windows "," windies ")
+ message = replacetext(message," window "," windy ")
+ message = replacetext(message," break "," do ")
+ message = replacetext(message," your "," yer ")
+ message = replacetext(message," security "," coppers ")
+ return trim(message)
/datum/mutation/human/elvis
name = "Elvis"
@@ -173,13 +173,14 @@
/datum/mutation/human/elvis/say_mod(var/message)
if(message)
- message = replacetext(message,"i'm not","I aint")
- message = replacetext(message,"girl",pick("honey","baby","baby doll"))
- message = replacetext(message,"man",pick("son","buddy","brother", "pal", "friendo"))
- message = replacetext(message,"out of","outta")
- message = replacetext(message,"thank you","thank you, thank you very much")
- message = replacetext(message,"what are you","whatcha")
- message = replacetext(message,"yes",pick("sure", "yea"))
- message = replacetext(message,"faggot","square")
- message = replacetext(message,"muh valids","getting my kicks")
- return message
\ No newline at end of file
+ message = " [message] "
+ message = replacetext(message," i'm not "," I aint ")
+ message = replacetext(message," girl ",pick(" honey "," baby "," baby doll "))
+ message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo "))
+ message = replacetext(message," out of "," outta ")
+ message = replacetext(message," thank you "," thank you, thank you very much ")
+ message = replacetext(message," what are you "," whatcha ")
+ message = replacetext(message," yes ",pick(" sure", "yea "))
+ message = replacetext(message," faggot "," square ")
+ message = replacetext(message," muh valids "," getting my kicks ")
+ return trim(message)
diff --git a/code/datums/goon_mutations_powers.dm b/code/datums/goon_mutations_powers.dm
index 38069f48488..e164eced752 100644
--- a/code/datums/goon_mutations_powers.dm
+++ b/code/datums/goon_mutations_powers.dm
@@ -6,6 +6,7 @@
text_gain_indication = "You begin to fade into the shadows."
text_lose_indication = "You become fully visible."
+
/datum/mutation/human/stealth/on_life(mob/living/carbon/human/owner)
var/turf/simulated/T = get_turf(owner)
if(!istype(T))
@@ -26,8 +27,11 @@
lowest_value = 256 * 14
text_gain_indication = "You feel one with your surroundings."
text_lose_indication = "You feel oddly exposed."
-
+ var/last_location
/datum/mutation/human/chameleon/on_life(mob/living/carbon/human/owner)
+ if(owner.loc != last_location)
+ owner.alpha = round(255 * 0.80)
+ last_location = owner.loc
if((world.time - owner.last_movement) >= 30 && !owner.stat && owner.canmove && !owner.restrained())
owner.alpha -= 25
else
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index c49252f1a1e..7137bbf9ad1 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -58,6 +58,8 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(user.z == ZLEVEL_CENTCOM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
return 0
+ if(user.z == ZLEVEL_CENTCOM && ticker.mode.name == "ragin' mages")
+ return 0
if(!skipcharge)
switch(charge_type)
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 0e6963e49a5..846e90a51bf 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -77,11 +77,11 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/machinery/bot/floorbot,
/obj/machinery/bot/medbot,
/obj/machinery/bot/medbot,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air,
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
@@ -97,9 +97,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
contains = list(/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air,
- /obj/item/weapon/tank/air)
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air,
+ /obj/item/weapon/tank/internals/air)
cost = 10
containername = "internals crate"
@@ -111,8 +111,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/clothing/mask/gas,
/obj/item/device/flashlight,
/obj/item/device/flashlight,
- /obj/item/weapon/tank/oxygen/red,
- /obj/item/weapon/tank/oxygen/red,
+ /obj/item/weapon/tank/internals/oxygen/red,
+ /obj/item/weapon/tank/internals/oxygen/red,
/obj/item/weapon/extinguisher,
/obj/item/weapon/extinguisher,
/obj/item/clothing/head/hardhat/red,
@@ -306,9 +306,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/security/armory/eweapons
name = "Incendiary Weapons Crate"
contains = list(/obj/item/weapon/flamethrower/full,
- /obj/item/weapon/tank/plasma,
- /obj/item/weapon/tank/plasma,
- /obj/item/weapon/tank/plasma,
+ /obj/item/weapon/tank/internals/plasma,
+ /obj/item/weapon/tank/internals/plasma,
+ /obj/item/weapon/tank/internals/plasma,
/obj/item/weapon/grenade/chem_grenade/incendiary,
/obj/item/weapon/grenade/chem_grenade/incendiary,
/obj/item/weapon/grenade/chem_grenade/incendiary)
@@ -544,6 +544,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/reagent_containers/glass/bottle/toxin,
/obj/item/weapon/reagent_containers/glass/beaker/large,
/obj/item/weapon/reagent_containers/glass/beaker/large,
+ /obj/item/stack/medical/gauze,
/obj/item/weapon/storage/box/beakers,
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/bodybags)
@@ -607,6 +608,28 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
access = access_cmo
+/datum/supply_packs/medical/bloodpacks
+ name = "Blood Pack Variety Crate"
+ contains = list(/obj/item/weapon/reagent_containers/blood/empty,
+ /obj/item/weapon/reagent_containers/blood/empty,
+ /obj/item/weapon/reagent_containers/blood/APlus,
+ /obj/item/weapon/reagent_containers/blood/AMinus,
+ /obj/item/weapon/reagent_containers/blood/BPlus,
+ /obj/item/weapon/reagent_containers/blood/BMinus,
+ /obj/item/weapon/reagent_containers/blood/OPlus,
+ /obj/item/weapon/reagent_containers/blood/OMinus)
+ cost = 35
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "blood pack crate"
+
+/datum/supply_packs/medical/iv_drip
+ name = "IV Drip Crate"
+ contains = list(/obj/machinery/iv_drip)
+ cost = 30
+ containertype = /obj/structure/closet/crate/secure
+ containername = "iv drip crate"
+ access = access_cmo
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Science /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
@@ -649,9 +672,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/science/plasma
name = "Plasma Assembly Crate"
- contains = list(/obj/item/weapon/tank/plasma,
- /obj/item/weapon/tank/plasma,
- /obj/item/weapon/tank/plasma,
+ contains = list(/obj/item/weapon/tank/internals/plasma,
+ /obj/item/weapon/tank/internals/plasma,
+ /obj/item/weapon/tank/internals/plasma,
/obj/item/device/assembly/igniter,
/obj/item/device/assembly/igniter,
/obj/item/device/assembly/igniter,
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 283d6db8282..625e81f7b17 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -11,6 +11,13 @@
attack_verb = list("called", "rang")
hitsound = 'sound/weapons/ring.ogg'
+/obj/item/weapon/phone/suicide_act(mob/user)
+ if(locate(/obj/structure/stool) in user.loc)
+ user.visible_message("[user] begins to tie a noose with the [src.name]'s cord! It looks like \he's trying to commit suicide.")
+ else
+ user.visible_message("[user] is strangling \himself with the [src.name]'s cord! It looks like \he's trying to commit suicide.")
+ return(OXYLOSS)
+
/obj/item/weapon/rsp
name = "\improper Rapid-Seed-Producer (RSP)"
desc = "A device used to rapidly deploy seeds."
@@ -193,6 +200,11 @@
attack_verb = list("chopped", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+/obj/item/weapon/hatchet/suicide_act(mob/user)
+ user.visible_message("[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
/obj/item/weapon/scythe
icon_state = "scythe0"
name = "scythe"
@@ -208,6 +220,11 @@
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/bladeslice.ogg'
+/obj/item/weapon/scythe/suicide_act(mob/user) // maybe later i'll actually figure out how to make it behead them
+ user.visible_message("[user] is beheading \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
/*
/obj/item/weapon/cigarpacket
name = "Pete's Cuban Cigars"
@@ -466,6 +483,10 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "ectoplasm"
+/obj/item/weapon/ectoplasm/suicide_act(mob/user)
+ user.visible_message("[user] is inhaling the [src.name]! It looks like \he's trying to visit the astral plane.")
+ return (OXYLOSS)
+
/obj/item/weapon/research//Makes testing much less of a pain -Sieve
name = "research"
icon = 'icons/obj/stock_parts.dmi'
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index e0870964a61..6e9ac7205b5 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -63,7 +63,7 @@ proc/make_mining_asteroid_secret()
treasureitems = list(/obj/machinery/bot/medbot/mysterious=1, /obj/item/weapon/circular_saw=1, /obj/structure/closet/critter/cat=2)
fluffitems = list(/obj/effect/decal/cleanable/blood=5,/obj/item/organ/appendix=2,/obj/structure/closet/crate/freezer=2,
/obj/structure/optable=1,/obj/item/weapon/scalpel=1,/obj/item/weapon/storage/firstaid/regular=3,
- /obj/item/weapon/tank/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1)
+ /obj/item/weapon/tank/internals/anesthetic=1, /obj/item/weapon/surgical_drapes=2, /obj/item/device/mass_spectrometer/adv=1,/obj/item/clothing/glasses/hud/health=1)
if("cult")
theme = "cult"
@@ -91,7 +91,7 @@ proc/make_mining_asteroid_secret()
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,/obj/item/weapon/gun/energy/kinetic_accelerator=1,
/obj/item/weapon/resonator=1, /obj/item/weapon/pickaxe/jackhammer=5)
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
+ /obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/internals/oxygen/red=2)
if("xenoden")
theme = "xenoden"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index a7521840ef6..d750748ce3c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -329,11 +329,13 @@ var/list/blood_splatter_icons = list()
bloody_hands_mob = M
return 1
-/turf/simulated/add_blood(mob/living/carbon/M)
+/turf/simulated/add_blood(mob/living/carbon/human/M)
if(..() == 0) return 0
var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter
- if(!B) B = new /obj/effect/decal/cleanable/blood(src) //make a bloood splatter if we couldn't find one
+ if(!B)
+ blood_splatter(src,M.get_blood(M.vessel),1)
+ B = locate(/obj/effect/decal/cleanable/blood) in contents
B.add_blood_list(M)
return 1 //we bloodied the floor
@@ -366,7 +368,9 @@ var/list/blood_splatter_icons = list()
if(istype(src, /turf/simulated))
if(check_dna_integrity(M)) //mobs with dna = (monkeys + humans at time of writing)
var/obj/effect/decal/cleanable/blood/B = locate() in contents
- if(!B) B = new(src)
+ if(!B)
+ blood_splatter(src,M,1)
+ B = locate(/obj/effect/decal/cleanable/blood) in contents
B.blood_DNA[M.dna.unique_enzymes] = M.dna.blood_type
else if(istype(M, /mob/living/carbon/alien))
var/obj/effect/decal/cleanable/xenoblood/B = locate() in contents
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index a8613af17f5..ae0b05441c6 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -18,6 +18,7 @@ var/list/blob_nodes = list()
restricted_jobs = list("Cyborg", "AI")
var/declared = 0
+ var/burst = 0
var/cores_to_spawn = 1
var/players_per_core = 30
@@ -52,6 +53,39 @@ var/list/blob_nodes = list()
return 1
+/datum/game_mode/blob/proc/get_blob_candidates()
+ var/list/candidates = list()
+ for(var/mob/living/carbon/human/player in player_list)
+ if(!player.stat && player.mind && !player.mind.special_role && !jobban_isbanned(player, "Syndicate") && (player.client.prefs.be_special & BE_BLOB))
+ candidates += player
+ return candidates
+
+
+/datum/game_mode/blob/proc/blobize(var/mob/living/carbon/human/blob)
+ var/datum/mind/blobmind = blob.mind
+ if(!istype(blobmind))
+ return 0
+ infected_crew += blobmind
+ blobmind.special_role = "Blob"
+ log_game("[blob.key] (ckey) has been selected as a Blob")
+ greet_blob(blobmind)
+ blob << "You feel very tired and bloated! You don't have long before you burst!"
+ spawn(600)
+ burst_blob(blobmind)
+ return 1
+
+/datum/game_mode/blob/proc/make_blobs(var/count)
+ var/list/candidates = get_blob_candidates()
+ var/mob/living/carbon/human/blob = null
+ count=min(count, candidates.len)
+ for(var/i = 0, i < count, i++)
+ blob = pick(candidates)
+ candidates -= blob
+ blobize(blob)
+ return count
+
+
+
/datum/game_mode/blob/announce()
world << "The current game mode is - Blob!"
world << "A dangerous alien organism is rapidly spreading throughout the station!"
@@ -72,27 +106,39 @@ var/list/blob_nodes = list()
/datum/game_mode/blob/proc/burst_blobs()
for(var/datum/mind/blob in infected_crew)
+ burst_blob(blob)
- var/client/blob_client = null
- var/turf/location = null
+/datum/game_mode/blob/proc/burst_blob(var/datum/mind/blob, var/warned=0)
+ var/client/blob_client = null
+ var/turf/location = null
- if(iscarbon(blob.current))
- var/mob/living/carbon/C = blob.current
- if(directory[ckey(blob.key)])
- blob_client = directory[ckey(blob.key)]
- location = get_turf(C)
- if(location.z != ZLEVEL_STATION || istype(location, /turf/space))
- location = null
+ if(iscarbon(blob.current))
+ var/mob/living/carbon/C = blob.current
+ if(directory[ckey(blob.key)])
+ blob_client = directory[ckey(blob.key)]
+ location = get_turf(C)
+ if(location.z != ZLEVEL_STATION || istype(location, /turf/space))
+ if(!warned)
+ C << "You feel ready to burst, but this isn't an appropriate place! You must return to the station!"
+ message_admins("[key_name(C)] was in space when the blobs burst, and will die if he doesn't return to the station.")
+ spawn(300)
+ burst_blob(blob, 1)
+ else
+ burst ++
+ log_admin("[key_name(C)] was in space when attempting to burst as a blob.")
+ message_admins("[key_name(C)] was in space when attempting to burst as a blob.")
+ C.gib()
+ make_blobs(1)
+ check_finished() //Still needed in case we can't make any blobs
+
+ else if(blob_client && location)
+ burst ++
C.gib()
-
-
- if(blob_client && location)
- var/obj/effect/blob/core/core = new(location, 200, blob_client, blob_point_rate)
- if(core.overmind && core.overmind.mind)
- core.overmind.mind.name = blob.name
- infected_crew -= blob
- infected_crew += core.overmind.mind
-
+ var/obj/effect/blob/core/core = new(location, 200, blob_client, blob_point_rate)
+ if(core.overmind && core.overmind.mind)
+ core.overmind.mind.name = blob.name
+ infected_crew -= blob
+ infected_crew += core.overmind.mind
/datum/game_mode/blob/post_setup()
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index f83550796b7..56c1b4449c8 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -1,5 +1,5 @@
/datum/game_mode/blob/check_finished()
- if(!declared)//No blobs have been spawned yet
+ if(infected_crew.len > burst)//Some blobs have yet to burst
return 0
if(blobwincount <= blobs.len)//Blob took over
return 1
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 4412b095858..ac5e4ab7ef2 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -8,6 +8,7 @@
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds
var/resource_delay = 0
var/point_rate = 2
+ can_change_color = 0
/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
blob_cores += src
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 4dee5d6517a..93d1f9753fd 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -5,7 +5,7 @@
health = 100
fire_resist = 2
var/mob/camera/blob/overmind
-
+ can_change_color = 0
/obj/effect/blob/node/New(loc, var/h = 100)
blob_nodes += src
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 56e73d4e1bb..c3a0f3cff6e 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -11,6 +11,7 @@
var/health_timestamp = 0
var/brute_resist = 4
var/fire_resist = 1
+ var/can_change_color = 1
/obj/effect/blob/New(loc)
@@ -91,7 +92,8 @@
if(!B)
expand(T,1,a_color)//No blob here so try and expand
return
- B.color = a_color
+ if(B.can_change_color)
+ B.color = a_color
B.Pulse((pulse+1),get_dir(src.loc,T), a_color)
return
return
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 60bc0a7bacc..98d0a0f18c6 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -253,7 +253,7 @@
icon_state = "lingspacesuit"
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags = STOPSPRESSUREDMAGE | NODROP //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
- allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
/obj/item/clothing/suit/space/changeling/New()
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 2d5225758e4..90ebb2d9f93 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -97,6 +97,6 @@
item_state = "cult_armor"
desc = "A bulky suit of armor, 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/emergency_oxygen)
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/emergency_oxygen)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
\ No newline at end of file
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 5a378980f8f..bfccd051890 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -12,6 +12,9 @@
var/obj/item/weapon/disk/nuclear/the_disk = null
var/active = 0
+/obj/item/weapon/pinpointer/Destroy()
+ active = 0
+ ..()
/obj/item/weapon/pinpointer/attack_self()
if(!active)
@@ -239,7 +242,8 @@
if(16 to INFINITY)
icon_state = "pinonfar"
- spawn(5) .()
+ spawn(5)
+ .()
/obj/item/weapon/pinpointer/operative
name = "operative pinpointer"
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 9b3045d62a1..69c8e75be00 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -37,7 +37,7 @@ datum/hSB/proc/update()
"Space Gear",
"Suit Up (Space Travel Gear)" = "hsbsuit",
"Spawn Gas Mask" = "hsbspawn&path=[/obj/item/clothing/mask/gas]",
- "Spawn Emergency Air Tank" = "hsbspawn&path=[/obj/item/weapon/tank/emergency_oxygen/double]",
+ "Spawn Emergency Air Tank" = "hsbspawn&path=[/obj/item/weapon/tank/internals/emergency_oxygen/double]",
"Standard Tools",
"Spawn Flashlight" = "hsbspawn&path=[/obj/item/device/flashlight]",
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index ffe84d0a232..430950915b4 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -45,7 +45,7 @@
if("gyrojet")
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
if("pulse")
- new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
+ new /obj/item/weapon/gun/energy/pulse(get_turf(H))
if("suppressed")
new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H))
new /obj/item/weapon/suppressor(get_turf(H))
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 34cc59457e9..084cefb272c 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -12,6 +12,7 @@
var/op = 1
var/activepage
var/list/active_challenges = list()
+ var/mob/living/carbon/human/owner
/obj/item/weapon/spellbook/attackby(obj/item/O as obj, mob/user as mob)
if(istype(O, /obj/item/weapon/antag_spawner/contract))
@@ -28,6 +29,13 @@
/obj/item/weapon/spellbook/attack_self(mob/user as mob)
+ if(!owner)
+ user << "You bind the spellbook to yourself."
+ owner = user
+ return
+ if(user != owner)
+ user << "The [name] does not recognize you as it's owner and refuses to open."
+ return
user.set_machine(src)
var/dat
if(temp)
@@ -38,7 +46,7 @@
dat += "
"
dat += "Learn and Improve Magical Abilities
"
dat += "Summon Magical Tools and Weapons
"
- if(ticker.mode != "ragin' mages") // we totally need summon guns x100
+ if(ticker.mode.name != "ragin' mages") // we totally need summon guns x100
dat += "Raise The Stakes For More Power
"
dat += "
"
dat += "Re-memorize Spells
"
@@ -100,7 +108,7 @@
dat += "Instant Summons (10)
"
dat += "This spell can be used to bind a valuable item to you, bringing it to your hand at will. Using this spell while holding the bound item will allow you to unbind it. It does not require wizard garb.
"
- if(ticker.mode != "ragin' mages") // we totally need summon guns x100
+ if(ticker.mode.name != "ragin' mages") // we totally need summon greentext x100
dat += "Summon Events (One time use, persistent global spell)
"
dat += "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events.
"
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index ff3763796bb..1b6b18b7c89 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -156,9 +156,12 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(wizard_mob), slot_in_backpack)
// wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/scrying_gem(wizard_mob), slot_l_store) For scrying gem.
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
- wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand)
+ var/obj/item/weapon/spellbook/spellbook = new /obj/item/weapon/spellbook(wizard_mob)
+ spellbook.owner = wizard_mob
+ wizard_mob.equip_to_slot_or_del(spellbook, slot_r_hand)
wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully."
+ wizard_mob << "The spellbook is bound to you, and others cannot use it."
wizard_mob << "In your pockets you will find a teleport scroll. Use it as needed."
wizard_mob.mind.store_memory("Remember: do not forget to prepare your spells.")
wizard_mob.update_icons()
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 11d280c0663..1cbffbab51d 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -218,6 +218,17 @@
/proc/get_all_centcom_access()
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain)
+/proc/get_ert_access(var/class)
+ switch(class)
+ if("commander")
+ return get_all_centcom_access()
+ if("sec")
+ return list(access_cent_general, access_cent_specops)
+ if("eng")
+ return list(access_cent_general, access_cent_storage)
+ if("med")
+ return list(access_cent_general, access_cent_medical)
+
/proc/get_all_syndicate_access()
return list(access_syndicate, access_syndicate)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 0136e52eb28..8c8c69ce873 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -70,7 +70,7 @@ Station Engineer
/datum/job/engineer/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/orange(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 45c7aad316d..17051973fc4 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -222,6 +222,7 @@ text("[on ? "On" : "Off"]"))
target_types += /obj/effect/decal/cleanable/xenoblood/xgibs
target_types += /obj/effect/decal/cleanable/blood/
target_types += /obj/effect/decal/cleanable/blood/gibs/
+ target_types += /obj/effect/decal/cleanable/blood/drip/
target_types += /obj/effect/decal/cleanable/trail_holder
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 5badb4c9f9f..601bde71545 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -227,12 +227,6 @@
for(var/item in holographic_items)
derez(item)
- for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
- qdel(B)
-
- for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
- qdel(C)
-
holographic_items = A.copy_contents_to(linkedholodeck , 1)
if(emagged)
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index b0f9f5fb88e..7f1f9bdb3ed 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -28,7 +28,8 @@
/obj/item/toy/nuke = 2,
/obj/item/toy/minimeteor = 2,
/obj/item/toy/carpplushie = 2,
- /obj/item/toy/foamblade = 2
+ /obj/item/toy/foamblade = 2,
+ /obj/item/toy/redbutton = 2
)
/obj/machinery/computer/arcade/New()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index d673cf214a5..45e0278b5df 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -32,11 +32,11 @@
if(..())
return
var/dat
- if (src.temp)
+ if(src.temp)
dat = text("[src.temp]
Clear Screen")
else
dat = text("Confirm Identity: []
", src, (src.scan ? text("[]", src.scan.name) : "----------"))
- if (src.authenticated)
+ if(src.authenticated)
switch(src.screen)
if(1.0)
dat += {"
@@ -73,7 +73,7 @@
var/blood_type = ""
var/b_dna = ""
for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
blood_type = E.fields["blood_type"]
b_dna = E.fields["b_dna"]
var/background
@@ -105,10 +105,20 @@
dat += "| Medical Record |
"
if(active1 in data_core.general)
- dat += "| Name: | [active1.fields["name"]] |
"
+ if(istype(active1.fields["photo_front"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P1 = active1.fields["photo_front"]
+ user << browse_rsc(P1.img, "photo_front")
+ if(istype(active1.fields["photo_side"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P2 = active1.fields["photo_side"]
+ user << browse_rsc(P2.img, "photo_side")
+ dat += "| Name: | [active1.fields["name"]] | "
+ dat += " | "
+ dat += " |
"
dat += "| ID: | [active1.fields["id"]] |
"
dat += "| Sex: | [active1.fields["sex"]] |
"
dat += "| Age: | [active1.fields["age"]] |
"
+ if(config.mutant_races)
+ dat += "| Species: | [active1.fields["species"]] |
"
dat += "| Fingerprint: | [active1.fields["fingerprint"]] |
"
dat += "| Physical Status: | [active1.fields["p_stat"]] |
"
dat += "| Mental Status: | [active1.fields["m_stat"]] |
"
@@ -185,33 +195,34 @@
return
/obj/machinery/computer/med_data/Topic(href, href_list)
- if(..())
- return
+ . = ..()
+ if(.)
+ return .
if(!(active1 in data_core.general))
src.active1 = null
if(!(active2 in data_core.medical))
src.active2 = null
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["temp"])
+ if(href_list["temp"])
src.temp = null
- if (href_list["scan"])
- if (src.scan)
+ if(href_list["scan"])
+ if(src.scan)
src.scan.loc = src.loc
src.scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
src.scan = I
- else if (href_list["logout"])
+ else if(href_list["logout"])
src.authenticated = null
src.screen = null
src.active1 = null
src.active2 = null
- else if (href_list["choice"])
+ else if(href_list["choice"])
// SORTING!
if(href_list["choice"] == "Sorting")
// Reverse the order if clicked twice
@@ -224,21 +235,21 @@
// New sorting order!
sortBy = href_list["sort"]
order = initial(order)
- else if (href_list["login"])
- if (istype(usr, /mob/living/silicon))
+ else if(href_list["login"])
+ if(istype(usr, /mob/living/silicon))
src.active1 = null
src.active2 = null
src.authenticated = 1
src.rank = "AI"
src.screen = 1
- else if (istype(src.scan, /obj/item/weapon/card/id))
+ else if(istype(src.scan, /obj/item/weapon/card/id))
src.active1 = null
src.active2 = null
- if (src.check_access(src.scan))
+ if(src.check_access(src.scan))
src.authenticated = src.scan.registered_name
src.rank = src.scan.assignment
src.screen = 1
- if (src.authenticated)
+ if(src.authenticated)
if(href_list["screen"])
src.screen = text2num(href_list["screen"])
@@ -264,88 +275,94 @@
Severity: [Dis.severity]"}
- else if (href_list["del_all"])
+ else if(href_list["del_all"])
src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src)
- else if (href_list["del_all2"])
+ else if(href_list["del_all2"])
investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", "records")
data_core.medical.Cut()
src.temp = "All records deleted."
- else if (href_list["field"])
+ else if(href_list["field"])
var/a1 = src.active1
var/a2 = src.active2
switch(href_list["field"])
if("fingerprint")
if(active1)
- var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, a1))
return
src.active1.fields["fingerprint"] = t1
if("sex")
if(active1)
- if (src.active1.fields["sex"] == "Male")
+ if(src.active1.fields["sex"] == "Male")
src.active1.fields["sex"] = "Female"
else
src.active1.fields["sex"] = "Male"
if("age")
if(active1)
var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if(!canUseMedicalRecordsConsole(usr, t1, a1))
return
src.active1.fields["age"] = t1
+ if("species")
+ if(active1)
+ var/t1 = stripped_input("Please input species name", "Med. records", src.active1.fields["species"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, a1))
+ return
+ active1.fields["species"] = t1
if("mi_dis")
if(active2)
- var/t1 = copytext(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["mi_dis"] = t1
if("mi_dis_d")
if(active2)
- var/t1 = copytext(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["mi_dis_d"] = t1
if("ma_dis")
if(active2)
- var/t1 = copytext(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["ma_dis"] = t1
if("ma_dis_d")
if(active2)
- var/t1 = copytext(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["ma_dis_d"] = t1
if("alg")
if(active2)
- var/t1 = copytext(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_input("Please state allergies:", "Med. records", src.active2.fields["alg"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["alg"] = t1
if("alg_d")
if(active2)
- var/t1 = copytext(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["alg_d"] = t1
if("cdi")
if(active2)
- var/t1 = copytext(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["cdi"] = t1
if("cdi_d")
if(active2)
- var/t1 = copytext(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["cdi_d"] = t1
if("notes")
if(active2)
- var/t1 = copytext(sanitize(input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["notes"] = t1
if("p_stat")
@@ -359,13 +376,25 @@
src.temp = text("Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
", src, src, src, src, src, src, src, src)
if("b_dna")
if(active2)
- var/t1 = copytext(sanitize(input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
src.active2.fields["b_dna"] = t1
+ if("show_photo_front")
+ if(active1)
+ if(active1.fields["photo_front"])
+ if(istype(active1.fields["photo_front"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = active1.fields["photo_front"]
+ P.show(usr)
+ if("show_photo_side")
+ if(active1)
+ if(active1.fields["photo_side"])
+ if(istype(active1.fields["photo_side"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = active1.fields["photo_side"]
+ P.show(usr)
else
- else if (href_list["p_stat"])
+ else if(href_list["p_stat"])
if(active1)
switch(href_list["p_stat"])
if("deceased")
@@ -377,7 +406,7 @@
if("unfit")
src.active1.fields["p_stat"] = "Physically Unfit"
- else if (href_list["m_stat"])
+ else if(href_list["m_stat"])
if(active1)
switch(href_list["m_stat"])
if("insane")
@@ -390,7 +419,7 @@
src.active1.fields["m_stat"] = "Stable"
- else if (href_list["blood_type"])
+ else if(href_list["blood_type"])
if(active2)
switch(href_list["blood_type"])
if("an")
@@ -411,17 +440,17 @@
src.active2.fields["blood_type"] = "O+"
- else if (href_list["del_r"])
+ else if(href_list["del_r"])
if(active2)
src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
", src, src)
- else if (href_list["del_r2"])
+ else if(href_list["del_r2"])
investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", "records")
if(active2)
data_core.medical -= active2
active2 = null
- else if (href_list["d_rec"])
+ else if(href_list["d_rec"])
active1 = find_record("id", href_list["d_rec"], data_core.general)
if(active1)
active2 = find_record("id", href_list["d_rec"], data_core.medical)
@@ -429,8 +458,8 @@
active1 = null
screen = 4
- else if (href_list["new"])
- if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
+ else if(href_list["new"])
+ if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record( )
R.fields["name"] = src.active1.fields["name"]
R.fields["id"] = src.active1.fields["id"]
@@ -450,46 +479,46 @@
src.active2 = R
src.screen = 4
- else if (href_list["add_c"])
+ else if(href_list["add_c"])
if(!(active2 in data_core.medical))
return
var/a2 = src.active2
- var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ var/t1 = stripped_multiline_input("Add Comment:", "Med. records", null, null)
+ if(!canUseMedicalRecordsConsole(usr, t1, null, a2))
return
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,)
- else if (href_list["del_c"])
- if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
+ else if(href_list["del_c"])
+ if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
- else if (href_list["search"])
+ else if(href_list["search"])
var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records")
- if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))))
+ if(!canUseMedicalRecordsConsole(usr, t1))
return
src.active1 = null
src.active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.medical)
- if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
+ if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
src.active2 = R
else
//Foreach continue //goto(3229)
- if (!( src.active2 ))
+ if(!( src.active2 ))
src.temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.general)
- if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
+ if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
src.active1 = E
else
//Foreach continue //goto(3334)
src.screen = 4
- else if (href_list["print_p"])
- if (!( src.printing ))
+ else if(href_list["print_p"])
+ if(!( src.printing ))
src.printing = 1
data_core.medicalPrintCount++
playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1)
@@ -497,7 +526,10 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
P.info = "Medical Record - (MR-[data_core.medicalPrintCount])
"
if(active1 in data_core.general)
- P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"])
+ P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"])
+ if(config.mutant_races)
+ P.info += "\nSpecies: [active1.fields["species"]]
"
+ P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"])
else
P.info += "General Record Lost!
"
if(active2 in data_core.medical)
@@ -545,6 +577,15 @@
..(severity)
+/obj/machinery/computer/med_data/proc/canUseMedicalRecordsConsole(mob/user, message = 1, record1, record2)
+ if(user)
+ if(message)
+ if(authenticated)
+ if(user.canUseTopic(src))
+ if(!record1 || record1 == active1)
+ if(!record2 || record2 == active2)
+ return 1
+ return 0
/obj/machinery/computer/med_data/laptop
name = "medical laptop"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 6b4d124790f..480c87c5965 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -36,16 +36,16 @@
/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
if(..())
return
- if (src.z > 6)
+ if(src.z > 6)
user << "Unable to establish a connection: \black You're too far away from the station!"
return
var/dat
- if (temp)
+ if(temp)
dat = text("[]
Clear Screen", temp, src)
else
dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------"))
- if (authenticated)
+ if(authenticated)
switch(screen)
if(1.0)
@@ -122,7 +122,7 @@
for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
var/crimstat = ""
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"]))
crimstat = E.fields["criminal"]
var/background
switch(crimstat)
@@ -159,21 +159,34 @@
dat += "
Delete All Records
Back"
if(3.0)
dat += "Security Record
"
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- dat += {"
+ if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
+ if(istype(active1.fields["photo_front"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P1 = active1.fields["photo_front"]
+ user << browse_rsc(P1.img, "photo_front")
+ if(istype(active1.fields["photo_side"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P2 = active1.fields["photo_side"]
+ user << browse_rsc(P2.img, "photo_side")
+ dat += {"
+ |
+ |
"}
else
- dat += "General Record Lost!
"
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
- dat += "
Security Data"
+ dat += "
General Record Lost!
"
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ dat += "Security Data"
dat += "
Criminal Status: [active2.fields["criminal"]]"
dat += "
Minor Crimes: Add New"
@@ -244,13 +257,14 @@
I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
What a mess.*/
/obj/machinery/computer/secure_data/Topic(href, href_list)
- if(..())
- return
- if (!( data_core.general.Find(active1) ))
+ . = ..()
+ if(.)
+ return .
+ if(!( data_core.general.Find(active1) ))
active1 = null
- if (!( data_core.security.Find(active2) ))
+ if(!( data_core.security.Find(active2) ))
active2 = null
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["choice"])
// SORTING!
@@ -269,13 +283,13 @@ What a mess.*/
if("Clear Screen")
temp = null
- if ("Return")
+ if("Return")
screen = 1
active1 = null
active2 = null
if("Confirm Identity")
- if (scan)
+ if(scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
usr.put_in_hands(scan)
else
@@ -283,7 +297,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
@@ -295,14 +309,14 @@ What a mess.*/
active2 = null
if("Log In")
- if (istype(usr, /mob/living/silicon))
+ if(istype(usr, /mob/living/silicon))
var/mob/living/silicon/borg = usr
active1 = null
active2 = null
authenticated = borg.name
rank = "AI"
screen = 1
- else if (istype(scan, /obj/item/weapon/card/id))
+ else if(istype(scan, /obj/item/weapon/card/id))
active1 = null
active2 = null
if(check_access(scan))
@@ -315,50 +329,53 @@ What a mess.*/
active1 = null
active2 = null
- if ("Browse Record")
+ if("Browse Record")
var/datum/data/record/R = locate(href_list["d_rec"])
var/S = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
temp = "Record Not Found!"
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
S = E
active1 = R
active2 = S
screen = 3
-/* if ("Search Fingerprints")
+/* if("Search Fingerprints")
var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
+ if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
return
active1 = null
active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.general)
- if (lowertext(R.fields["fingerprint"]) == t1)
+ if(lowertext(R.fields["fingerprint"]) == t1)
active1 = R
- if (!( active1 ))
+ if(!( active1 ))
temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
+ if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
active2 = E
screen = 3 */
- if ("Print Record")
- if (!( printing ))
+ if("Print Record")
+ if(!( printing ))
printing = 1
data_core.securityPrintCount++
playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1)
sleep(30)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "Security Record - (SR-[data_core.securityPrintCount])
"
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"])
+ if(config.mutant_races)
+ P.info += "\nSpecies: [active1.fields["species"]]
"
+ P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
else
P.info += "General Record Lost!
"
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
P.info += text("
\nSecurity Data
\nCriminal Status: []", active2.fields["criminal"])
P.info += "
\n
\nMinor Crimes:
\n"
@@ -406,49 +423,49 @@ What a mess.*/
P.info += ""
printing = null
//RECORD DELETE
- if ("Delete All Records")
+ if("Delete All Records")
temp = ""
temp += "Are you sure you wish to delete all Security records?
"
temp += "Yes
"
temp += "No"
- if ("Purge All Records")
+ if("Purge All Records")
investigate_log("[usr.name] ([usr.key]) has purged all the security records.", "records")
for(var/datum/data/record/R in data_core.security)
del(R)
data_core.security.Cut()
temp = "All Security records deleted."
- if ("Add Entry")
- if (!( istype(active2, /datum/data/record) ))
+ if("Add Entry")
+ if(!( istype(active2, /datum/data/record) ))
return
var/a2 = active2
- var/t1 = copytext(sanitize(input("Add Comment:", "Secure. records", null, null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null)
+ if(!canUseSecurityRecordsConsole(t1, usr, null, a2))
return
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,)
- if ("Delete Record (ALL)")
- if (active1)
+ if("Delete Record (ALL)")
+ if(active1)
temp = "Are you sure you wish to delete the record (ALL)?
"
temp += "Yes
"
temp += "No"
- if ("Delete Record (Security)")
- if (active2)
+ if("Delete Record (Security)")
+ if(active2)
temp = "Are you sure you wish to delete the record (Security Portion Only)?
"
temp += "Yes
"
temp += "No"
- if ("Delete Entry")
- if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
+ if("Delete Entry")
+ if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
active2.fields[text("com_[]", href_list["del_c"])] = "Deleted"
//RECORD CREATE
- if ("New Record (Security)")
- if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
+ if("New Record (Security)")
+ if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record()
R.fields["name"] = active1.fields["name"]
R.fields["id"] = active1.fields["id"]
@@ -461,7 +478,7 @@ What a mess.*/
active2 = R
screen = 3
- if ("New Record (General)")
+ if("New Record (General)")
//General Record
var/datum/data/record/G = new /datum/data/record()
G.fields["name"] = "New Record"
@@ -469,6 +486,10 @@ What a mess.*/
G.fields["rank"] = "Unassigned"
G.fields["sex"] = "Male"
G.fields["age"] = "Unknown"
+ if(config.mutant_races)
+ G.fields["species"] = "Human"
+ G.fields["photo_front"] = new /icon()
+ G.fields["photo_side"] = new /icon()
G.fields["fingerprint"] = "?????"
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
@@ -507,15 +528,15 @@ What a mess.*/
//FIELD FUNCTIONS
- if ("Edit Field")
+ if("Edit Field")
var/a1 = active1
var/a2 = active2
switch(href_list["field"])
if("name")
- if (istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
+ if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null)
- if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
+ if(!canUseSecurityRecordsConsole(usr, t1, null, a1))
return
if(istype(active1, /datum/data/record))
active1.fields["name"] = t1
@@ -523,67 +544,93 @@ What a mess.*/
active2.fields["name"] = t1
if("id")
if(istype(active2,/datum/data/record) || istype(active1,/datum/data/record))
- var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ var/t1 = stripped_input(usr, "Please input id:", "Secure. records", active1.fields["id"], null)
+ if(!canUseSecurityRecordsConsole(usr, t1, null, a1))
return
if(istype(active1,/datum/data/record))
active1.fields["id"] = t1
if(istype(active2,/datum/data/record))
active2.fields["id"] = t1
if("fingerprint")
- if (istype(active1, /datum/data/record))
- var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if(istype(active1, /datum/data/record))
+ var/t1 = stripped_input(usr, "Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null)
+ if(!canUseSecurityRecordsConsole(usr, t1, null, a1))
return
active1.fields["fingerprint"] = t1
if("sex")
- if (istype(active1, /datum/data/record))
- if (active1.fields["sex"] == "Male")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
active1.fields["sex"] = "Female"
else
active1.fields["sex"] = "Male"
if("age")
- if (istype(active1, /datum/data/record))
- var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if(!canUseSecurityRecordsConsole(usr, null, null, a1) || !t1)
return
active1.fields["age"] = t1
+ if("species")
+ if(istype(active1, /datum/data/record))
+ var/t1 = input("Select a species", "Species Selection") as null|anything in roundstart_species
+ if(!canUseSecurityRecordsConsole(usr, t1, null, a1))
+ return
+ active1.fields["species"] = t1
+ if("show_photo_front")
+ if(active1.fields["photo_front"])
+ if(istype(active1.fields["photo_front"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = active1.fields["photo_front"]
+ P.show(usr)
+ if("upd_photo_front")
+ var/icon/photo = get_photo(usr)
+ if(photo)
+ qdel(active1.fields["photo_front"])
+ active1.fields["photo_front"] = photo
+ if("show_photo_side")
+ if(active1.fields["photo_side"])
+ if(istype(active1.fields["photo_side"], /obj/item/weapon/photo))
+ var/obj/item/weapon/photo/P = active1.fields["photo_side"]
+ P.show(usr)
+ if("upd_photo_side")
+ var/icon/photo = get_photo(usr)
+ if(photo)
+ qdel(active1.fields["photo_side"])
+ active1.fields["photo_side"] = photo
if("mi_crim_add")
- if (istype(active1, /datum/data/record))
- var/t1 = copytext(sanitize(input("Please input minor crime names:", "Secure. records", "", null) as text),1,MAX_MESSAGE_LEN)
- var/t2 = copytext(sanitize(input("Please input minor crime details:", "Secure. records", "", null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( t2 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if(istype(active1, /datum/data/record))
+ var/t1 = stripped_input(usr, "Please input minor crime names:", "Secure. records", "", null)
+ var/t2 = stripped_multiline_input(usr, "Please input minor crime details:", "Secure. records", "", null)
+ if(!canUseSecurityRecordsConsole(usr, t1, t2, null, a2))
return
var/crime = data_core.createCrimeEntry(t1, t2, authenticated, worldtime2text())
data_core.addMinorCrime(active1.fields["id"], crime)
if("mi_crim_delete")
- if (istype(active1, /datum/data/record))
- if (href_list["cdataid"])
- if ((!( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if(istype(active1, /datum/data/record))
+ if(href_list["cdataid"])
+ if(!canUseSecurityRecordsConsole(usr, null, null, a2))
return
data_core.removeMinorCrime(active1.fields["id"], href_list["cdataid"])
if("ma_crim_add")
- if (istype(active1, /datum/data/record))
- var/t1 = copytext(sanitize(input("Please input major crime names:", "Secure. records", "", null) as text),1,MAX_MESSAGE_LEN)
- var/t2 = copytext(sanitize(input("Please input major crime details:", "Secure. records", "", null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( t2 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if(istype(active1, /datum/data/record))
+ var/t1 = stripped_input(usr, "Please input major crime names:", "Secure. records", "", null)
+ var/t2 = stripped_multiline_input(usr, "Please input major crime details:", "Secure. records", "", null)
+ if(!canUseSecurityRecordsConsole(usr, t1, t2, a2))
return
var/crime = data_core.createCrimeEntry(t1, t2, authenticated, worldtime2text())
data_core.addMajorCrime(active1.fields["id"], crime)
if("ma_crim_delete")
- if (istype(active1, /datum/data/record))
- if (href_list["cdataid"])
- if ((!( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if(istype(active1, /datum/data/record))
+ if(href_list["cdataid"])
+ if(!canUseSecurityRecordsConsole(usr, null, null, a2))
return
data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"])
if("notes")
- if (istype(active2, /datum/data/record))
- var/t1 = copytext(sanitize(input("Please summarize notes:", "Secure. records", active2.fields["notes"], null) as message),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if(istype(active2, /datum/data/record))
+ var/t1 = stripped_input(usr, "Please summarize notes:", "Secure. records", active2.fields["notes"], null)
+ if(!canUseSecurityRecordsConsole(usr, t1, null, a2))
return
active2.fields["notes"] = t1
if("criminal")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
temp = "Criminal Status:
"
temp += ""
temp += "- None
"
@@ -595,7 +642,7 @@ What a mess.*/
if("rank")
var/list/L = list( "Head of Personnel", "Captain", "AI" )
//This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ if((istype(active1, /datum/data/record) && L.Find(rank)))
temp = "Rank:
"
temp += ""
for(var/rank in get_all_jobs())
@@ -607,14 +654,14 @@ What a mess.*/
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
- if ("Change Rank")
- if (active1)
+ if("Change Rank")
+ if(active1)
active1.fields["rank"] = href_list["rank"]
if(href_list["rank"] in get_all_jobs())
active1.fields["real_rank"] = href_list["real_rank"]
- if ("Change Criminal Status")
- if (active2)
+ if("Change Criminal Status")
+ if(active2)
var/old_field = active2.fields["criminal"]
switch(href_list["criminal2"])
if("none")
@@ -630,24 +677,24 @@ What a mess.*/
investigate_log("[active1.fields["name"]] has been set from [old_field] to [active2.fields["criminal"]] by [usr.name] ([usr.key]).", "records")
for(var/mob/living/carbon/human/H in mob_list) //thanks for forcing me to do this, whoever wrote this shitty records system
H.sec_hud_set_security_status()
- if ("Delete Record (Security) Execute")
+ if("Delete Record (Security) Execute")
investigate_log("[usr.name] ([usr.key]) has deleted the security records for [active1.fields["name"]].", "records")
- if (active2)
+ if(active2)
data_core.security -= active2
del(active2)
- if ("Delete Record (ALL) Execute")
- if (active1)
+ if("Delete Record (ALL) Execute")
+ if(active1)
investigate_log("[usr.name] ([usr.key]) has deleted all records for [active1.fields["name"]].", "records")
for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
data_core.medical -= R
del(R)
break
data_core.general -= active1
del(active1)
- if (active2)
+ if(active2)
data_core.security -= active2
del(active2)
else
@@ -657,6 +704,18 @@ What a mess.*/
updateUsrDialog()
return
+/obj/machinery/computer/secure_data/proc/get_photo(var/mob/user)
+ var/obj/item/weapon/photo/P = null
+ if(istype(user, /mob/living/silicon))
+ var/mob/living/silicon/tempAI = user
+ var/datum/picture/selection = tempAI.GetPhoto()
+ if(selection)
+ P = new()
+ P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
+ else if(istype(user.get_active_hand(), /obj/item/weapon/photo))
+ P = user.get_active_hand()
+ return P
+
/obj/machinery/computer/secure_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
@@ -664,11 +723,11 @@ What a mess.*/
for(var/datum/data/record/R in data_core.security)
if(prob(10/severity))
- switch(rand(1,6))
+ switch(rand(1,8))
if(1)
R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
if(2)
- R.fields["sex"] = pick("Male", "Female")
+ R.fields["sex"] = pick("Male", "Female")
if(3)
R.fields["age"] = rand(5, 85)
if(4)
@@ -677,6 +736,12 @@ What a mess.*/
R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
+ if(7)
+ R.fields["species"] = pick(roundstart_species)
+ if(8)
+ var/datum/data/record/G = pick(data_core.general)
+ R.fields["photo_front"] = G.fields["photo_front"]
+ R.fields["photo_side"] = G.fields["photo_side"]
continue
else if(prob(1))
@@ -685,6 +750,17 @@ What a mess.*/
..(severity)
+/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 1, message2 = 1, record1, record2)
+ if(user)
+ if(trim(message1))
+ if(trim(message2))
+ if(authenticated)
+ if(user.canUseTopic(src))
+ if(!record1 || record1 == active1)
+ if(!record2 || record2 == active2)
+ return 1
+ return 0
+
/obj/machinery/computer/secure_data/detective_computer
icon = 'icons/obj/computer.dmi'
icon_state = "messyfiles"
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index d90968524f0..b0f83365b21 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -84,12 +84,26 @@
open_machine()
/obj/machinery/atmospherics/unary/cryo_cell/container_resist()
- if(stat & DEAD)
- return
- sleep(usr.stat * 1200)
open_machine()
return
+/obj/machinery/atmospherics/unary/cryo_cell/verb/move_eject()
+ set name = "Eject Cryo Cell"
+ set desc = "Begin the release sequence inside the cryo tube."
+ set category = "Object"
+ set src in oview(1)
+ if(usr == occupant || contents.Find(usr)) //If the user is inside the tube...
+ if(usr.stat == DEAD) //and he's not dead....
+ return
+ usr << "Release sequence activated. This will take about a minute."
+ sleep(600)
+ if(!src || !usr || (!occupant && !contents.Find(usr))) //Check if someone's released/replaced/bombed him already
+ return
+ open_machine()
+ add_fingerprint(usr)
+ else
+ open_machine()
+
/obj/machinery/atmospherics/unary/cryo_cell/examine(mob/user)
..()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
new file mode 100644
index 00000000000..c7f6c54dae6
--- /dev/null
+++ b/code/game/machinery/iv_drip.dm
@@ -0,0 +1,203 @@
+/obj/machinery/iv_drip
+ name = "\improper IV drip"
+ icon = 'icons/obj/iv_drip.dmi'
+ icon_state = "iv_drip"
+ anchored = 0
+ density = 1
+ var/mob/living/carbon/human/attached = null
+ var/mode = 1 // 1 is injecting, 0 is taking blood.
+ var/obj/item/weapon/reagent_containers/beaker = null
+
+
+/obj/machinery/iv_drip/New()
+ ..()
+ update_icon()
+
+/obj/machinery/iv_drip/update_icon()
+ if(src.attached)
+ if(mode)
+ icon_state = "injecting"
+ else
+ icon_state = "donating"
+ else
+ if(mode)
+ icon_state = "injectidle"
+ else
+ icon_state = "donateidle"
+
+ overlays = null
+
+ if(beaker)
+ if(attached)
+ overlays += "beakeractive"
+ else
+ overlays += "beakeridle"
+ if(beaker.reagents.total_volume)
+ var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent")
+
+ var/percent = round((beaker.reagents.total_volume / beaker.volume) * 100)
+ switch(percent)
+ if(0 to 9) filling.icon_state = "reagent0"
+ if(10 to 24) filling.icon_state = "reagent10"
+ if(25 to 49) filling.icon_state = "reagent25"
+ if(50 to 74) filling.icon_state = "reagent50"
+ if(75 to 79) filling.icon_state = "reagent75"
+ if(80 to 90) filling.icon_state = "reagent80"
+ if(91 to INFINITY) filling.icon_state = "reagent100"
+
+ filling.icon += mix_color_from_reagents(beaker.reagents.reagent_list)
+ overlays += filling
+
+/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
+ ..()
+
+ if(!ishuman(over_object))
+ usr << "The drip beeps: Warning, human patients only!"
+
+ if(attached)
+ visible_message("[src.attached] is detached from \the [src]")
+ src.attached = null
+ src.update_icon()
+ return
+
+ if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1)
+ if(src.beaker)
+ visible_message("[usr] attaches \the [src] to \the [over_object].")
+ src.attached = over_object
+ src.update_icon()
+ else
+ usr << "There's nothing attached to the IV drip!"
+
+
+/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/reagent_containers))
+ if(!isnull(src.beaker))
+ user << "There is already a reagent container loaded!"
+ return
+
+ user.drop_item()
+ W.loc = src
+ src.beaker = W
+ user << "You attach \the [W] to \the [src]."
+ src.update_icon()
+ return
+ else
+ return ..()
+
+
+/obj/machinery/iv_drip/process()
+ set background = 1
+
+ if(src.attached)
+
+ if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc)))
+ attached << "The IV drip needle is ripped out of you, doesn't that hurt?"
+ src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
+ src.attached = null
+ src.update_icon()
+ return
+
+ if(src.attached && src.beaker)
+ // Give blood
+ if(mode)
+ if(src.beaker.volume > 0)
+ var/transfer_amount = REAGENTS_METABOLISM
+ if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood))
+ // speed up transfer on blood packs
+ transfer_amount = 4
+ src.beaker.reagents.trans_to(src.attached, transfer_amount)
+ update_icon()
+
+ // Take blood
+ else
+ var/amount = beaker.reagents.maximum_volume - beaker.reagents.total_volume
+ amount = min(amount, 4)
+ // If the beaker is full, ping
+ if(amount == 0)
+ if(prob(5)) visible_message("\The [src] pings.")
+ return
+
+ var/mob/living/carbon/human/T = attached
+
+ if(!istype(T)) return
+ if(!T.dna)
+ return
+ if(NOCLONE in T.mutations)
+ return
+
+ if(NOBLOOD in T.dna.species.specflags)
+ return
+
+ // If the human is losing too much blood, beep.
+ if(T.vessel.get_reagent_amount("blood") < BLOOD_VOLUME_SAFE) if(prob(5))
+ visible_message("\The [src] beeps loudly.")
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
+ var/datum/reagent/B = T.take_blood(beaker,amount)
+
+ if (B)
+ beaker.reagents.reagent_list |= B
+ beaker.reagents.update_total()
+ beaker.on_reagent_change()
+ beaker.reagents.handle_reactions()
+ update_icon()
+
+/obj/machinery/iv_drip/attack_hand(mob/user)
+ if(src.attached)
+ visible_message("[src.attached] is detached from \the [src]")
+ src.attached = null
+ update_icon()
+ return
+ else if(src.beaker)
+ eject_beaker(user)
+ else
+ toggle_mode()
+
+/obj/machinery/iv_drip/verb/eject_beaker(mob/user)
+ set category = "Object"
+ set name = "Remove IV Container"
+ set src in view(1)
+
+ if(!istype(usr, /mob/living))
+ usr << "You can't do that."
+ return
+
+ if(usr.stat)
+ return
+
+ if(src.beaker)
+ src.beaker.loc = get_turf(src)
+ src.beaker = null
+ update_icon()
+
+/obj/machinery/iv_drip/verb/toggle_mode()
+ set category = "Object"
+ set name = "Toggle Mode"
+ set src in view(1)
+
+ if(!istype(usr, /mob/living))
+ usr << "You can't do that."
+ return
+
+ if(usr.stat)
+ return
+
+ mode = !mode
+ usr << "The IV drip is now [mode ? "injecting" : "taking blood"]."
+ update_icon()
+
+/obj/machinery/iv_drip/examine()
+ set src in view()
+ ..()
+ if (!(usr in view(2)) && usr!=src.loc) return
+
+ usr << "The IV drip is [mode ? "injecting" : "taking blood"]."
+
+ if(beaker)
+ if(beaker.reagents && beaker.reagents.reagent_list.len)
+ usr << "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid."
+ else
+ usr << "Attached is an empty [beaker]."
+ else
+ usr << "No chemicals are attached."
+
+ usr << "[attached ? attached : "No one"] is attached."
\ No newline at end of file
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 35ee5e7bad4..727c1617861 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -123,10 +123,6 @@
eprojectile = /obj/item/projectile/beam
eshot_sound = 'sound/weapons/Laser.ogg'
- if(/obj/item/weapon/gun/energy/stunrevolver)
- eprojectile = /obj/item/projectile/beam
- eshot_sound = 'sound/weapons/Laser.ogg'
-
if(/obj/item/weapon/gun/energy/gun)
eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
eshot_sound = 'sound/weapons/Laser.ogg'
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 1e0c73fbfca..cf92f21046f 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -71,7 +71,7 @@
if(istype(charging, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
- E.power_supply.give(100)
+ E.power_supply.give(E.power_supply.chargerate)
icon_state = "recharger1"
use_power(250)
else
@@ -80,7 +80,7 @@
if(istype(charging, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = charging
if(B.bcell)
- if(B.bcell.give(1500)) //Because otherwise it takes two minutes to fully charge due to 15k cells. - Neerti
+ if(B.bcell.give(B.bcell.chargerate))
icon_state = "recharger1"
use_power(200)
else
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 2ea08978303..16aac4c25cb 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -79,25 +79,25 @@
SUIT_TYPE = /obj/item/clothing/suit/space/ert
HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/ert
MASK_TYPE = /obj/item/clothing/mask/breath
- STORAGE_TYPE = /obj/item/weapon/tank/emergency_oxygen/double
+ STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ertSec
SUIT_TYPE = /obj/item/clothing/suit/space/ert/sec
HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/ert/sec
MASK_TYPE = /obj/item/clothing/mask/breath
- STORAGE_TYPE = /obj/item/weapon/tank/emergency_oxygen/double
+ STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ertEngi
SUIT_TYPE = /obj/item/clothing/suit/space/ert/engi
HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/ert/engi
MASK_TYPE = /obj/item/clothing/mask/breath
- STORAGE_TYPE = /obj/item/weapon/tank/emergency_oxygen/double
+ STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/ertMed
SUIT_TYPE = /obj/item/clothing/suit/space/ert/med
HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/ert/med
MASK_TYPE = /obj/item/clothing/mask/breath
- STORAGE_TYPE = /obj/item/weapon/tank/emergency_oxygen/double
+ STORAGE_TYPE = /obj/item/weapon/tank/internals/emergency_oxygen/double
/obj/machinery/suit_storage_unit/New()
src.update_icon()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d597250a2fc..eb030504a43 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -589,7 +589,7 @@
desc = "A vendor with a wide variety of masks and gas tanks."
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
- product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/plasma;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
+ product_paths = "/obj/item/weapon/tank/internals/oxygen;/obj/item/weapon/tank/internals/plasma;/obj/item/weapon/tank/internals/emergency_oxygen;/obj/item/weapon/tank/internals/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
product_amounts = "10;10;10;5;25"
vend_delay = 0
*/
@@ -764,7 +764,7 @@
icon_deny = "med-deny"
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!"
req_access_txt = "5"
- products = list(/obj/item/weapon/reagent_containers/syringe = 12,/obj/item/weapon/reagent_containers/pill/patch/styptic = 10,
+ products = list(/obj/item/weapon/reagent_containers/syringe = 12,/obj/item/stack/medical/gauze = 8,/obj/item/weapon/reagent_containers/pill/patch/styptic = 10,
/obj/item/weapon/reagent_containers/pill/patch/silver_sulf = 10,/obj/item/weapon/reagent_containers/glass/bottle/charcoal = 4,
/obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 4,/obj/item/weapon/reagent_containers/glass/bottle/morphine = 4,
/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 4,/obj/item/weapon/reagent_containers/glass/bottle/potass_iodide = 3, /obj/item/weapon/reagent_containers/glass/bottle/salglu_solution = 5,/obj/item/weapon/reagent_containers/glass/bottle/atropine = 3,/obj/item/weapon/reagent_containers/syringe/antiviral = 6,/obj/item/weapon/reagent_containers/syringe/calomel = 10,/obj/item/weapon/reagent_containers/pill/salbutamol = 10,/obj/item/weapon/reagent_containers/pill/mannitol = 10,/obj/item/weapon/reagent_containers/pill/mutadone = 5,/obj/item/device/healthanalyzer = 4, /obj/item/device/sensor_device = 2)
@@ -944,7 +944,7 @@
req_access_txt = "29"
products = list(/obj/item/clothing/suit/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash/handheld = 4,
/obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
- /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
+ /obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/internals/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//This one's from NTstation
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index f3817b101fc..b50b02a3a46 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -18,13 +18,13 @@
/obj/effect/decal/cleanable/blood/New()
..()
- remove_ex_blood()
-
-/obj/effect/decal/cleanable/blood/proc/remove_ex_blood() //removes existant blood on the turf
- if(src.loc && isturf(src.loc))
- for(var/obj/effect/decal/cleanable/blood/B in src.loc)
- if(B != src)
- qdel(B)
+ if(src.type == /obj/effect/decal/cleanable/blood)
+ if(src.loc && isturf(src.loc))
+ for(var/obj/effect/decal/cleanable/blood/B in src.loc)
+ if(B != src)
+ if (B.blood_DNA)
+ blood_DNA |= B.blood_DNA.Copy()
+ qdel(B)
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5")
@@ -61,9 +61,6 @@
/obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target)
return
-/obj/effect/decal/cleanable/blood/gibs/remove_ex_blood()
- return
-
/obj/effect/decal/cleanable/blood/gibs/up
random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6","gibup1","gibup1","gibup1")
@@ -91,6 +88,19 @@
var/datum/disease/ND = D.Copy(1)
b.viruses += ND
ND.holder = b
-
if (step_to(src, get_step(src, direction), 0))
- break
\ No newline at end of file
+ break
+
+/obj/effect/decal/cleanable/blood/drip
+ name = "drips of blood"
+ desc = "It's red."
+ gender = PLURAL
+ icon = 'icons/effects/drip.dmi'
+ icon_state = "1"
+ random_icon_states = list("1","2","3","4","5")
+ var/list/drips = list()
+
+/obj/effect/decal/cleanable/blood/drip/New()
+ ..()
+ spawn(1)
+ drips |= icon_state
\ No newline at end of file
diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm
index 8fb093f8938..5e1ef66ee32 100644
--- a/code/game/objects/effects/spawners/bombspawner.dm
+++ b/code/game/objects/effects/spawners/bombspawner.dm
@@ -30,7 +30,7 @@
// radio
if (0)
var/obj/item/assembly/r_i_ptank/R = new /obj/item/assembly/r_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R)
+ var/obj/item/weapon/tank/internals/plasma/p3 = new /obj/item/weapon/tank/internals/plasma(R)
var/obj/item/device/radio/signaler/p1 = new /obj/item/device/radio/signaler(R)
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
R.part1 = p1
@@ -47,7 +47,7 @@
// proximity
if (1)
var/obj/item/assembly/m_i_ptank/R = new /obj/item/assembly/m_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R)
+ var/obj/item/weapon/tank/internals/plasma/p3 = new /obj/item/weapon/tank/internals/plasma(R)
var/obj/item/device/prox_sensor/p1 = new /obj/item/device/prox_sensor(R)
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
R.part1 = p1
@@ -69,7 +69,7 @@
// timer
if (2)
var/obj/item/assembly/t_i_ptank/R = new /obj/item/assembly/t_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R)
+ var/obj/item/weapon/tank/internals/plasma/p3 = new /obj/item/weapon/tank/internals/plasma(R)
var/obj/item/device/timer/p1 = new /obj/item/device/timer(R)
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
R.part1 = p1
@@ -85,7 +85,7 @@
//bombvest
if(3)
var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new /obj/item/clothing/suit/armor/a_i_a_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p4 = new /obj/item/weapon/tank/plasma(R)
+ var/obj/item/weapon/tank/internals/plasma/p4 = new /obj/item/weapon/tank/internals/plasma(R)
var/obj/item/device/healthanalyzer/p1 = new /obj/item/device/healthanalyzer(R)
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
var/obj/item/clothing/suit/armor/vest/p3 = new /obj/item/clothing/suit/armor/vest(R)
@@ -135,8 +135,8 @@
if (0)
var/obj/item/device/transfer_valve/V = new(src.loc)
- var/obj/item/weapon/tank/plasma/PT = new(V)
- var/obj/item/weapon/tank/oxygen/OT = new(V)
+ var/obj/item/weapon/tank/internals/plasma/PT = new(V)
+ var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/signaler/S = new(V)
@@ -158,8 +158,8 @@
if (1)
var/obj/item/device/transfer_valve/V = new(src.loc)
- var/obj/item/weapon/tank/plasma/PT = new(V)
- var/obj/item/weapon/tank/oxygen/OT = new(V)
+ var/obj/item/weapon/tank/internals/plasma/PT = new(V)
+ var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/prox_sensor/P = new(V)
@@ -182,8 +182,8 @@
// timer
if (2)
var/obj/item/device/transfer_valve/V = new(src.loc)
- var/obj/item/weapon/tank/plasma/PT = new(V)
- var/obj/item/weapon/tank/oxygen/OT = new(V)
+ var/obj/item/weapon/tank/internals/plasma/PT = new(V)
+ var/obj/item/weapon/tank/internals/oxygen/OT = new(V)
var/obj/item/device/assembly/timer/T = new(V)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 176fd79b61b..f29d9f39c9e 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -110,7 +110,7 @@
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 1,
/obj/item/weapon/storage/toolbox/mechanical = 1,
/obj/item/weapon/screwdriver = 3,
- /obj/item/weapon/tank/emergency_oxygen = 2,
+ /obj/item/weapon/tank/internals/emergency_oxygen = 2,
/obj/item/weapon/vending_refill/cola = 1,
/obj/item/weapon/weldingtool = 3,
/obj/item/weapon/wirecutters = 1,
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 1c665893f85..41877c85f4e 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -139,7 +139,7 @@ MASS SPECTROMETER
// Damage descriptions
- user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? " Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? " Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? " Severe burn damage detected" : "Subject burn injury status O.K", brute_loss > 50 ? " Severe anatomical damage detected" : "Subject brute-force injury status O.K"), 1)
+ user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? " Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? " Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? " Severe burn damage detected" : "Subject burn injury status O.K", brute_loss > 50 ? " Severe tissue damage detected" : "Subject brute-force injury status O.K"), 1)
if(M.getStaminaLoss())
user.show_message("Subject appears to be suffering from fatigue.", 1)
@@ -160,6 +160,24 @@ MASS SPECTROMETER
else if (M.getBrainLoss() >= 10)
user.show_message("Significant brain damage detected. Subject may have had a concussion.", 1)
+ // Blood Level
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.vessel)
+ if(H.blood_max)
+ user.show_message("Subject is bleeding!")
+ var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
+ var/blood_percent = blood_volume / 560
+ var/blood_type = H.dna.blood_type
+ blood_percent *= 100
+ if(blood_volume <= 500 && blood_volume > 336)
+ user.show_message("Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]")
+ else if(blood_volume <= 336)
+ user.show_message("Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. Type: [blood_type]")
+ else
+ user.show_message("Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]")
+
+
/obj/item/device/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
set category = "Object"
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 74ee638df91..b43cd46e735 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -9,51 +9,62 @@
throw_range = 7
var/heal_brute = 0
var/heal_burn = 0
+ var/stop_bleeding = 0
+ var/self_delay = 50
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
- if (M.stat == 2)
+ if(M.stat == 2)
var/t_him = "it"
- if (M.gender == MALE)
+ if(M.gender == MALE)
t_him = "him"
- else if (M.gender == FEMALE)
+ else if(M.gender == FEMALE)
t_him = "her"
user << "\The [M] is dead, you cannot help [t_him]!"
return
- if (!istype(M))
- user << "\The [src] cannot be applied to [M]!"
+ if(!istype(M))
+ user << "You don't know how to apply \the [src] to [M]..."
return 1
if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return 1
- if (user)
- if (M != user)
- user.visible_message( \
- "[user] has applied [src] on [M].", \
- "You apply \the [src] to [M]." \
- )
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(stop_bleeding)
+ if(H.bleedsuppress)
+ user << "[H]'s bleeding is already bandaged."
+ if(!H.blood_max)
+ user << "[H] isn't bleeding."
+
+ if(isliving(M))
+ if(!M.can_inject(user, 1))
+ return
+
+ if(user)
+ if(M != user)
+ user.visible_message("[user] applies [src] on [M].", "You apply [src] on [M].")
else
var/t_himself = "itself"
- if (user.gender == MALE)
+ if(user.gender == MALE)
t_himself = "himself"
- else if (user.gender == FEMALE)
+ else if(user.gender == FEMALE)
t_himself = "herself"
+ user.visible_message("[user] starts to apply [src] on [t_himself]...", "You begin applying [src] on yourself...")
+ if(!do_mob(user, M, self_delay)) return
+ user.visible_message("[user] applies [src] on [t_himself].", "You apply [src] on yourself.")
- user.visible_message( \
- "[M] applied [src] on [t_himself].", \
- "You apply \the [src] on yourself." \
- )
-
- if (istype(M, /mob/living/carbon/human))
+ if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
-
+ if(stop_bleeding)
+ if(!H.bleedsuppress) //so you can't stack bleed suppression
+ H.suppress_bloodloss(stop_bleeding)
if(affecting.status == ORGAN_ORGANIC) //Limb must be organic to be healed - RR
- if (affecting.heal_damage(src.heal_brute, src.heal_burn, 0))
+ if(affecting.heal_damage(src.heal_brute, src.heal_burn, 0))
H.update_damage_overlays(0)
M.updatehealth()
@@ -70,14 +81,29 @@
/obj/item/stack/medical/bruise_pack
name = "bruise pack"
singular_name = "bruise pack"
- desc = "A pack designed to treat blunt-force trauma."
+ desc = "A theraputic gel pack and bandages designed to treat blunt-force trauma."
icon_state = "brutepack"
- heal_brute = 60
+ heal_brute = 40
origin_tech = "biotech=1"
+/obj/item/stack/medical/gauze
+ name = "medical gauze"
+ desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, but does not heal wounds."
+ gender = PLURAL
+ singular_name = "medical gauze"
+ icon_state = "gauze"
+ stop_bleeding = 1800
+ self_delay = 80
+
+/obj/item/stack/medical/gauze/improvised
+ name = "improvised gauze"
+ singular_name = "improvised gauze"
+ desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds."
+ stop_bleeding = 900
+
/obj/item/stack/medical/ointment
name = "ointment"
- desc = "Used to treat those nasty burns."
+ desc = "Used to treat those nasty burn wounds."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 4b25d6fd02c..f3ad7db4378 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -8,6 +8,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
desc = "Some rods. Can be used for building, or something."
singular_name = "metal rod"
icon_state = "rods"
+ item_state = "rods"
flags = CONDUCT
w_class = 3.0
force = 9.0
@@ -21,8 +22,15 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
/obj/item/stack/rods/New(var/loc, var/amount=null)
recipes = rod_recipes
+ update_icon()
return ..()
+/obj/item/stack/rods/update_icon()
+ if(get_amount() <= 5)
+ icon_state = "rods-[get_amount()]"
+ else
+ icon_state = "rods"
+
/obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/weldingtool))
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index 9ab05593915..a3e8959f9a8 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -177,6 +177,7 @@
if(usr)
usr.unEquip(src, 1)
qdel(src)
+ update_icon()
return 1
/obj/item/stack/proc/add(var/amount)
@@ -184,6 +185,7 @@
source.add_charge(amount * cost)
else
src.amount += amount
+ update_icon()
/obj/item/stack/proc/add_to_stacks(mob/usr as mob)
var/obj/item/stack/oldsrc = src
@@ -199,6 +201,7 @@
usr << "You add new [item.singular_name] to the stack. It now contains [item.amount] [item.singular_name]\s."
if(oldsrc.amount <= 0)
break
+ oldsrc.update_icon()
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
@@ -240,6 +243,7 @@
src.use(to_transfer)
if (src && usr.machine==src)
spawn(0) src.interact(usr)
+ S.update_icon()
else
..()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index db374f48f67..6c21bea8066 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -14,6 +14,7 @@
* Fake meteor
* Carp plushie
* Foam armblade
+ * Toy big red button
*/
@@ -1091,4 +1092,28 @@ obj/item/toy/cards/deck/syndicate
desc = "An adorable stuffed toy that resembles a space carp."
icon = 'icons/obj/toy.dmi'
icon_state = "carpplushie"
- w_class = 2.0
\ No newline at end of file
+ w_class = 2.0
+
+/*
+ * Toy big red button
+ */
+/obj/item/toy/redbutton
+ name = "big red button"
+ desc = "A big, plastic red button. Reads 'From HonkCo Pranks©' on the back."
+ icon = 'icons/obj/assemblies.dmi'
+ icon_state = "bigred"
+ w_class = 2.0
+ var/cooldown = 0
+
+/obj/item/toy/redbutton/attack_self(mob/user)
+ if (cooldown < world.time)
+ cooldown = (world.time + 300) // Sets cooldown at 30 seconds
+ user.visible_message("[user] presses the big red button.", "You press the button, it plays a loud noise!", "The button clicks loudly.")
+ playsound(src, 'sound/effects/explosionfar.ogg', 50, 0, surround = 0)
+ for(var/mob/M in range(10, src)) // Checks range
+ if(!M.stat && !istype(M, /mob/living/silicon/ai)) // Checks to make sure whoever's getting shaken is alive/not the AI
+ sleep(8) // Short delay to match up with the explosion sound
+ shake_camera(M, 2, 1) // Shakes player camera 2 squares for 1 second.
+
+ else
+ user << "Nothing happens."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index b31b1ea09c7..19d17f14778 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -103,12 +103,13 @@ RCD
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
..()
if(istype(W, /obj/item/weapon/rcd_ammo))
- if((matter + 20) > max_matter)
+ var/obj/item/weapon/rcd_ammo/R = W
+ if((matter + R.ammoamt) > max_matter)
user << "The RCD cant hold any more matter-units."
return
user.drop_item()
qdel(W)
- matter += 20
+ matter += R.ammoamt
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user << "The RCD now holds [matter]/[max_matter] matter-units."
desc = "A RCD. It currently holds [matter]/[max_matter] matter-units."
@@ -265,6 +266,15 @@ RCD
desc = "A device used to rapidly build walls/floor."
canRwall = 1
+/obj/item/weapon/rcd/loaded
+ matter = 100
+
+/obj/item/weapon/rcd/combat
+ name = "combat RCD"
+ max_matter = 500
+ matter = 500
+ canRwall = 1
+
/obj/item/weapon/rcd_ammo
name = "compressed matter cartridge"
desc = "Highly compressed matter for the RCD."
@@ -277,3 +287,7 @@ RCD
origin_tech = "materials=2"
m_amt = 16000
g_amt = 8000
+ var/ammoamt = 20
+
+/obj/item/weapon/rcd_ammo/large
+ ammoamt = 100
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index f232c647fe8..60fc902e23e 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -196,19 +196,22 @@ update_label("John Doe", "Clowny")
icon_state = "centcom"
registered_name = "Emergency Response Team Commander"
assignment = "Emergency Response Team Commander"
- New() access = get_all_accesses()
+ New() access = get_all_accesses()+get_ert_access("commander")
/obj/item/weapon/card/id/ert/Security
registered_name = "Security Response Officer"
assignment = "Security Response Officer"
+ New() access = get_all_accesses()+get_ert_access("sec")
/obj/item/weapon/card/id/ert/Engineer
registered_name = "Engineer Response Officer"
assignment = "Engineer Response Officer"
+ New() access = get_all_accesses()+get_ert_access("eng")
/obj/item/weapon/card/id/ert/Medical
registered_name = "Medical Response Officer"
assignment = "Medical Response Officer"
+ New() access = get_all_accesses()+get_ert_access("med")
/obj/item/weapon/card/id/prisoner
name = "prisoner ID card"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 01a96fbf6c6..216812720b3 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -110,6 +110,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/smoketime = 300
var/chem_volume = 30
+/obj/item/clothing/mask/cigarette/suicide_act(mob/user)
+ user.visible_message("[user] is huffing the [src.name] as quickly as they can! It looks like \he's trying to give \himself cancer.")
+ return (TOXLOSS|OXYLOSS)
+
/obj/item/clothing/mask/cigarette/New()
..()
flags |= NOREACT // so it doesn't react until you light it
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index 3354f1f5b0c..1fa74f76454 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -18,7 +18,7 @@
var/operating = 0//cooldown
var/obj/item/weapon/weldingtool/weldtool = null
var/obj/item/device/assembly/igniter/igniter = null
- var/obj/item/weapon/tank/plasma/ptank = null
+ var/obj/item/weapon/tank/internals/plasma/ptank = null
/obj/item/weapon/flamethrower/Destroy()
@@ -100,7 +100,7 @@
update_icon()
return
- if(istype(W,/obj/item/weapon/tank/plasma))
+ if(istype(W,/obj/item/weapon/tank/internals/plasma))
if(ptank)
user << "There appears to already be a plasma tank loaded in [src]!"
return
@@ -204,5 +204,5 @@
/obj/item/weapon/flamethrower/full/tank/New(var/loc)
..()
- ptank = new /obj/item/weapon/tank/plasma/full(src)
+ ptank = new /obj/item/weapon/tank/internals/plasma/full(src)
update_icon()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 2098d686ea9..ac865a96dc5 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -203,8 +203,11 @@
qdel(src) //correctly before deleting the grenade.
/obj/item/weapon/grenade/chem_grenade/proc/mix_reagents()
+ var/total_temp
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
G.reagents.trans_to(src, G.reagents.total_volume)
+ total_temp += G.reagents.chem_temp
+ reagents.chem_temp = total_temp
/obj/item/weapon/grenade/chem_grenade/proc/can_flood_from(myloc, maxrange)
var/list/reachable = list(myloc)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 3020a6d1acc..ad243908696 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -153,7 +153,8 @@
var/armed = 0
/obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user)
- user.visible_message("[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is sticking \his head in the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return (BRUTELOSS)
/obj/item/weapon/restraints/legcuffs/beartrap/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index fceaa3c4193..448673346eb 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -16,6 +16,7 @@
g_amt = 50
var/rigged = 0 // true if rigged to explode
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
+ var/chargerate = 100 //how much power is given every tick in a recharger
/obj/item/weapon/stock_parts/cell/suicide_act(mob/user)
user.visible_message("[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.")
@@ -44,6 +45,20 @@
..()
charge = 0
+/obj/item/weapon/stock_parts/cell/pulse //40 pulse shots
+ name = "pulse rifle power cell"
+ maxcharge = 8000
+ rating = 3
+ chargerate = 1500
+
+/obj/item/weapon/stock_parts/cell/pulse/carbine //25 pulse shots
+ name = "pulse carbine power cell"
+ maxcharge = 5000
+
+/obj/item/weapon/stock_parts/cell/pulse/pistol //10 pulse shots
+ name = "pulse pistol power cell"
+ maxcharge = 2000
+
/obj/item/weapon/stock_parts/cell/high
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
@@ -51,6 +66,7 @@
maxcharge = 10000
g_amt = 60
rating = 3
+ chargerate = 1500
/obj/item/weapon/stock_parts/cell/high/empty/New()
..()
@@ -63,6 +79,7 @@
maxcharge = 20000
g_amt = 70
rating = 4
+ chargerate = 2000
/obj/item/weapon/stock_parts/cell/super/empty/New()
..()
@@ -75,6 +92,7 @@
maxcharge = 30000
g_amt = 80
rating = 5
+ chargerate = 3000
/obj/item/weapon/stock_parts/cell/hyper/empty/New()
..()
@@ -87,6 +105,7 @@
maxcharge = 30000
g_amt = 80
rating = 6
+ chargerate = 30000
use()
return 1
@@ -103,16 +122,15 @@
minor_fault = 1
rating = 1
-/obj/item/weapon/stock_parts/cell/slime
+/obj/item/weapon/stock_parts/cell/high/slime
name = "charged slime core"
desc = "A yellow slime core infused with plasma, it crackles with power."
origin_tech = "powerstorage=2;biotech=4"
- icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
- icon_state = "yellow slime extract" //"potato_battery"
- maxcharge = 10000
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "yellow slime extract"
m_amt = 0
g_amt = 0
- rating = 3
+
/obj/item/weapon/stock_parts/cell/emproof
name = "\improper EMP-proof cell"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 7d9c1ec5575..bbc33441f3a 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -39,6 +39,10 @@
can_hold = list() // any
cant_hold = list(/obj/item/weapon/disk/nuclear)
+/obj/item/weapon/storage/bag/trash/suicide_act(mob/user)
+ user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!")
+ playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1)
+ return (TOXLOSS)
/obj/item/weapon/storage/bag/trash/update_icon()
if(contents.len == 0)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 7c027cd2789..c3ac412ca4e 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -33,6 +33,7 @@
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/multitool(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index f8bca96b67f..136d250eec9 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -18,6 +18,10 @@
var/mob/affecting = null
var/deity_name = "Christ"
+/obj/item/weapon/storage/book/bible/suicide_act(mob/user)
+ user.visible_message("[user] is offering \himself to [src.deity_name]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
+
/obj/item/weapon/storage/book/bible/booze
name = "bible"
desc = "To be applied to the head repeatedly."
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 467ca497767..2a26329b210 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -62,7 +62,7 @@
..()
contents = list()
new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
return
@@ -72,7 +72,7 @@
..()
contents = list()
new /obj/item/clothing/mask/breath(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
return
@@ -601,4 +601,19 @@
new /obj/item/clothing/tie/armband/deputy(src)
new /obj/item/clothing/tie/armband/deputy(src)
new /obj/item/clothing/tie/armband/deputy(src)
- new /obj/item/clothing/tie/armband/deputy(src)
\ No newline at end of file
+ new /obj/item/clothing/tie/armband/deputy(src)
+
+/obj/item/weapon/storage/box/metalfoam
+ name = "box of metal foam grenades"
+ desc = "To be used to rapidly seal hull breaches"
+ icon_state = "flashbang"
+
+/obj/item/weapon/storage/box/metalfoam/New()
+ ..()
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index e4e6391a97d..6901e0e41af 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -16,117 +16,112 @@
throw_range = 7
var/empty = 0
+/obj/item/weapon/storage/firstaid/regular
+ icon_state = "firstaid"
+ desc = "A first aid kit with the ability to heal common types of injuries."
+
+/obj/item/weapon/storage/firstaid/regular/New()
+ ..()
+ if(empty) return
+ new /obj/item/stack/medical/gauze(src)
+ new /obj/item/stack/medical/bruise_pack(src)
+ new /obj/item/stack/medical/bruise_pack(src)
+ new /obj/item/stack/medical/ointment(src)
+ new /obj/item/stack/medical/ointment(src)
+ new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
+ new /obj/item/device/healthanalyzer(src)
+ return
/obj/item/weapon/storage/firstaid/fire
- name = "fire first-aid kit"
- desc = "It's an emergency medical kit for when the toxins lab -spontaneously- burns down."
+ name = "burn treatment kit"
+ desc = "A specialized medical kit for when the toxins lab -spontaneously- burns down."
icon_state = "ointment"
item_state = "firstaid-ointment"
/obj/item/weapon/storage/firstaid/fire/New()
..()
- if (empty) return
-
+ if(empty) return
icon_state = pick("ointment","firefirstaid")
-
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
+ new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
- new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
- return
-
-
-/obj/item/weapon/storage/firstaid/regular
- icon_state = "firstaid"
-
-/obj/item/weapon/storage/firstaid/regular/New()
- ..()
- if (empty) return
- new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
- new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
- new /obj/item/weapon/reagent_containers/pill/salicyclic(src)
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
new /obj/item/device/healthanalyzer(src)
- new /obj/item/weapon/reagent_containers/hypospray/medipen( src )
return
/obj/item/weapon/storage/firstaid/toxin
- name = "toxin first aid"
- desc = "Used to treat when you have a high amoutn of toxins in your body."
+ name = "toxin treatment kit"
+ desc = "Used to treat toxic blood content and radiation poisoning."
icon_state = "antitoxin"
item_state = "firstaid-toxin"
/obj/item/weapon/storage/firstaid/toxin/New()
..()
- if (empty) return
-
+ if(empty) return
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
-
- new /obj/item/weapon/reagent_containers/syringe/charcoal( src )
- new /obj/item/weapon/reagent_containers/syringe/charcoal( src )
- new /obj/item/weapon/reagent_containers/syringe/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/device/healthanalyzer( src )
+ new /obj/item/weapon/reagent_containers/syringe/charcoal(src)
+ new /obj/item/weapon/reagent_containers/syringe/charcoal(src)
+ new /obj/item/weapon/reagent_containers/syringe/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/device/healthanalyzer(src)
return
/obj/item/weapon/storage/firstaid/o2
- name = "oxygen deprivation first aid"
+ name = "oxygen deprivation treatment kit"
desc = "A box full of oxygen goodies."
icon_state = "o2"
item_state = "firstaid-o2"
/obj/item/weapon/storage/firstaid/o2/New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/weapon/reagent_containers/pill/salbutamol(src)
new /obj/item/weapon/reagent_containers/pill/salbutamol(src)
new /obj/item/weapon/reagent_containers/pill/salbutamol(src)
new /obj/item/weapon/reagent_containers/pill/salbutamol(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
- new /obj/item/device/healthanalyzer( src )
+ new /obj/item/device/healthanalyzer(src)
return
/obj/item/weapon/storage/firstaid/brute
- name = "brute first aid"
+ name = "brute trauma treatment kit"
desc = "A first aid kit for when you get toolboxed."
icon_state = "brute"
item_state = "firstaid-brute"
/obj/item/weapon/storage/firstaid/brute/New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
- new /obj/item/device/healthanalyzer( src )
- new /obj/item/weapon/reagent_containers/hypospray/medipen(src)
- new /obj/item/stack/medical/bruise_pack(src)
+ new /obj/item/stack/medical/gauze(src)
+ new /obj/item/stack/medical/gauze(src)
+ new /obj/item/device/healthanalyzer(src)
return
/obj/item/weapon/storage/firstaid/tactical
- name = "first-aid kit"
- icon_state = "bezerk"
+ name = "combat medical kit"
desc = "I hope you've got insurance."
+ icon_state = "bezerk"
max_w_class = 3
/obj/item/weapon/storage/firstaid/tactical/New()
..()
- if (empty) return
- new /obj/item/clothing/tie/stethoscope( src )
- new /obj/item/weapon/surgicaldrill ( src )
- new /obj/item/weapon/reagent_containers/hypospray/combat( src )
- new /obj/item/weapon/reagent_containers/pill/patch/styptic( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/syringe/lethal/choral( src )
- new /obj/item/clothing/glasses/hud/health/night( src )
+ if(empty) return
+ new /obj/item/stack/medical/gauze(src)
+ new /obj/item/stack/medical/gauze(src)
+ new /obj/item/weapon/reagent_containers/hypospray/combat(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/styptic(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/syringe/lethal/choral(src)
+ new /obj/item/clothing/glasses/hud/health/night(src)
return
@@ -146,11 +141,11 @@
/obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri
- if (ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
+ if(ishuman(usr) || ismonkey(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
var/mob/M = usr
- if (!istype(over_object, /obj/screen) || !Adjacent(M))
+ if(!istype(over_object, /obj/screen) || !Adjacent(M))
return ..()
- if ((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
+ if((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
switch(over_object.name)
if("r_hand")
M.unEquip(src)
@@ -161,7 +156,7 @@
src.add_fingerprint(usr)
return
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
- if (usr.s_active)
+ if(usr.s_active)
usr.s_active.close(usr)
src.show_to(usr)
return
@@ -173,13 +168,13 @@
/obj/item/weapon/storage/box/silver_sulf/New()
..()
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
- new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf( src )
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/weapon/reagent_containers/pill/patch/silver_sulf(src)
/obj/item/weapon/storage/pill_bottle/charcoal
@@ -188,13 +183,13 @@
/obj/item/weapon/storage/pill_bottle/charcoal/New()
..()
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
- new /obj/item/weapon/reagent_containers/pill/charcoal( src )
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
+ new /obj/item/weapon/reagent_containers/pill/charcoal(src)
/obj/item/weapon/storage/pill_bottle/epinephrine
name = "bottle of epinephrine pills"
@@ -202,13 +197,13 @@
/obj/item/weapon/storage/pill_bottle/epinephrine/New()
..()
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
- new /obj/item/weapon/reagent_containers/pill/epinephrine( src )
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
+ new /obj/item/weapon/reagent_containers/pill/epinephrine(src)
/obj/item/weapon/storage/pill_bottle/mutadone
name = "bottle of mutadone pills"
@@ -244,11 +239,11 @@
/obj/item/weapon/storage/pill_bottle/stimulant/New()
..()
- new /obj/item/weapon/reagent_containers/pill/stimulant( src )
- new /obj/item/weapon/reagent_containers/pill/stimulant( src )
- new /obj/item/weapon/reagent_containers/pill/stimulant( src )
- new /obj/item/weapon/reagent_containers/pill/stimulant( src )
- new /obj/item/weapon/reagent_containers/pill/stimulant( src )
+ new /obj/item/weapon/reagent_containers/pill/stimulant(src)
+ new /obj/item/weapon/reagent_containers/pill/stimulant(src)
+ new /obj/item/weapon/reagent_containers/pill/stimulant(src)
+ new /obj/item/weapon/reagent_containers/pill/stimulant(src)
+ new /obj/item/weapon/reagent_containers/pill/stimulant(src)
/obj/item/weapon/storage/pill_bottle/dice
name = "bag of dice"
@@ -258,11 +253,11 @@
/obj/item/weapon/storage/pill_bottle/dice/New()
..()
- new /obj/item/weapon/dice/d4( src )
- new /obj/item/weapon/dice( src )
- new /obj/item/weapon/dice/d8( src )
- new /obj/item/weapon/dice/d10( src )
- new /obj/item/weapon/dice/d00( src )
- new /obj/item/weapon/dice/d12( src )
- new /obj/item/weapon/dice/d20( src )
+ new /obj/item/weapon/dice/d4(src)
+ new /obj/item/weapon/dice(src)
+ new /obj/item/weapon/dice/d8(src)
+ new /obj/item/weapon/dice/d10(src)
+ new /obj/item/weapon/dice/d00(src)
+ new /obj/item/weapon/dice/d12(src)
+ new /obj/item/weapon/dice/d20(src)
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 6af3b539a8b..12c4f8d1a13 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -10,24 +10,24 @@
/*
* Oxygen
*/
-/obj/item/weapon/tank/oxygen
+/obj/item/weapon/tank/internals/oxygen
name = "oxygen tank"
desc = "A tank of oxygen."
icon_state = "oxygen"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
-/obj/item/weapon/tank/oxygen/New()
+/obj/item/weapon/tank/internals/oxygen/New()
..()
src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
-/obj/item/weapon/tank/oxygen/yellow
+/obj/item/weapon/tank/internals/oxygen/yellow
desc = "A tank of oxygen, this one is yellow."
icon_state = "oxygen_f"
-/obj/item/weapon/tank/oxygen/red
+/obj/item/weapon/tank/internals/oxygen/red
desc = "A tank of oxygen, this one is red."
icon_state = "oxygen_fr"
@@ -35,13 +35,13 @@
/*
* Anesthetic
*/
-/obj/item/weapon/tank/anesthetic
+/obj/item/weapon/tank/internals/anesthetic
name = "anesthetic tank"
desc = "A tank with an N2O/O2 gas mix."
icon_state = "anesthetic"
item_state = "an_tank"
-/obj/item/weapon/tank/anesthetic/New()
+/obj/item/weapon/tank/internals/anesthetic/New()
..()
src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
@@ -55,13 +55,13 @@
/*
* Air
*/
-/obj/item/weapon/tank/air
+/obj/item/weapon/tank/internals/air
name = "air tank"
desc = "Mixed anyone?"
icon_state = "oxygen"
-/obj/item/weapon/tank/air/New()
+/obj/item/weapon/tank/internals/air/New()
..()
src.air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
@@ -72,7 +72,7 @@
/*
* Plasma
*/
-/obj/item/weapon/tank/plasma
+/obj/item/weapon/tank/internals/plasma
name = "plasma tank"
desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable."
icon_state = "plasma"
@@ -80,13 +80,13 @@
slot_flags = null //they have no straps!
-/obj/item/weapon/tank/plasma/New()
+/obj/item/weapon/tank/internals/plasma/New()
..()
src.air_contents.toxins = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
-/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/item/weapon/tank/internals/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/flamethrower))
@@ -98,7 +98,7 @@
src.loc = F
return
-/obj/item/weapon/tank/plasma/full/New()
+/obj/item/weapon/tank/internals/plasma/full/New()
..()
src.air_contents.toxins = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -106,7 +106,7 @@
/*
* Emergency Oxygen
*/
-/obj/item/weapon/tank/emergency_oxygen
+/obj/item/weapon/tank/internals/emergency_oxygen
name = "emergency oxygen tank"
desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it."
icon_state = "emergency"
@@ -118,17 +118,17 @@
volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
-/obj/item/weapon/tank/emergency_oxygen/New()
+/obj/item/weapon/tank/internals/emergency_oxygen/New()
..()
src.air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
-/obj/item/weapon/tank/emergency_oxygen/engi
+/obj/item/weapon/tank/internals/emergency_oxygen/engi
name = "extended-capacity emergency oxygen tank"
icon_state = "emergency_engi"
volume = 6
-/obj/item/weapon/tank/emergency_oxygen/double
+/obj/item/weapon/tank/internals/emergency_oxygen/double
name = "double emergency oxygen tank"
icon_state = "emergency_engi"
volume = 10
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 58b32e8abde..f7e967becc0 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -28,6 +28,10 @@
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+/obj/item/weapon/wrench/suicide_act(mob/user)
+ user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return (BRUTELOSS)
/*
* Screwdriver
@@ -126,6 +130,11 @@
else
..()
+/obj/item/weapon/wirecutters/suicide_act(mob/user)
+ user.visible_message("[user] is cutting at \his arteries with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
/*
* Welding Tool
*/
@@ -447,6 +456,11 @@
origin_tech = "engineering=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
+/obj/item/weapon/crowbar/suicide_act(mob/user)
+ user.visible_message("[user] is beating \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
/obj/item/weapon/crowbar/red
icon = 'icons/obj/items.dmi'
icon_state = "red_crowbar"
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 289ecce7fd6..89a20dc21ca 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -32,6 +32,12 @@ LINEN BINS
add_fingerprint(user)
return
+/obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/weapon/shard))
+ new /obj/item/stack/medical/gauze/improvised(src.loc)
+ qdel(src)
+ user << "You tear [src] up."
+ ..()
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index c701cc054a5..c22b32d12b2 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -6,6 +6,7 @@
/obj/structure/closet/athletic_mixed/New()
..()
+ new /obj/item/clothing/under/shorts/purple(src)
new /obj/item/clothing/under/shorts/grey(src)
new /obj/item/clothing/under/shorts/black(src)
new /obj/item/clothing/under/shorts/red(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index af573d346f1..e4c16bf5bba 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -37,7 +37,7 @@
new /obj/item/clothing/gloves/fingerless(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
new /obj/item/clothing/suit/fire/firefighter(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/clothing/head/soft(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 75c5298b2d2..8484f67c549 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -105,7 +105,7 @@
new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/shoes/sneakers/orange(src)
+ new /obj/item/clothing/shoes/workboots(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
// new /obj/item/weapon/cartridge/engineering(src)
new /obj/item/device/radio/headset/headset_eng(src)
@@ -132,7 +132,7 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/weapon/storage/backpack/satchel_norm(src)
new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
- new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen/engi(src)
new /obj/item/weapon/watertank/atmos(src)
new /obj/item/clothing/suit/fire/atmos(src)
new /obj/item/clothing/head/hardhat/atmos(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index f8659cfbd55..a47ecc0f87e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -46,9 +46,9 @@
/obj/structure/closet/secure_closet/medical2/New()
..()
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
- new /obj/item/weapon/tank/anesthetic(src)
+ new /obj/item/weapon/tank/internals/anesthetic(src)
+ new /obj/item/weapon/tank/internals/anesthetic(src)
+ new /obj/item/weapon/tank/internals/anesthetic(src)
new /obj/item/clothing/mask/breath/medical(src)
new /obj/item/clothing/mask/breath/medical(src)
new /obj/item/clothing/mask/breath/medical(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
new file mode 100644
index 00000000000..c18e2ca667c
--- /dev/null
+++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
@@ -0,0 +1,94 @@
+/obj/structure/closet/secure_closet/ertCom
+ name = "commander's closet"
+ desc = "Emergency Response Team equipment locker."
+ req_access = list(access_cent_captain)
+ icon_state = "capsecure1"
+ icon_closed = "capsecure"
+ icon_locked = "capsecure1"
+ icon_opened = "capsecureopen"
+ icon_broken = "capsecurebroken"
+ icon_off = "capsecureoff"
+
+/obj/structure/closet/secure_closet/ertCom/New()
+ ..()
+ new /obj/item/weapon/storage/firstaid/regular(src)
+ new /obj/item/weapon/storage/box/handcuffs(src)
+ new /obj/item/device/aicard(src)
+ new /obj/item/weapon/melee/baton/loaded(src)
+ new /obj/item/device/flash/handheld(src)
+ if(prob(50))
+ new /obj/item/ammo_box/magazine/m50(src)
+ new /obj/item/ammo_box/magazine/m50(src)
+ new /obj/item/weapon/gun/projectile/automatic/pistol/deagle(src)
+ else
+ new /obj/item/ammo_box/a357(src)
+ new /obj/item/ammo_box/a357(src)
+ new /obj/item/weapon/gun/projectile/revolver/mateba(src)
+ return
+
+/obj/structure/closet/secure_closet/ertSec
+ name = "security closet"
+ desc = "Emergency Response Team equipment locker."
+ req_access = list(access_cent_specops)
+ icon_state = "hossecure1"
+ icon_closed = "hossecure"
+ icon_locked = "hossecure1"
+ icon_opened = "hossecureopen"
+ icon_broken = "hossecurebroken"
+ icon_off = "hossecureoff"
+
+/obj/structure/closet/secure_closet/ertSec/New()
+ ..()
+ new /obj/item/weapon/storage/box/flashbangs(src)
+ new /obj/item/weapon/storage/box/teargas(src)
+ new /obj/item/weapon/storage/box/flashes(src)
+ new /obj/item/weapon/storage/box/handcuffs(src)
+ new /obj/item/weapon/melee/baton/loaded(src)
+ new /obj/item/weapon/shield/riot/tele(src)
+ return
+
+/obj/structure/closet/secure_closet/ertMed
+ name = "medical closet"
+ desc = "Emergency Response Team equipment locker."
+ req_access = list(access_cent_medical)
+ icon_state = "cmosecure1"
+ icon_closed = "cmosecure"
+ icon_locked = "cmosecure1"
+ icon_opened = "cmosecureopen"
+ icon_broken = "cmosecurebroken"
+ icon_off = "cmosecureoff"
+
+/obj/structure/closet/secure_closet/ertMed/New()
+ ..()
+ new /obj/item/weapon/storage/firstaid/o2(src)
+ new /obj/item/weapon/storage/firstaid/toxin(src)
+ new /obj/item/weapon/storage/firstaid/fire(src)
+ new /obj/item/weapon/storage/firstaid/brute(src)
+ new /obj/item/weapon/storage/firstaid/regular(src)
+ new /obj/item/weapon/melee/baton/loaded(src)
+ new /obj/machinery/bot/medbot(src)
+ return
+
+/obj/structure/closet/secure_closet/ertEngi
+ name = "engineer closet"
+ desc = "Emergency Response Team equipment locker."
+ req_access = list(access_cent_storage)
+ icon_state = "securece1"
+ icon_closed = "securece"
+ icon_locked = "securece1"
+ icon_opened = "secureceopen"
+ icon_broken = "securecebroken"
+ icon_off = "secureceoff"
+
+/obj/structure/closet/secure_closet/ertEngi/New()
+ ..()
+ new /obj/item/stack/sheet/plasteel(src, 50)
+ new /obj/item/stack/sheet/metal(src, 50)
+ new /obj/item/stack/sheet/glass(src, 50)
+ new /obj/item/clothing/shoes/magboots(src)
+ new /obj/item/weapon/storage/box/metalfoam(src)
+ new /obj/item/weapon/melee/baton/loaded(src)
+ new /obj/item/weapon/rcd_ammo/large(src)
+ new /obj/item/weapon/rcd_ammo/large(src)
+ new /obj/item/weapon/rcd_ammo/large(src)
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 86db3895e78..1179a079e6e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -15,7 +15,7 @@
new /obj/item/clothing/shoes/sneakers/white(src)
// new /obj/item/weapon/cartridge/signal/toxins(src)
new /obj/item/device/radio/headset/headset_sci(src)
- new /obj/item/weapon/tank/air(src)
+ new /obj/item/weapon/tank/internals/air(src)
new /obj/item/clothing/mask/gas(src)
return
@@ -44,7 +44,7 @@
new /obj/item/clothing/shoes/sneakers/white(src)
new /obj/item/clothing/gloves/color/latex(src)
new /obj/item/device/radio/headset/heads/rd(src)
- new /obj/item/weapon/tank/air(src)
+ new /obj/item/weapon/tank/internals/air(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/suit/armor/reactive(src)
new /obj/item/device/flash/handheld(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 2f3d9932bda..0cdf06406cf 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -5,49 +5,6 @@
icon_closed = "syndicate"
icon_opened = "syndicateopen"
-/obj/structure/closet/syndicate/ertCom/New()
- name = "commanders closet"
- desc = "Emergency Response Team equipment locker"
- icon_state = "capsecureoff"
- icon_closed = "capsecureoff"
- icon_opened = "capsecureopen"
-// new /obj/item/weapon/card/id/ert(src)
- new /obj/item/weapon/storage/backpack/captain(src)
- return
-
-/obj/structure/closet/syndicate/ertSec/New()
- name = "security closet"
- desc = "Emergency Response Team equipment locker"
- icon_state = "secoff"
- icon_closed = "secoff"
- icon_opened = "secopen"
- new /obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol/loyalpin(src)
- new /obj/item/weapon/card/id/ert/Security(src)
- new /obj/item/weapon/storage/backpack/security(src)
- return
-
-/obj/structure/closet/syndicate/ertMed/New()
- name = "medical closet"
- desc = "Emergency Response Team equipment locker"
- icon_state = "securemedoff"
- icon_closed = "securemedoff"
- icon_opened = "securemedopen"
- new /obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol/loyalpin(src)
- new /obj/item/weapon/card/id/ert/Medical(src)
- new /obj/item/weapon/storage/backpack/medic(src)
- return
-
-/obj/structure/closet/syndicate/ertEngi/New()
- name = "engineer closet"
- desc = "Emergency Response Team equipment locker"
- icon_state = "secureengoff"
- icon_closed = "secureengoff"
- icon_opened = "secureengopen"
- new /obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol/loyalpin(src)
- new /obj/item/weapon/card/id/ert/Engineer(src)
- new /obj/item/weapon/storage/backpack/industrial(src)
- return
-
/obj/structure/closet/syndicate/personal
desc = "It's a personal storage unit for operative gear."
@@ -168,4 +125,4 @@
var/obj/item/stack/R = new res(src)
R.amount = R.max_amount
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 27c2655da50..7fb6712b9e7 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -27,18 +27,18 @@
switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 4, "delete" = 1)))
if ("small")
- new /obj/item/weapon/tank/emergency_oxygen(src)
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
if ("aid")
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/weapon/storage/firstaid/o2(src)
if ("tank")
- new /obj/item/weapon/tank/air(src)
+ new /obj/item/weapon/tank/internals/air(src)
if ("both")
- new /obj/item/weapon/tank/emergency_oxygen(src)
+ new /obj/item/weapon/tank/internals/emergency_oxygen(src)
new /obj/item/clothing/mask/breath(src)
if ("nothing")
@@ -54,7 +54,7 @@
qdel(src)*/
/obj/structure/closet/emcloset/legacy/New()
- new /obj/item/weapon/tank/oxygen(src)
+ new /obj/item/weapon/tank/internals/oxygen(src)
new /obj/item/clothing/mask/gas(src)
/*
@@ -72,7 +72,7 @@
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/mask/gas(src)
- new /obj/item/weapon/tank/oxygen/red(src)
+ new /obj/item/weapon/tank/internals/oxygen/red(src)
new /obj/item/weapon/extinguisher(src)
new /obj/item/clothing/head/hardhat/red(src)
@@ -83,7 +83,7 @@
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/flashlight(src)
- new /obj/item/weapon/tank/oxygen/red(src)
+ new /obj/item/weapon/tank/internals/oxygen/red(src)
new /obj/item/weapon/extinguisher(src)
new /obj/item/clothing/head/hardhat/red(src)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 9f7497781cb..5a8bc0ca53d 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -251,13 +251,9 @@
user << "You'll need the keys in one of your hands to drive this [callme]."
-/obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/M, mob/user)
- if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon))
- return
-
- ..()
-
+/obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user)
M.loc = loc
+ ..()
update_mob()
/obj/structure/stool/bed/chair/janicart/unbuckle_mob()
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 8a1591531a0..bfb9df96d7f 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -123,4 +123,29 @@
/obj/structure/sign/botany
name = "\improper HYDROPONICS"
desc = "A warning sign which reads 'HYDROPONICS'"
- icon_state = "hydro1"
\ No newline at end of file
+ icon_state = "hydro1"
+
+/obj/structure/sign/directions/science
+ name = "science department"
+ desc = "A direction sign, pointing out which way the Science department is."
+ icon_state = "direction_sci"
+
+/obj/structure/sign/directions/engineering
+ name = "engineering department"
+ desc = "A direction sign, pointing out which way the Engineering department is."
+ icon_state = "direction_eng"
+
+/obj/structure/sign/directions/security
+ name = "security department"
+ desc = "A direction sign, pointing out which way the Security department is."
+ icon_state = "direction_sec"
+
+/obj/structure/sign/directions/medical
+ name = "medical bay"
+ desc = "A direction sign, pointing out which way the Medical Bay is."
+ icon_state = "direction_med"
+
+/obj/structure/sign/directions/evac
+ name = "escape arm"
+ desc = "A direction sign, pointing out which way the escape shuttle dock is."
+ icon_state = "direction_evac"
\ No newline at end of file
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 0dcf0f5f451..06f5aa67d74 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -48,7 +48,7 @@
/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
+ if(istype(I, /obj/item/weapon/tank/internals/oxygen) || istype(I, /obj/item/weapon/tank/internals/air) || istype(I, /obj/item/weapon/tank/internals/anesthetic))
if(oxygentanks < 10)
user.drop_item()
I.loc = src
@@ -57,7 +57,7 @@
user << "You put [I] in [src]."
else
user << "[src] is full."
- if(istype(I, /obj/item/weapon/tank/plasma))
+ if(istype(I, /obj/item/weapon/tank/internals/plasma))
if(plasmatanks < 10)
user.drop_item()
I.loc = src
@@ -76,24 +76,24 @@
usr.set_machine(src)
if(href_list["oxygen"])
if(oxygentanks > 0)
- var/obj/item/weapon/tank/oxygen/O
+ var/obj/item/weapon/tank/internals/oxygen/O
if(oxytanks.len == oxygentanks)
O = oxytanks[1]
oxytanks.Remove(O)
else
- O = new /obj/item/weapon/tank/oxygen(loc)
+ O = new /obj/item/weapon/tank/internals/oxygen(loc)
O.loc = loc
usr << "You take [O] out of [src]."
oxygentanks--
update_icon()
if(href_list["plasma"])
if(plasmatanks > 0)
- var/obj/item/weapon/tank/plasma/P
+ var/obj/item/weapon/tank/internals/plasma/P
if(platanks.len == plasmatanks)
P = platanks[1]
platanks.Remove(P)
else
- P = new /obj/item/weapon/tank/plasma(loc)
+ P = new /obj/item/weapon/tank/internals/plasma(loc)
P.loc = loc
usr << "You take [P] out of [src]."
plasmatanks--
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index d96113a638c..2ef4066499b 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -126,7 +126,9 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/simulated/floor/attackby(obj/item/C as obj, mob/user as mob)
if(!C || !user)
return 1
- if(istype(C, /obj/item/weapon/crowbar))
+ if(..())
+ return 1
+ if(intact && istype(C, /obj/item/weapon/crowbar))
if(broken || burnt)
broken = 0
burnt = 0
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index f78c20ccfae..c0c65f4d039 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -27,7 +27,7 @@
icon_state = icon_plating //Because asteroids are 'platings' too.
/turf/simulated/floor/plating/attackby(obj/item/C as obj, mob/user as mob)
- if(!C || !user)
+ if(..())
return
if(istype(C, /obj/item/stack/rods))
if(broken || burnt)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 2c5fdf1d013..f90bed96b57 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -43,14 +43,16 @@
user.Move_Pulled(src)
/turf/attackby(obj/item/C, mob/user)
- if(cancable)
- if(istype(C, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/coil = C
- for(var/obj/structure/cable/LC in src)
- if((LC.d1==0)||(LC.d2==0))
- LC.attackby(C,user)
- return
- coil.place_turf(src, user)
+ if(cancable && istype(C, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/coil = C
+ for(var/obj/structure/cable/LC in src)
+ if((LC.d1==0)||(LC.d2==0))
+ LC.attackby(C,user)
+ return
+ coil.place_turf(src, user)
+ return 1
+
+ return 0
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
if (!mover)
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 425837d9e84..656f0adfb7c 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -20,4 +20,5 @@
H.hair_color = random_short_color()
H.facial_hair_color = H.hair_color
H.eye_color = random_eye_color()
+ H.dna.blood_type = random_blood_type()
H.update_icons()
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index e5f076300f9..fd99c379543 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1580,7 +1580,7 @@
else if(!ispath(path, /obj) && !ispath(path, /turf) && !ispath(path, /mob))
removed_paths += dirty_path
continue
- else if(ispath(path, /obj/item/weapon/gun/energy/pulse_rifle))
+ else if(ispath(path, /obj/item/weapon/gun/energy/pulse))
if(!check_rights(R_FUN,0))
removed_paths += dirty_path
continue
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 1a99e573f41..71023368948 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -597,6 +597,7 @@ var/global/list/g_fancy_list_of_types = null
"assassin",
"mobster",
"death commando",
+ "emergency response officer",
"centcom official",
"centcom commander",
"special ops officer",
@@ -653,7 +654,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
@@ -820,7 +821,15 @@ var/global/list/g_fancy_list_of_types = null
equip_deathsquad(M)
if("emergency response officer")
- equip_emergencyresponsesquad(M)
+ switch(input("Which class?") in list("Commander","Security","Engineer","Medical"))
+ if("Commander")
+ equip_emergencyresponsesquad(M, "commander")
+ if("Security")
+ equip_emergencyresponsesquad(M, "sec")
+ if("Engineer")
+ equip_emergencyresponsesquad(M, "eng")
+ if("Medic")
+ equip_emergencyresponsesquad(M, "med")
if("centcom official")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
@@ -883,7 +892,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
@@ -1011,7 +1020,7 @@ var/global/list/g_fancy_list_of_types = null
for(var/obj/machinery/power/rad_collector/Rad in world)
if(Rad.anchored)
if(!Rad.P)
- var/obj/item/weapon/tank/plasma/Plasma = new/obj/item/weapon/tank/plasma(Rad)
+ var/obj/item/weapon/tank/internals/plasma/Plasma = new/obj/item/weapon/tank/internals/plasma(Rad)
Plasma.air_contents.toxins = 70
Rad.drainratio = 0
Rad.P = Plasma
@@ -1087,10 +1096,10 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/shield/energy(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(M), slot_s_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(M), slot_r_hand)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)//Here you go Deuryn
@@ -1107,21 +1116,82 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
//Emergency Response Team
-/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/officer)
+/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
- if(officer)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
-// M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert(M), slot_wear_id)
- else
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ switch(ertrole)
+ if("commander")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert(M), slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
+
+ if("sec")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/sec(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Security(M), slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/sec(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/carbine/loyalpin(M), slot_in_backpack)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
+
+ if("med")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/med(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Medical(M), slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/med(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical(M), slot_belt)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_r_hand)
+
+ if("eng")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/engi(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Engineer(M), slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson(M), slot_glasses)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/engi(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
+
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_l_store)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index cfac035390e..46ace545763 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -467,12 +467,19 @@ client/proc/one_click_antag()
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
chosen_candidate.client.prefs.copy_to(ERTOperative)
ready_dna(ERTOperative)
- if(numagents == 1) //If Squad Leader
- ERTOperative.real_name = "Commander [pick(ERTOperative.real_name)]"
- equip_emergencyresponsesquad(ERTOperative, 1)
- else
- ERTOperative.real_name = "Officer [pick(ERTOperative.real_name)]"
- equip_emergencyresponsesquad(ERTOperative)
+ switch(numagents)
+ if(1)
+ ERTOperative.real_name = "Commander [pick(ERTOperative.real_name)]"
+ equip_emergencyresponsesquad(ERTOperative, "commander")
+ if(2 || 5)
+ ERTOperative.real_name = "Officer [pick(ERTOperative.real_name)]"
+ equip_emergencyresponsesquad(ERTOperative, "sec")
+ if(3 || 6)
+ ERTOperative.real_name = "Officer [pick(ERTOperative.real_name)]"
+ equip_emergencyresponsesquad(ERTOperative, "med")
+ if(4 || 7)
+ ERTOperative.real_name = "Officer [pick(ERTOperative.real_name)]"
+ equip_emergencyresponsesquad(ERTOperative, "eng")
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index d383475aee2..703962ae3ba 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -148,7 +148,7 @@
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
- corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
+ corpsepocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
corpseid = 1
corpseidjob = "Operative"
corpseidaccess = "Syndicate"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 52dd1332283..7ae4d730d3c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -144,7 +144,7 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/suits.dmi'
name = "suit"
var/fire_resist = T0C+100
- allowed = list(/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
@@ -180,7 +180,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals)
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index a6e76d0c5c1..85b3cd3af70 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -101,6 +101,14 @@
heat_protection = FEET|LEGS
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+/obj/item/clothing/shoes/workboots
+ name = "work boots"
+ desc = "Nanotrasen-issue Engineering lace-up work boots for the especially blue-collar."
+ icon_state = "workboots"
+ item_state = "jackboots"
+ strip_delay = 40
+ put_on_delay = 40
+
/obj/item/clothing/shoes/cult
name = "cultist boots"
desc = "A pair of boots worn by the followers of Nar-Sie."
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index fb75f3e5711..463ea5426d7 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -42,7 +42,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/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
action_button_name = "Toggle Helmet"
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
@@ -98,7 +98,6 @@
icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/hardsuit/mining
@@ -107,7 +106,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating for wildlife encounters."
item_state = "mining_hardsuit"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
@@ -164,7 +163,7 @@
var/on = 1
action_button_name = "Toggle Hardsuit Mode"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
helmettype = null
/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
@@ -217,7 +216,7 @@
w_class = 3
unacidable = 1
armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
- allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank/internals)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
unacidable = 1
@@ -241,7 +240,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Built with lightweight materials for easier movement."
item_state = "medical_hardsuit"
slowdown = 1
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/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)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
@@ -260,6 +259,6 @@
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals, /obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 4dc3903591c..e610a351aa1 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -14,7 +14,7 @@
icon_state = "caparmor"
item_state = "capspacesuit"
w_class = 4
- allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/weapon/tank/internals, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
slowdown = 1
armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
@@ -35,7 +35,7 @@
desc = "A heavily armored, advanced space suit that protects against most forms of damage."
icon_state = "deathsquad"
item_state = "swat_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
@@ -73,7 +73,7 @@
item_state = "void"
desc = "An old, NASA Centcom branch designed, dark red space suit."
slowdown = 1
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/multitool)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/multitool)
//Space santa outfit suit
@@ -110,7 +110,7 @@
icon_state = "pirate"
item_state = "pirate"
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
@@ -150,9 +150,9 @@
desc = "Standard issue command suit for the ERT."
icon_state = "ert_command"
item_state = "ert_command"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
- slowdown = 1
+ slowdown = 0
strip_delay = 130
/obj/item/clothing/suit/space/ert/sec
diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm
index 93b9129c189..9c6c98d6396 100644
--- a/code/modules/clothing/spacesuits/ninja.dm
+++ b/code/modules/clothing/spacesuits/ninja.dm
@@ -13,7 +13,7 @@
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/stock_parts/cell)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index b4f4bf1d773..4f96b191df6 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -13,7 +13,7 @@
item_state = "space_suit_syndicate"
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 827d9236f24..ff4daf648d0 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -104,7 +104,7 @@
name = "armor"
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
- allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
@@ -157,7 +157,7 @@
item_state = "centcom"
w_class = 4//bulky item
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals/emergency_oxygen)
flags = THICKMATERIAL
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 869d47d6856..7d75bef57d4 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -20,7 +20,7 @@
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 1.0
- allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
strip_delay = 70
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 0b63ed9999f..22a6d9b74e1 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -20,7 +20,7 @@
item_state = "bio_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/flash/handheld, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/flash/handheld, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/internals/emergency_oxygen)
//Chaplain
/obj/item/clothing/suit/hooded/chaplain_hoodie
@@ -29,7 +29,7 @@
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
hooded = 1
action_button_name = "Toggle Chaplain Hoodie"
hoodtype = /obj/item/clothing/head/chaplain_hood
@@ -49,7 +49,7 @@
item_state = "nun"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
flags_inv = HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
//Chef
/obj/item/clothing/suit/toggle/chef
@@ -82,7 +82,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
+ allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
@@ -100,7 +100,7 @@
icon_state = "hazard"
item_state = "hazard"
blood_overlay_type = "armor"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/t_scanner,)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,)
//Lawyer
/obj/item/clothing/suit/toggle/lawyer
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index e4d2af2ca59..d18025b4472 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -86,7 +86,7 @@
item_state = "syndicate-black-red"
desc = "A plastic replica of the Syndicate space suit. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!"
w_class = 3
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -106,7 +106,7 @@
item_state = "imperium_monk"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
/obj/item/clothing/suit/chickensuit
@@ -134,7 +134,7 @@
item_state = "w_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/weapon/storage/book/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/internals/emergency_oxygen)
@@ -201,7 +201,7 @@
desc = "Aviators not included."
icon_state = "bomberjacket"
item_state = "brownjsuit"
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -230,7 +230,7 @@
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
hooded = 1
action_button_name = "Toggle Winter Hood"
@@ -271,7 +271,7 @@
name = "engineering winter coat"
icon_state = "coatengineer"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
name = "atmospherics winter coat"
@@ -289,5 +289,5 @@
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
- allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 6aea7b47eb1..779ad6c05e4 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -93,6 +93,8 @@
..()
/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet()
+ if(!helmettype)
+ return
suittoggled = 0
if(ishuman(helmet.loc))
var/mob/living/carbon/H = helmet.loc
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 581cb073d03..89a5f7bc936 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -18,7 +18,7 @@
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/extinguisher)
slowdown = 1.0
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
@@ -121,7 +121,7 @@
permeability_coefficient = 0.50
flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
strip_delay = 60
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 43f8e49c5f4..1fb22fcd9a8 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -24,4 +24,8 @@
/obj/item/clothing/under/shorts/grey
icon_state = "greyshorts"
- item_color = "greyshorts"
\ No newline at end of file
+ item_color = "greyshorts"
+
+/obj/item/clothing/under/shorts/purple
+ icon_state = "purpleshorts"
+ item_color = "purpleshorts"
\ No newline at end of file
diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm
index 098f7bfea7c..a2d323e81d8 100644
--- a/code/modules/detectivework/footprints_and_rag.dm
+++ b/code/modules/detectivework/footprints_and_rag.dm
@@ -8,26 +8,6 @@
var/mob/living/carbon/human/bloody_hands_mob
-
-/proc/blood_incompatible(donor,receiver)
-
- var/donor_antigen = copytext(donor,1,lentext(donor))
- var/receiver_antigen = copytext(receiver,1,lentext(receiver))
- var/donor_rh = findtext("+",donor)
- var/receiver_rh = findtext("+",receiver)
-
- if(donor_rh && !receiver_rh) return 1
- switch(receiver_antigen)
- if("A")
- if(donor_antigen != "A" && donor_antigen != "O") return 1
- if("B")
- if(donor_antigen != "B" && donor_antigen != "O") return 1
- if("O")
- if(donor_antigen != "O") return 1
- //AB is a universal receiver.
- return 0
-
-
/obj/item/weapon/reagent_containers/glass/rag
name = "damp rag"
desc = "For cleaning up messes, you suppose."
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index ed41e80ee0a..727c5a0dce2 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -119,7 +119,7 @@
santa.equip_to_slot_or_del(new /obj/item/clothing/mask/breath, slot_wear_mask)
santa.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/red, slot_gloves)
santa.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/red, slot_shoes)
- santa.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double, slot_belt)
+ santa.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen/double, slot_belt)
santa.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain, slot_ears)
santa.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/santabag, slot_back)
santa.equip_to_slot_or_del(new /obj/item/device/flashlight, slot_r_store) //most blob spawn locations are really dark.
diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm
index 055204702ac..7396ef19ed8 100644
--- a/code/modules/events/ninja.dm
+++ b/code/modules/events/ninja.dm
@@ -375,7 +375,7 @@ ________________________________________________________________________________
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store)
- equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen(src), slot_s_store)
+ equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index b757827c5da..10fad6295a6 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -138,7 +138,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/harebell
seed = /obj/item/seeds/harebell
name = "harebell"
- desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten’d not thy breath.\""
+ desc = "\"I'll sweeten thy sad grave: thou shalt not lack the flower that's like thy face, pale primrose, nor the azured hare-bell, like thy veins; no, nor the leaf of eglantine, whom not to slander, out-sweeten’d not thy breath.\""
icon_state = "harebell"
slot_flags = SLOT_HEAD
@@ -478,6 +478,13 @@
reagents.add_reagent("vitamin", 1 + round((potency / 20), 1))
bitesize = 5
+/obj/item/weapon/reagent_containers/food/snacks/grown/banana/suicide_act(mob/user)
+ user.visible_message("[user] is aiming the [src.name] at themself! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
+ sleep(15)
+ user.visible_message("[user] laughs so hard they begin to suffocate!")
+ return (OXYLOSS)
+
/obj/item/weapon/reagent_containers/food/snacks/grown/chili
seed = /obj/item/seeds/chiliseed
name = "chili"
@@ -1130,4 +1137,4 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra/add_juice()
..()
- reagents.add_reagent("salglu_solution", 1 + round((potency / 20), 1))
\ No newline at end of file
+ reagents.add_reagent("salglu_solution", 1 + round((potency / 20), 1))
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index ccd46def4df..b1eab4fc945 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -257,6 +257,11 @@
throw_speed = 3
throw_range = 7
+/obj/item/weapon/grown/bananapeel/suicide_act(mob/user)
+ user.visible_message("[user] is deliberately slipping on the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, 'sound/misc/slip.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
/obj/item/weapon/grown/bananapeel/Crossed(AM as mob|obj)
if (istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index c8e2e45e854..a29a6925d25 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -53,6 +53,8 @@
verbs -= /mob/dead/observer/verb/boo
verbs -= /mob/dead/observer/verb/possess
+ animate(src, pixel_y = 2, time = 10, loop = -1)
+
..()
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0)
diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm
index 4c1f2e55271..6c7b938288f 100644
--- a/code/modules/mob/living/carbon/brain/emote.dm
+++ b/code/modules/mob/living/carbon/brain/emote.dm
@@ -62,7 +62,7 @@
for(var/mob/M in dead_mob_list)
if (!M.client || istype(M, /mob/new_player))
continue //skip monkeys, leavers, and new_players
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ if(M.stat == DEAD && (M.client && (M.client.prefs.toggles & CHAT_GHOSTSIGHT)) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3ed06021ef6..28d866c8d34 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -168,6 +168,8 @@
if(status == "")
status = "OK"
src << "\t [status == "OK" ? "\blue" : "\red"] My [org.getDisplayName()] is [status]."
+ if(H.blood_max)
+ src << "You are bleeding!"
if(staminaloss)
if(staminaloss > 30)
src << "You're completely exhausted."
@@ -361,7 +363,7 @@
dat += "
Back: [back ? back : "Nothing"]"
- if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank))
+ if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank/internals))
dat += "
[internal ? "Disable Internals" : "Set Internals"]"
if(handcuffed)
@@ -383,7 +385,7 @@
if(href_list["internal"])
var/slot = text2num(href_list["internal"])
var/obj/item/ITEM = get_item_by_slot(slot)
- if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS))
+ if(ITEM && istype(ITEM, /obj/item/weapon/tank/internals) && wear_mask && (wear_mask.flags & MASKINTERNALS))
visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].", \
"[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM].")
if(do_mob(usr, src, POCKET_STRIP_DELAY))
@@ -391,7 +393,7 @@
internal = null
if(internals)
internals.icon_state = "internal0"
- else if(ITEM && istype(ITEM, /obj/item/weapon/tank) && wear_mask && (wear_mask.flags & MASKINTERNALS))
+ else if(ITEM && istype(ITEM, /obj/item/weapon/tank/internals) && wear_mask && (wear_mask.flags & MASKINTERNALS))
internal = ITEM
if(internals)
internals.icon_state = "internal1"
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index a1237ccd8c8..b934cd36517 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -12,6 +12,6 @@
//inventory slots
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
- var/obj/item/weapon/tank/internal = null
+ var/obj/item/weapon/tank/internals/internal = null
var/datum/dna/dna = null//Carbon
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index a67f683174c..0c9893c0d39 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -188,7 +188,7 @@
for(var/mob/M in dead_mob_list)
if(!M.client || istype(M, /mob/new_player))
continue //skip monkeys, leavers and new players
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
new file mode 100644
index 00000000000..418e111c630
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -0,0 +1,318 @@
+/****************************************************
+ BLOOD SYSTEM
+****************************************************/
+//Blood levels
+var/const/BLOOD_VOLUME_SAFE = 501
+var/const/BLOOD_VOLUME_OKAY = 336
+var/const/BLOOD_VOLUME_BAD = 224
+var/const/BLOOD_VOLUME_SURVIVE = 122
+
+/mob/living/carbon/human/var/datum/reagents/vessel //Container for blood and BLOOD ONLY. Do not transfer other chems here.
+/mob/living/carbon/human/var/pale = 0 //Should affect how mob sprite is drawn, but currently doesn't.
+
+//Initializes blood vessels
+/mob/living/carbon/human/proc/make_blood()
+
+ if(vessel)
+ return
+
+ vessel = new/datum/reagents(600)
+ vessel.my_atom = src
+
+ if(NOBLOOD in dna.species.specflags)
+ return
+
+ vessel.add_reagent("blood",560)
+ spawn(1)
+ fixblood()
+
+//Resets blood data
+/mob/living/carbon/human/proc/fixblood()
+ for(var/datum/reagent/blood/B in vessel.reagent_list)
+ if(B.id == "blood")
+ B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
+
+/mob/living/carbon/human/proc/suppress_bloodloss(var/amount)
+ if(bleedsuppress)
+ return
+ else
+ bleedsuppress = 1
+ spawn(amount)
+ bleedsuppress = 0
+ if(stat != DEAD && blood_max)
+ src << "The blood soaks through your bandage."
+
+// Takes care blood loss and regeneration
+/mob/living/carbon/human/proc/handle_blood()
+
+ if(NOBLOOD in dna.species.specflags)
+ return
+
+ if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
+
+ var/blood_volume = round(vessel.get_reagent_amount("blood"))
+
+ //Blood regeneration if there is some space
+ if(blood_volume < 560 && blood_volume)
+ var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
+ if(B) // Make sure there's some blood at all
+ if(B.data["donor"] != src) //If it's not theirs, then we look for theirs
+ for(var/datum/reagent/blood/D in vessel.reagent_list)
+ if(D.data["donor"] == src)
+ B = D
+ break
+
+ B.volume += 0.1 // regenerate blood VERY slowly
+ if (reagents.has_reagent("nutriment")) //Getting food speeds it up
+ B.volume += 0.4
+ reagents.remove_reagent("nutriment", 0.1)
+ if (reagents.has_reagent("iron")) //Hematogen candy anyone?
+ B.volume += 0.4
+ reagents.remove_reagent("iron", 0.1)
+
+ //Effects of bloodloss
+ switch(blood_volume)
+ if(BLOOD_VOLUME_SAFE to 10000)
+ if(pale)
+ pale = 0
+ update_body()
+ if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
+ if(!pale)
+ pale = 1
+ update_body()
+ var/word = pick("dizzy","woozy","faint")
+ src << "You feel [word]."
+ if(oxyloss < 20)
+ oxyloss += 3
+ if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
+ if(!pale)
+ pale = 1
+ update_body()
+ if(oxyloss < 50)
+ oxyloss += 10
+ oxyloss += 1
+ if(prob(5))
+ eye_blurry += 6
+ var/word = pick("dizzy","woozy","faint")
+ src << "You feel very [word]."
+ if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
+ oxyloss += 5
+ if(prob(15))
+ Paralyse(rand(1,3))
+ var/word = pick("dizzy","woozy","faint")
+ src << "You feel extremely [word]."
+ if(0 to BLOOD_VOLUME_SURVIVE)
+ death()
+
+ //Bleeding out
+ blood_max = 0
+ for(var/obj/item/organ/limb/org in organs)
+ var/brutedamage = org.brute_dam
+
+ if(brutedamage > 30)
+ blood_max += 0.5
+ if(brutedamage > 50)
+ blood_max += 1
+ if(brutedamage > 70)
+ blood_max += 2
+ if(bleedsuppress)
+ blood_max = 0
+ drip(blood_max)
+
+//Makes a blood drop, leaking amt units of blood from the mob
+/mob/living/carbon/human/proc/drip(var/amt as num)
+
+ if(!amt)
+ return
+
+ vessel.remove_reagent("blood",amt)
+ blood_splatter(src,src)
+
+/****************************************************
+ BLOOD TRANSFERS
+****************************************************/
+
+//Gets blood from mob to the container, preserving all data in it.
+/mob/living/carbon/proc/take_blood(obj/item/weapon/reagent_containers/container, var/amount)
+
+ var/datum/reagent/B = get_blood(container.reagents)
+ if(!B) B = new /datum/reagent/blood
+ B.holder = container
+ B.volume += amount
+
+ //set reagent data
+ B.data["donor"] = src
+
+ /*
+ if(T.virus && T.virus.spread_type != SPECIAL)
+ B.data["virus"] = new T.virus.type(0)
+ */
+
+ for(var/datum/disease/D in src.viruses)
+ if(!B.data["viruses"])
+ B.data["viruses"] = list()
+
+ B.data["viruses"] += new D.type(0, D, 1)
+
+ B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
+ if(src.resistances&&src.resistances.len)
+ B.data["resistances"] = src.resistances.Copy()
+ var/list/temp_chem = list()
+ for(var/datum/reagent/R in src.reagents.reagent_list)
+ temp_chem += R.name
+ temp_chem[R.name] = R.volume
+ B.data["trace_chem"] = list2params(temp_chem)
+ if(mind)
+ B.data["mind"] = src.mind
+ if(ckey)
+ B.data["ckey"] = src.ckey
+ if(!suiciding)
+ B.data["cloneable"] = 1
+ B.data["blood_type"] = copytext(src.dna.blood_type,1,0)
+ B.data["gender"] = src.gender
+ B.data["real_name"] = src.real_name
+ B.data["factions"] = src.faction
+ return B
+
+//For humans, blood does not appear from blue, it comes from vessels.
+/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount)
+
+ if(NOBLOOD in dna.species.specflags)
+ return null
+
+ if(vessel.get_reagent_amount("blood") < amount)
+ return null
+
+ . = ..()
+ vessel.remove_reagent("blood",amount) // Removes blood if human
+
+//Transfers blood from container to vessels
+/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount)
+
+ var/datum/reagent/blood/injected = get_blood(container.reagents)
+
+ if(!injected)
+ return
+
+ for(var/datum/disease/D in injected.data["viruses"])
+ var/datum/disease/new_virus = D.Copy(1)
+ injected.data["viruses"] += new_virus
+
+ var/list/chems = list()
+ chems = params2list(injected.data["trace_chem"])
+ for(var/C in chems)
+ src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood
+ reagents.update_total()
+
+ container.reagents.remove_reagent("blood", amount)
+
+//Transfers blood from container to vessels, respecting blood types compatability.
+/mob/living/carbon/human/inject_blood(obj/item/weapon/reagent_containers/container, var/amount)
+
+ var/datum/reagent/blood/injected = get_blood(container.reagents)
+
+ if(NOBLOOD in dna.species.specflags)
+ reagents.add_reagent("blood", amount, injected.data)
+ reagents.update_total()
+ return
+
+ var/datum/reagent/blood/our = get_blood(vessel)
+
+ if (!injected || !our)
+ return
+ if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) )
+ reagents.add_reagent("toxin",amount * 0.5)
+ reagents.update_total()
+ else
+ vessel.add_reagent("blood", amount, injected.data)
+ vessel.update_total()
+ ..()
+
+//Gets human's own blood.
+/mob/living/carbon/proc/get_blood(datum/reagents/container)
+ var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood
+ if(res) // Make sure there's some blood at all
+ if(res.data["donor"] != src) //If it's not theirs, then we look for theirs
+ for(var/datum/reagent/blood/D in container.reagent_list)
+ if(D.data["donor"] == src)
+ return D
+ return res
+
+proc/blood_incompatible(donor,receiver,donor_species,receiver_species)
+ if(!donor || !receiver) return 0
+
+ if(donor_species && receiver_species)
+ if(donor_species != receiver_species)
+ return 1
+
+ var/donor_antigen = copytext(donor,1,lentext(donor))
+ var/receiver_antigen = copytext(receiver,1,lentext(receiver))
+ var/donor_rh = (findtext(donor,"+")>0)
+ var/receiver_rh = (findtext(receiver,"+")>0)
+
+ if(donor_rh && !receiver_rh) return 1
+ switch(receiver_antigen)
+ if("A")
+ if(donor_antigen != "A" && donor_antigen != "O") return 1
+ if("B")
+ if(donor_antigen != "B" && donor_antigen != "O") return 1
+ if("O")
+ if(donor_antigen != "O") return 1
+ //AB is a universal receiver.
+ return 0
+
+proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
+
+ var/obj/effect/decal/cleanable/blood/B
+ var/decal_type = /obj/effect/decal/cleanable/blood/splatter
+ var/turf/T = get_turf(target)
+
+ if(istype(source,/mob/living/carbon/human))
+ var/mob/living/carbon/human/M = source
+ source = M.get_blood(M.vessel)
+ else if(istype(source,/mob/living/carbon/monkey))
+ var/mob/living/carbon/monkey/donor = source
+ if(donor.dna)
+ source = new()
+ source.data["blood_DNA"] = donor.dna.unique_enzymes
+ source.data["blood_type"] = donor.dna.blood_type
+
+ // Are we dripping or splattering?
+ var/list/drips = list()
+ // Only a certain number of drips (or one large splatter) can be on a given turf.
+ for(var/obj/effect/decal/cleanable/blood/drip/drop in T)
+ drips |= drop.drips
+ del(drop)
+ if(!large && drips.len < 3)
+ decal_type = /obj/effect/decal/cleanable/blood/drip
+
+ // Find a blood decal or create a new one.
+ B = locate(decal_type) in T
+ if(!B)
+ B = new decal_type(T)
+
+ var/obj/effect/decal/cleanable/blood/drip/drop = B
+ if(istype(drop) && drips && drips.len && !large)
+ drop.overlays |= drips
+ drop.drips |= drips
+
+ // If there's no data to copy, call it quits here.
+ if(!source)
+ return B
+
+ // Update blood information.
+ if(source.data["blood_DNA"])
+ B.blood_DNA = list()
+ if(source.data["blood_type"])
+ B.blood_DNA[source.data["blood_DNA"]] = source.data["blood_type"]
+ else
+ B.blood_DNA[source.data["blood_DNA"]] = "O+"
+
+/* // Update virus information.
+ for(var/datum/disease/D in source.data["viruses"])
+ var/datum/disease/new_virus = D.Copy(1)
+ source.data["viruses"] += new_virus
+ new_virus.holder = B
+*/
+
+ return B
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 53eaa53884f..4846abc0eb7 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -322,7 +322,7 @@
for(var/mob/M in dead_mob_list)
if(!M.client || istype(M, /mob/new_player))
continue //skip monkeys, leavers and new players
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 8d0aeed8e5c..e2290b92404 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -230,6 +230,14 @@
else
msg += "[t_He] [t_is] quite chubby.\n"
+ if(pale)
+ msg += "[t_He] [t_has] pale skin.\n"
+
+ if(bleedsuppress)
+ msg += "[t_He] [t_is] bandaged with something.\n"
+ else if(blood_max)
+ msg += "[t_He] [t_is] bleeding!\n"
+
msg += ""
if(!appears_dead)
@@ -252,21 +260,37 @@
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/hud/security/sunglasses))
- if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
- var/criminal = "None"
-
- var/perpname = get_face_name(get_id_name(""))
- if(perpname)
- var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud))
+ var/perpname = get_face_name(get_id_name(""))
+ if(perpname)
+ var/datum/data/record/R = find_record("name", perpname, data_core.general)
+ if(R)
+ msg += "Rank: [R.fields["rank"]]
"
+ msg += "\[Front photo\] "
+ msg += "\[Side photo\]
"
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
if(R)
- criminal = R.fields["criminal"]
+ var/health = R.fields["p_stat"]
+ msg += "\[[health]\]"
+ health = R.fields["m_stat"]
+ msg += "\[[health]\]
"
+ R = find_record("name", perpname, data_core.medical)
+ if(R)
+ msg += "\[Medical evaluation\]
"
- msg += "Criminal status: \[[criminal]\]\n"
- msg += "Security record: \[View\] "
- msg += "\[Add crime\] "
- msg += "\[View comment log\] "
- msg += "\[Add comment\]\n"
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
+ var/criminal = "None"
+
+ R = find_record("name", perpname, data_core.security)
+ if(R)
+ criminal = R.fields["criminal"]
+
+ msg += "Criminal status: \[[criminal]\]\n"
+ msg += "Security record: \[View\] "
+ msg += "\[Add crime\] "
+ msg += "\[View comment log\] "
+ msg += "\[Add comment\]\n"
msg += "*---------*"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 068333c71a1..5af48151fba 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -30,6 +30,8 @@
ready_dna(src)
randomize_human(src)
+ make_blood()
+
..()
var/mob/M = src
faction |= "\ref[M]"
@@ -158,7 +160,7 @@
| |
"}
dat += "| Back: | [(back && !(back.flags&ABSTRACT)) ? back : "Empty"]"
- if(has_breathable_mask && istype(back, /obj/item/weapon/tank))
+ if(has_breathable_mask && istype(back, /obj/item/weapon/tank/internals))
dat += " [internal ? "Disable Internals" : "Set Internals"]"
dat += " |
| |
"
@@ -185,7 +187,7 @@
dat += "| Exosuit: | [(wear_suit && !(wear_suit.flags&ABSTRACT)) ? wear_suit : "Empty"] |
"
if(wear_suit)
dat += "| ↳Suit Storage: | [(s_store && !(s_store.flags&ABSTRACT)) ? s_store : "Empty"]"
- if(has_breathable_mask && istype(s_store, /obj/item/weapon/tank))
+ if(has_breathable_mask && istype(s_store, /obj/item/weapon/tank/internals))
dat += " [internal ? "Disable Internals" : "Set Internals"]"
dat += " |
"
else
@@ -212,7 +214,7 @@
dat += "| ↳Belt: |
"
else
dat += "| ↳Belt: | [(belt && !(belt.flags&ABSTRACT)) ? belt : "Empty"]"
- if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
+ if(has_breathable_mask && istype(belt, /obj/item/weapon/tank/internals))
dat += " [internal ? "Disable Internals" : "Set Internals"]"
dat += " |
"
dat += "| ↳Pockets: | [(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty)"]"
@@ -247,7 +249,6 @@
siemens_coeff = G.siemens_coefficient
return ..(shock_damage,source,siemens_coeff)
-
/mob/living/carbon/human/Topic(href, href_list)
if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
if(href_list["item"])
@@ -293,113 +294,194 @@
..()
- if(href_list["criminal"])
+///////HUDs///////
+ if(href_list["hud"])
if(istype(usr, /mob/living/carbon/human))
var/mob/living/carbon/human/H = usr
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
- if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
- return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
- // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
- var/allowed_access = null
- var/obj/item/clothing/glasses/G = H.glasses
- if (!G.emagged)
- if(H.wear_id)
- var/list/access = H.wear_id.GetAccess()
- if(access_sec_doors in access)
- allowed_access = H.get_authentification_name()
- else
- allowed_access = "@%&ERROR_%$*"
-
-
- if(!allowed_access)
- H << "ERROR: Invalid Access"
- return
-
- var/perpname = get_face_name(get_id_name(""))
- if(perpname)
- var/datum/data/record/R = find_record("name", perpname, data_core.security)
+ var/perpname = get_face_name(get_id_name(""))
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud))
+ var/datum/data/record/R = find_record("name", perpname, data_core.general)
+ if(href_list["photo_front"] || href_list["photo_side"])
if(R)
- if(href_list["status"])
- var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged", "Cancel")
+ if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud)) return
+ var/obj/item/weapon/photo/P = null
+ if(href_list["photo_front"])
+ P = R.fields["photo_front"]
+ else if(href_list["photo_side"])
+ P = R.fields["photo_side"]
+ if(P)
+ P.show(H)
+
+ if(href_list["hud"] == "m")
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
+ if(href_list["p_stat"])
+ var/health = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel")
if(R)
- if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health)) return
+ if(health && health != "Cancel")
+ R.fields["p_stat"] = health
+ return
+ if(href_list["m_stat"])
+ var/health = input(usr, "Specify a new mental status for this person.", "Medical HUD", R.fields["m_stat"]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel")
+ if(R)
+ if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health)) return
+ if(health && health != "Cancel")
+ R.fields["m_stat"] = health
+ return
+ if(href_list["evaluation"])
+ if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20)
+ usr << "No external injuries detected. "
+ return
+ var/span = "notice"
+ var/status = ""
+ if(getBruteLoss())
+ usr << "Physical trauma analysis:"
+ for(var/obj/item/organ/limb/org in organs)
+ var/brutedamage = org.brute_dam
+ if(brutedamage > 0)
+ status = "received minor physical injuries."
+ span = "notice"
+ if(brutedamage > 20)
+ status = "been seriously damaged."
+ span = "danger"
+ if(brutedamage > 40)
+ status = "sustained major trauma!"
+ span = "userdanger"
+ if(brutedamage)
+ usr << "The [org.getDisplayName()] appears to have [status]"
+ if(getFireLoss())
+ usr << "Analysis of skin burns:"
+ for(var/obj/item/organ/limb/org in organs)
+ var/burndamage = org.burn_dam
+ if(burndamage > 0)
+ status = "signs of minor burns."
+ span = "notice"
+ if(burndamage > 20)
+ status = "serious burns."
+ span = "danger"
+ if(burndamage > 40)
+ status = "major burns!"
+ span = "userdanger"
+ if(burndamage)
+ usr << "The [org.getDisplayName()] appears to have [status]"
+ if(getOxyLoss())
+ usr << "Patient has signs of suffocation, emergency treatment may be required!"
+ if(getToxLoss() > 20)
+ usr << "Gathered data is inconsistent with the analysis, possible cause: poisoning."
+
+ if(href_list["hud"] == "s")
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at.
+ return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten
+ // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
+ var/allowed_access = null
+ var/obj/item/clothing/glasses/G = H.glasses
+ if (!G.emagged)
+ if(H.wear_id)
+ var/list/access = H.wear_id.GetAccess()
+ if(access_sec_doors in access)
+ allowed_access = H.get_authentification_name()
+ else
+ allowed_access = "@%&ERROR_%$*"
+
+
+ if(!allowed_access)
+ H << "ERROR: Invalid Access"
+ return
+
+ if(perpname)
+ R = find_record("name", perpname, data_core.security)
+ if(R)
+ if(href_list["status"])
+ var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Discharged", "Cancel")
if(setcriminal != "Cancel")
- investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records")
- R.fields["criminal"] = setcriminal
- sec_hud_set_security_status()
- return
-
- if(href_list["view"])
- if(R)
- if(usr.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
- return
- usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]"
- usr << "Minor Crimes:"
- for(var/datum/data/crime/c in R.fields["mi_crim"])
- usr << "Crime: [c.crimeName]"
- usr << "Details: [c.crimeDetails]"
- usr << "Added by [c.author] at [c.time]"
- usr << "----------"
- usr << "Major Crimes:"
- for(var/datum/data/crime/c in R.fields["ma_crim"])
- usr << "Crime: [c.crimeName]"
- usr << "Details: [c.crimeDetails]"
- usr << "Added by [c.author] at [c.time]"
- usr << "----------"
- usr << "Notes: [R.fields["notes"]]"
- return
-
- if(href_list["add_crime"])
- switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel"))
- if("Minor Crime")
- if(R)
- var/t1 = copytext(sanitize(input("Please input minor crime names:", "Security HUD", "", null) as text),1,MAX_MESSAGE_LEN)
- var/t2 = copytext(sanitize(input("Please input minor crime details:", "Security HUD", "", null) as message),1,MAX_MESSAGE_LEN)
if(R)
- if (!t1 || !t2 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
- return
- var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
- data_core.addMinorCrime(R.fields["id"], crime)
- usr << "Successfully added a minor crime."
- return
- if("Major Crime")
- if(R)
- var/t1 = copytext(sanitize(input("Please input major crime names:", "Security HUD", "", null) as text),1,MAX_MESSAGE_LEN)
- var/t2 = copytext(sanitize(input("Please input major crime details:", "Security HUD", "", null) as message),1,MAX_MESSAGE_LEN)
- if(R)
- if (!t1 || !t2 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
- return
- var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
- data_core.addMajorCrime(R.fields["id"], crime)
- usr << "Successfully added a major crime."
- return
- else return
-
- if(href_list["view_comment"])
- if(R)
- if(H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ if(H.canUseHUD())
+ if(istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", "records")
+ R.fields["criminal"] = setcriminal
+ sec_hud_set_security_status()
return
- usr << "Comments/Log:"
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- usr << R.fields[text("com_[]", counter)]
- usr << "----------"
- counter++
- return
- if(href_list["add_comment"])
- if(R)
- var/t1 = copytext(sanitize(input("Add Comment:", "Secure. records", null, null) as message),1,MAX_MESSAGE_LEN)
- if(R)
- if (!t1 || !allowed_access || H.stat || H.weakened || H.stunned || H.restrained() || !istype(H.glasses, /obj/item/clothing/glasses/hud/security))
+ if(href_list["view"])
+ if(R)
+ if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return
+ usr << "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]"
+ usr << "Minor Crimes:"
+ for(var/datum/data/crime/c in R.fields["mi_crim"])
+ usr << "Crime: [c.crimeName]"
+ usr << "Details: [c.crimeDetails]"
+ usr << "Added by [c.author] at [c.time]"
+ usr << "----------"
+ usr << "Major Crimes:"
+ for(var/datum/data/crime/c in R.fields["ma_crim"])
+ usr << "Crime: [c.crimeName]"
+ usr << "Details: [c.crimeDetails]"
+ usr << "Added by [c.author] at [c.time]"
+ usr << "----------"
+ usr << "Notes: [R.fields["notes"]]"
+ return
+
+ if(href_list["add_crime"])
+ switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel"))
+ if("Minor Crime")
+ if(R)
+ var/t1 = stripped_input("Please input minor crime names:", "Security HUD", "", null)
+ var/t2 = stripped_multiline_input("Please input minor crime details:", "Security HUD", "", null)
+ if(R)
+ if (!t1 || !t2 || !allowed_access) return
+ else if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return
+ var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
+ data_core.addMinorCrime(R.fields["id"], crime)
+ usr << "Successfully added a minor crime."
+ return
+ if("Major Crime")
+ if(R)
+ var/t1 = stripped_input("Please input major crime names:", "Security HUD", "", null)
+ var/t2 = stripped_multiline_input("Please input major crime details:", "Security HUD", "", null)
+ if(R)
+ if (!t1 || !t2 || !allowed_access) return
+ else if (!H.canUseHUD()) return
+ else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return
+ var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
+ data_core.addMajorCrime(R.fields["id"], crime)
+ usr << "Successfully added a major crime."
+ return
+
+ if(href_list["view_comment"])
+ if(R)
+ if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return
+ usr << "Comments/Log:"
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ usr << R.fields[text("com_[]", counter)]
+ usr << "----------"
+ counter++
return
- var/counter = 1
- while(R.fields[text("com_[]", counter)])
- counter++
- R.fields[text("com_[]", counter)] = text("Made by [] on [] [], [] []", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,)
- usr << "Successfully added comment."
- return
- usr << "Unable to locate a data core entry for this person."
+
+ if(href_list["add_comment"])
+ if(R)
+ var/t1 = stripped_multiline_input("Add Comment:", "Secure. records", null, null)
+ if(R)
+ if (!t1 || !allowed_access) return
+ else if(!H.canUseHUD()) return
+ else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security)) return
+ var/counter = 1
+ while(R.fields[text("com_[]", counter)])
+ counter++
+ R.fields[text("com_[]", counter)] = text("Made by [] on [] [], [] []", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1,)
+ usr << "Successfully added comment."
+ return
+ usr << "Unable to locate a data core entry for this person."
+
+/mob/living/carbon/human/proc/canUseHUD()
+ return !(src.stat || src.weakened || src.stunned || src.restrained())
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index b13f76395c3..b15db63a746 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -140,6 +140,10 @@ mob/living/carbon/human/proc/hat_fall_prob()
if(update) update_damage_overlays(0)
+/mob/living/carbon/human/proc/restore_blood()
+ if(!NOBLOOD in dna.species.specflags)
+ var/blood_volume = vessel.get_reagent_amount("blood")
+ vessel.add_reagent("blood",560.0-blood_volume)
////////////////////////////////////////////
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index de9f0ea57c0..6bd44a4115d 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -17,7 +17,7 @@
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
var/age = 30 //Player's age (pure fluff)
- var/blood_type = "A+" //Player's bloodtype (Not currently used, just character fluff)
+ var/blood_type = "A+" //Player's bloodtype
var/underwear = "Nude" //Which underwear the player wants
var/undershirt = "Nude" //Which undershirt the player wants
@@ -49,3 +49,6 @@
var/xylophone = 0 //For the spoooooooky xylophone cooldown
var/gender_ambiguous = 0 //if something goes wrong during gender reassignment this generates a line in examine
+
+ var/blood_max = 0 //how much are we bleeding
+ var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4b8964e6f20..a6477d24f93 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -84,6 +84,9 @@
//Disabilities
handle_disabilities()
+ //Blud
+ handle_blood()
+
//Random events (vomiting etc)
handle_random_events()
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 719aa2cda70..15c107c539b 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -127,6 +127,7 @@
sexes = 0
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow
+ specflags = list(NOBREATH,NOBLOOD,RADIMMUNE)
/datum/species/shadow/spec_life(mob/living/carbon/human/H)
var/light_amount = 0
@@ -152,7 +153,7 @@
default_color = "00FFFF"
darksight = 3
invis_sight = SEE_INVISIBLE_LEVEL_ONE
- specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR)
+ specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
hair_color = "mutcolor"
hair_alpha = 150
ignored_by = list(/mob/living/carbon/slime)
@@ -169,7 +170,7 @@
default_color = "00FF90"
say_mod = "chirps"
eyes = "jelleyes"
- specflags = list(MUTCOLORS,EYECOLOR)
+ specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD)
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime
/*
@@ -228,6 +229,7 @@
id = "skeleton"
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton
+ specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE)
/*
ZOMBIES
*/
@@ -239,6 +241,7 @@
say_mod = "moans"
sexes = 0
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
+ specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE)
/datum/species/zombie/handle_speech(message)
var/list/message_list = text2list(message, " ")
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 77be26fc621..b7df925da57 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -46,7 +46,7 @@
var/list/listening_dead = list()
for(var/mob/M in player_list)
- if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTWHISPER) || (get_dist(M, src) <= 7)))
+ if(M.stat == DEAD && M.client && ((M.client.prefs.toggles & CHAT_GHOSTWHISPER) || (get_dist(M, src) <= 7)))
listening_dead |= M
var/list/listening = get_hearers_in_view(1, src)
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 0c4d805ded1..e3503bd5a57 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -205,9 +205,9 @@
return
/mob/living/carbon/slime/MouseDrop(var/atom/movable/A as mob|obj)
- if(isliving(A) && A != usr)
+ if(isliving(A) && A != src && usr == src)
var/mob/living/Food = A
- if(Food.Adjacent(usr) && !stat && Food.stat != DEAD) //messy
+ if(Food.Adjacent(src) && !stat && Food.stat != DEAD) //messy
Feedon(Food)
..()
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 9adb0fd4188..891fae0abeb 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -268,7 +268,7 @@
if(!M.client || istype(M, /mob/new_player))
continue //skip monkeys, leavers and new players
var/T = get_turf(src)
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T,null)))
+ if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T,null)))
M.show_message(message)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 96556ab3804..dd64719253f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -410,6 +410,9 @@ Sorry Giacom. Please don't be mad :(
dead_mob_list -= src
living_mob_list += src
if(!isanimal(src)) stat = CONSCIOUS
+ if(ishuman(src))
+ var/mob/living/carbon/human/human_mob = src
+ human_mob.restore_blood()
update_fire()
regenerate_icons()
..()
@@ -492,30 +495,8 @@ Sorry Giacom. Please don't be mad :(
M.stop_pulling()
//this is the gay blood on floor shit -- Added back -- Skie
- if (M.lying && (prob(M.getBruteLoss() / 2)))
- var/blood_exists = 0
- var/trail_type = M.getTrail()
- for(var/obj/effect/decal/cleanable/trail_holder/C in M.loc) //checks for blood splatter already on the floor
- blood_exists = 1
- if (istype(M.loc, /turf/simulated) && trail_type != null)
- var/newdir = get_dir(T, M.loc)
- if(newdir != M.dir)
- newdir = newdir | M.dir
- if(newdir == 3) //N + S
- newdir = NORTH
- else if(newdir == 12) //E + W
- newdir = EAST
- if((newdir in list(1, 2, 4, 8)) && (prob(50)))
- newdir = turn(get_dir(T, M.loc), 180)
- if(!blood_exists)
- new /obj/effect/decal/cleanable/trail_holder(M.loc)
- for(var/obj/effect/decal/cleanable/trail_holder/H in M.loc)
- if((!(newdir in H.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && H.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
- H.existing_dirs += newdir
- H.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir))
- if(check_dna_integrity(M)) //blood DNA
- var/mob/living/carbon/DNA_helper = pulling
- H.blood_DNA[DNA_helper.dna.unique_enzymes] = DNA_helper.dna.blood_type
+ if(M.lying && (prob(M.getBruteLoss() / 2)))
+ makeTrail(T, M)
pulling.Move(T, get_dir(pulling, T))
if(M)
M.start_pulling(t)
@@ -532,6 +513,35 @@ Sorry Giacom. Please don't be mad :(
for(var/mob/living/carbon/slime/M in view(1,src))
M.UpdateFeed(src)
+/mob/living/proc/makeTrail(var/turf/T, var/mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if((NOBLOOD in H.dna.species.specflags) || (!H.blood_max) || (H.bleedsuppress))
+ return
+ var/blood_exists = 0
+ var/trail_type = M.getTrail()
+ for(var/obj/effect/decal/cleanable/trail_holder/C in M.loc) //checks for blood splatter already on the floor
+ blood_exists = 1
+ if (istype(M.loc, /turf/simulated) && trail_type != null)
+ var/newdir = get_dir(T, M.loc)
+ if(newdir != M.dir)
+ newdir = newdir | M.dir
+ if(newdir == 3) //N + S
+ newdir = NORTH
+ else if(newdir == 12) //E + W
+ newdir = EAST
+ if((newdir in list(1, 2, 4, 8)) && (prob(50)))
+ newdir = turn(get_dir(T, M.loc), 180)
+ if(!blood_exists)
+ new /obj/effect/decal/cleanable/trail_holder(M.loc)
+ for(var/obj/effect/decal/cleanable/trail_holder/H in M.loc)
+ if((!(newdir in H.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && H.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
+ H.existing_dirs += newdir
+ H.overlays.Add(image('icons/effects/blood.dmi',trail_type,dir = newdir))
+ if(check_dna_integrity(M)) //blood DNA
+ var/mob/living/carbon/DNA_helper = pulling
+ H.blood_DNA[DNA_helper.dna.unique_enzymes] = DNA_helper.dna.blood_type
+
/mob/living/proc/getTrail() //silicon and simple_animals don't get blood trails
return null
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index dd3745d4245..f94e95160da 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -161,7 +161,7 @@ var/list/department_radio_keys = list(
var/list/listening = get_hearers_in_view(message_range, source)
var/list/listening_dead = list()
for(var/mob/M in player_list)
- if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7))&& client) // client is so that ghosts don't have to listen to mice
+ if(M.stat == DEAD && M.client && ((M.client.prefs.toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7)) && client) // client is so that ghosts don't have to listen to mice
listening_dead |= M
listening -= listening_dead //so ghosts dont hear stuff twice
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index f831e687de5..0f7e32324ba 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -34,7 +34,6 @@ var/list/ai_list = list()
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
var/obj/item/device/pda/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
- var/obj/item/device/camera/siliconcam/aicamera = null
var/obj/machinery/bot/Bot
//MALFUNCTION
diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm
index aa2bb96cfe2..317e887e90a 100644
--- a/code/modules/mob/living/silicon/ai/vox_sounds.dm
+++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm
@@ -673,7 +673,6 @@ var/list/vox_sounds = list("," = 'sound/vox_fem/,.ogg',
"vox" = 'sound/vox_fem/vox.ogg',
"vox_login" = 'sound/vox_fem/vox_login.ogg',
"voxtest" = 'sound/vox_fem/voxtest.ogg',
-"voxtest2" = 'sound/vox_fem/voxtest2.ogg',
"w" = 'sound/vox_fem/w.ogg',
"walk" = 'sound/vox_fem/walk.ogg',
"wall" = 'sound/vox_fem/wall.ogg',
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e69830054bc..570e6b320d2 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -56,7 +56,6 @@
var/obj/item/weapon/tank/internal = null //Hatred. Used if a borg has a jetpack.
var/obj/item/robot_parts/robot_suit/robot_suit = null //Used for deconstruction to remember what the borg was constructed out of..
- var/obj/item/device/camera/siliconcam/aicamera = null //photography
var/toner = 0
var/tonermax = 40
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 4b6e2ae91e5..1d241afcca8 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -9,6 +9,7 @@
var/list/alarms_to_clear = list()
var/designation = ""
var/radiomod = "" //Radio character used before state laws/arrivals announce to allow department transmissions, default, or none at all.
+ var/obj/item/device/camera/siliconcam/aicamera = null //photography
var/obj/item/device/radio/borg/radio = null //AIs dont use this but this is at the silicon level to advoid copypasta in say()
@@ -413,4 +414,8 @@
return
/mob/living/silicon/setEarDamage()
- return
\ No newline at end of file
+ return
+
+/mob/living/silicon/proc/GetPhoto()
+ if (aicamera)
+ return aicamera.selectpicture(aicamera)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 405b882ea17..7e8d710e44b 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -110,7 +110,7 @@
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
- corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
+ corpsepocket1 = /obj/item/weapon/tank/internals/emergency_oxygen
corpseid = 1
corpseidjob = "Operative"
corpseidaccess = "Syndicate"
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index e9605fdd61a..a763d6ef994 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -153,8 +153,8 @@
/obj/item/device/radio,
/obj/item/device/radio/off,
/obj/item/clothing/suit/cardborg,
- /obj/item/weapon/tank/oxygen,
- /obj/item/weapon/tank/air,
+ /obj/item/weapon/tank/internals/oxygen,
+ /obj/item/weapon/tank/internals/air,
/obj/item/weapon/extinguisher
)
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 84961dff068..08029e1a5f5 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -68,7 +68,7 @@
var/icon/clothes_s = null
if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high'
clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
else if(backbag == 3)
@@ -78,7 +78,7 @@
switch(job_civilian_high)
if(HOP)
clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hopcap"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -86,7 +86,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(BARTENDER)
clothes_s = new /icon('icons/mob/uniform.dmi', "bar_suit_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armoralt"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -94,7 +94,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(BOTANIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY)
if(backbag == 2)
@@ -103,7 +103,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(COOK)
clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "chef"), ICON_OVERLAY)
if(backbag == 2)
@@ -112,22 +112,22 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(JANITOR)
clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
if(backbag == 3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(LIBRARIAN)
clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
if(backbag == 3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(QUARTERMASTER)
clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "clipboard"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -135,21 +135,21 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(CARGOTECH)
clothes_s = new /icon('icons/mob/uniform.dmi', "cargo_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
if(backbag == 3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(MINER)
clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY)
if(backbag == 3)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
if(LAWYER)
clothes_s = new /icon('icons/mob/uniform.dmi', "bluesuit_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "briefcase"), ICON_OVERLAY)
if(backbag == 2)
@@ -158,7 +158,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(CHAPLAIN)
clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "bible"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -166,12 +166,12 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(CLOWN)
clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "clownpack"), ICON_OVERLAY)
if(MIME)
clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY)
@@ -185,7 +185,7 @@
switch(job_medsci_high)
if(RD)
clothes_s = new /icon('icons/mob/uniform.dmi', "director_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "clipboard"), ICON_OVERLAY)
if(backbag == 2)
@@ -194,7 +194,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(SCIENTIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -202,7 +202,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(CHEMIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -210,7 +210,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(CMO)
clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "firstaid"), ICON_OVERLAY)
if(backbag == 2)
@@ -219,7 +219,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
if(DOCTOR)
clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "firstaid"), ICON_OVERLAY)
if(backbag == 2)
@@ -228,7 +228,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
if(GENETICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
@@ -236,7 +236,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(VIROLOGIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir"), ICON_OVERLAY)
if(backbag == 2)
@@ -245,7 +245,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY)
if(ROBOTICIST)
clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/inhands/items_lefthand.dmi', "toolbox_blue"), ICON_OVERLAY)
if(backbag == 2)
@@ -257,9 +257,9 @@
switch(job_engsec_high)
if(CAPTAIN)
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY)
- clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sun"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "capcarapace"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "captainpack"), ICON_OVERLAY)
@@ -267,10 +267,10 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-cap"), ICON_OVERLAY)
if(HOS)
clothes_s = new /icon('icons/mob/uniform.dmi', "hos_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberetblack"), ICON_OVERLAY)
- clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hostrench"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -278,10 +278,10 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
if(WARDEN)
clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "policehelm"), ICON_OVERLAY)
- clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/eyes.dmi', "sunhud"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "warden_jacket"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -289,7 +289,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
if(DETECTIVE)
clothes_s = new /icon('icons/mob/uniform.dmi', "detective_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "detective"), ICON_OVERLAY)
@@ -300,9 +300,9 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY)
if(OFFICER)
clothes_s = new /icon('icons/mob/uniform.dmi', "security_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
- clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret_badge"), ICON_OVERLAY)
+ clothes_s.Blend(new /icon('icons/mob/head.dmi', "helmet"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "armor"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY)
@@ -310,7 +310,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY)
if(CHIEF)
clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY)
@@ -321,7 +321,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
if(ENGINEER)
clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "workboots"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY)
if(backbag == 2)
@@ -330,7 +330,7 @@
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY)
if(ATMOSTECH)
clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s")
- clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY)
+ clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index a3db1f6b3b7..247b0356c00 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -332,22 +332,22 @@
else
injectaialbum(icon, img, desc, pixel_x, pixel_y, blueprintsinject)
-
-obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc)
+obj/item/device/camera/siliconcam/proc/selectpicture(var/obj/item/device/camera/siliconcam/targetloc)
var/list/nametemp = list()
var/find
- var/datum/picture/selection
if(targetloc.aipictures.len == 0)
usr << "No images saved"
return
for(var/datum/picture/t in targetloc.aipictures)
nametemp += t.fields["name"]
find = input("Select image (numbered in order taken)") in nametemp
- var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
for(var/datum/picture/q in targetloc.aipictures)
if(q.fields["name"] == find)
- selection = q
- break // just in case some AI decides to take 10 thousand pictures in a round
+ return q
+
+obj/item/device/camera/siliconcam/proc/viewpichelper(var/obj/item/device/camera/siliconcam/targetloc)
+ var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
+ var/datum/picture/selection = selectpicture(targetloc)
P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
P.pixel_x = selection.fields["pixel_x"]
P.pixel_y = selection.fields["pixel_y"]
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index c6b16fc7d3e..48ebf2b88e3 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -13,6 +13,10 @@
pressure_resistance = 2
attack_verb = list("stamped")
+/obj/item/weapon/stamp/suicide_act(mob/user)
+ user.visible_message("[user] stamps 'VOID' on \his forehead, then promptly falls over, dead.")
+ return (OXYLOSS)
+
/obj/item/weapon/stamp/qm
name = "quartermaster's rubber stamp"
icon_state = "stamp-qm"
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 8e07804317d..dcbda800de8 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -10,7 +10,7 @@ var/global/list/rad_collectors = list()
density = 1
req_access = list(access_engine_equip)
// use_power = 0
- var/obj/item/weapon/tank/plasma/P = null
+ var/obj/item/weapon/tank/internals/plasma/P = null
var/last_power = 0
var/active = 0
var/locked = 0
@@ -57,7 +57,7 @@ var/global/list/rad_collectors = list()
return 1
else if(istype(W, /obj/item/device/analyzer) && P)
atmosanalyzer_scan(P.air_contents, user)
- else if(istype(W, /obj/item/weapon/tank/plasma))
+ else if(istype(W, /obj/item/weapon/tank/internals/plasma))
if(!src.anchored)
user << "The [src] needs to be secured to the floor first."
return 1
@@ -115,7 +115,7 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/proc/eject()
locked = 0
- var/obj/item/weapon/tank/plasma/Z = src.P
+ var/obj/item/weapon/tank/internals/plasma/Z = src.P
if (!Z)
return
Z.loc = get_turf(src)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 0bf2aca5611..04afcf54d7f 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -38,24 +38,6 @@
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
-/obj/item/ammo_casing/energy/laser/pulse/carbine
- e_cost = 50
-
-/obj/item/ammo_casing/energy/laser/carbine
- e_cost = 50
-
-/obj/item/ammo_casing/energy/electrode/carbine
- e_cost = 50
-
-/obj/item/ammo_casing/energy/laser/pulse/pistol
- e_cost = 100
-
-/obj/item/ammo_casing/energy/laser/pistol
- e_cost = 50
-
-/obj/item/ammo_casing/energy/electrode/pistol
- e_cost = 50
-
/obj/item/ammo_casing/energy/laser/bluetag
projectile_type = /obj/item/projectile/lasertag/bluetag
select_name = "bluetag"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 4474aa5a6cc..f7be8cb5618 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -89,4 +89,14 @@
return
/obj/item/weapon/gun/energy/ui_action_click()
- toggle_gunlight()
\ No newline at end of file
+ toggle_gunlight()
+
+/obj/item/weapon/gun/energy/suicide_act(mob/user)
+ if (src.can_shoot())
+ user.visible_message("[user] is trying to blow \his brains out with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, fire_sound, 50, 1, -1)
+ return(FIRELOSS)
+ else
+ user.visible_message("[user] is pretending to blow \his brains out with the [src.name]! It looks like \he's trying to commit suicide!")
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
+ return (OXYLOSS)
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index dc0e90b608e..be1d07818b0 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -1,58 +1,60 @@
-/obj/item/weapon/gun/energy/pulse_rifle
+/obj/item/weapon/gun/energy/pulse
name = "pulse rifle"
desc = "A heavy-duty, multifaceted energy rifle with three modes. Preferred by front-line combat personnel."
icon_state = "pulse"
- item_state = "pulse"
- w_class = 4.0
+ item_state = null
+ w_class = 4
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- cell_type = "/obj/item/weapon/stock_parts/cell/super"
+ cell_type = "/obj/item/weapon/stock_parts/cell/pulse"
-
-/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob)
+/obj/item/weapon/gun/energy/pulse/attack_self(mob/living/user as mob)
select_fire(user)
-/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine
+/obj/item/weapon/gun/energy/pulse/emp_act(severity)
+ return
+
+/obj/item/weapon/gun/energy/pulse/loyalpin
+ pin = /obj/item/device/firing_pin/implant/loyalty
+
+/obj/item/weapon/gun/energy/pulse/carbine
name = "pulse carbine"
- desc = "A ligther weight varient of the pulse rifle, a multifaceted energy carbine with three modes."
- w_class = 3.0
+ desc = "A compact variant of the pulse rifle with less firepower but easier storage."
+ w_class = 3
+ slot_flags = SLOT_BELT
icon_state = "pulse_carbine"
item_state = "pulse"
- ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse/carbine, /obj/item/ammo_casing/energy/electrode/carbine, /obj/item/ammo_casing/energy/laser/carbine)
- cell_type = "/obj/item/weapon/stock_parts/cell"
+ cell_type = "/obj/item/weapon/stock_parts/cell/pulse/carbine"
-/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine/loyalpin
+/obj/item/weapon/gun/energy/pulse/carbine/loyalpin
pin = /obj/item/device/firing_pin/implant/loyalty
-/obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol
+/obj/item/weapon/gun/energy/pulse/pistol
name = "pulse pistol"
- desc = "A ligther weight varient of the pulse rifle, a multifaceted energy pistol with three modes."
- w_class = 2.0
+ desc = "A pulse rifle in an easily concealed handgun package with low capacity."
+ w_class = 2
+ slot_flags = SLOT_BELT
icon_state = "pulse_pistol"
- item_state = "pulse"
- ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse/pistol, /obj/item/ammo_casing/energy/electrode/pistol, /obj/item/ammo_casing/energy/laser/pistol)
- cell_type = "/obj/item/weapon/stock_parts/cell"
+ item_state = "gun"
+ cell_type = "/obj/item/weapon/stock_parts/cell/pulse/pistol"
-/obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol/loyalpin
+/obj/item/weapon/gun/energy/pulse/pistol/loyalpin
pin = /obj/item/device/firing_pin/implant/loyalty
-/obj/item/weapon/gun/energy/pulse_rifle/destroyer
+/obj/item/weapon/gun/energy/pulse/destroyer
name = "pulse destroyer"
desc = "A heavy-duty energy rifle built for pure destruction."
cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse)
-/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob)
+/obj/item/weapon/gun/energy/pulse/destroyer/attack_self(mob/living/user as mob)
user << "[src.name] has three settings, and they are all DESTROY."
-
-
-/obj/item/weapon/gun/energy/pulse_rifle/M1911
- name = "m1911-P"
+/obj/item/weapon/gun/energy/pulse/pistol/m1911
+ name = "\improper M1911-P"
desc = "A compact pulse core in a classic handgun frame for Nanotrasen officers. It's not the size of the gun, it's the size of the hole it puts through people."
icon_state = "m1911-p"
- cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
-
-
+ item_state = "gun"
+ cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 1547e6857ce..9698ca64d37 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -122,6 +122,8 @@
overheat = 0
recent_reload = 0
..()
+/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
+ return
/obj/item/weapon/gun/energy/kinetic_accelerator/attack_self(mob/living/user)
if(overheat || recent_reload)
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 0fdbc0456bb..2c8147992ea 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -70,4 +70,9 @@
/obj/item/weapon/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "The [name] whizzles quietly."
- return
\ No newline at end of file
+ return
+
+/obj/item/weapon/gun/magic/suicide_act(mob/user)
+ user.visible_message("[user] is casting a spell on themself with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, fire_sound, 50, 1, -1)
+ return (FIRELOSS)
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index db55594fa4d..624244252dd 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -132,6 +132,16 @@
boolets += magazine.ammo_count()
return boolets
+/obj/item/weapon/gun/projectile/suicide_act(mob/user)
+ if (src.chambered)
+ user.visible_message("[user] is trying to blow \his brains out with the [src.name]! It looks like \he's trying to commit suicide.")
+ playsound(loc, fire_sound, 50, 1, -1)
+ return(BRUTELOSS)
+ else
+ user.visible_message("[user] is pretending to blow \his brains out with the [src.name]! It looks like \he's trying to commit suicide!")
+ playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
+ return (OXYLOSS)
+
/obj/item/weapon/suppressor
name = "suppressor"
desc = "A universal syndicate small-arms suppressor for maximum espionage."
diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm
index 9afb2cc233b..04a1f9bddb0 100644
--- a/code/modules/reagents/Chemistry-Goon-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm
@@ -14,7 +14,7 @@ datum/reagent/silver_sulfadiazine
datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.adjustFireLoss((volume-(volume*2))*REM)
+ M.adjustFireLoss(-volume)
M << "You feel your burns healing!"
M.emote("scream")
if(method == INGEST)
@@ -25,8 +25,7 @@ datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/meth
datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
- if(prob(55))
- M.adjustFireLoss(-2*REM)
+ M.adjustFireLoss(-2*REM)
..()
return
@@ -40,7 +39,7 @@ datum/reagent/styptic_powder
datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.heal_organ_damage(volume*REM,0)
+ M.adjustBruteLoss(-volume)
M << "You feel your wounds knitting back together!"
M.emote("scream")
if(method == INGEST)
@@ -52,7 +51,7 @@ datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TO
datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(55))
- M.adjustBruteLoss(-2*REM)
+ M.adjustBruteLoss(-8*REM)
..()
return
@@ -81,8 +80,8 @@ datum/reagent/synthflesh
datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!M) M = holder.my_atom
if(method == TOUCH)
- M.adjustBruteLoss(-(1*volume)*REM)
- M.adjustFireLoss(-(1*volume)*REM)
+ M.adjustBruteLoss(-1.5*volume)
+ M.adjustFireLoss(-1.5*volume)
M << "You feel your burns healing and your flesh knitting together!"
..()
return
@@ -496,7 +495,7 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
name = "Oculine"
id = "oculine"
result = "oculine"
- required_reagents = list("atropine" = 1, "spaceacillin" = 1, "salglu_solution" = 1)
+ required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
mix_message = "The mixture sputters loudly and becomes a pale pink color."
@@ -601,24 +600,23 @@ datum/reagent/strange_reagent
metabolization_rate = 0.2
datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume)
- if(M.bruteloss > 80 || M.fireloss > 80)
- if(ishuman(M) || ismonkey(M))
- var/mob/living/carbon/C_target = M
- var/obj/item/organ/brain/B = C_target.getorgan(/obj/item/organ/brain)
- if(B)
- B.loc = get_turf(C_target)
- B.transfer_identity(C_target)
- C_target.internal_organs -= B
- M.gib()
- else if(M.stat == DEAD)
+ if(M.stat == DEAD)
+ if(M.getBruteLoss() >= 80 || M.getFireLoss() >= 80)
+ if(ishuman(M) || ismonkey(M))
+ var/mob/living/carbon/C_target = M
+ var/obj/item/organ/brain/B = C_target.getorgan(/obj/item/organ/brain)
+ if(B)
+ B.loc = get_turf(C_target)
+ B.transfer_identity(C_target)
+ C_target.internal_organs -= B
+ M.gib(M)
+ return
var/mob/dead/observer/ghost = M.get_ghost()
M.visible_message("[M]'s body convulses a bit.")
- if(M.health <= config.health_threshold_dead && !M.suiciding && !ghost && !(NOCLONE in M.mutations))
+ if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
M.stat = 1
- M.adjustBruteLoss(-10)
- M.adjustFireLoss(-10)
- M.adjustOxyLoss(-10)
- M.adjustToxLoss(-10)
+ M.adjustOxyLoss(-20)
+ M.adjustToxLoss(-20)
dead_mob_list -= M
living_mob_list |= list(M)
M.emote("gasp")
@@ -814,4 +812,4 @@ datum/reagent/stimulants/overdose_process(var/mob/living/M as mob)
M.adjustToxLoss(2*REM)
M.losebreath++
..()
- return
\ No newline at end of file
+ return
diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm
index 62b5a848c9a..963e85a214c 100644
--- a/code/modules/reagents/Chemistry-Goon-Other.dm
+++ b/code/modules/reagents/Chemistry-Goon-Other.dm
@@ -118,8 +118,8 @@ datum/reagent/colorful_reagent
required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1)
result_amount = 5
-datum/reagent/colorful_reagent/reaction_mob(var/mob/M, var/volume)
- if(M)
+datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume)
+ if(M && isliving(M))
M.color = pick(potential_colors)
..()
return
@@ -147,4 +147,4 @@ datum/reagent/triple_citrus
id = "triple_citrus"
result = "triple_citrus"
required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
- result_amount = 5
\ No newline at end of file
+ result_amount = 5
diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
index ddb358b72b5..777ec06fdf0 100644
--- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
@@ -140,4 +140,5 @@ proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull
for(var/i = 0, i < pull_times, i++)
step_away(X,T)
else
- X.throw_at(T)
\ No newline at end of file
+ for(var/i = 0, i < pull_times, i++)
+ step_towards(X,T)
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm
index 4264afcefa2..8c0a3b7d61c 100644
--- a/code/modules/reagents/Chemistry-Goon-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm
@@ -103,12 +103,11 @@ datum/reagent/neurotoxin2
datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
cycle_count++
- if(!M) M = holder.my_atom
if(M.brainloss + M.toxloss <= 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(cycle_count == 17)
- M.sleeping += 1
+ M.sleeping += 10 // buffed so it works
..()
return
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 50258b5f234..a5c6f90546e 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -107,9 +107,13 @@ datum/reagents/proc/trans_to(var/obj/target, var/amount=1, var/multiplier=1, var
var/part = amount / src.total_volume
var/trans_data = null
for (var/datum/reagent/current_reagent in src.reagent_list)
+ if (current_reagent.id == "blood" && ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.inject_blood(my_atom, amount)
+ continue
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
- trans_data = current_reagent.data
+ trans_data = copy_data(current_reagent)
R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data)
src.remove_reagent(current_reagent.id, current_reagent_transfer)
@@ -524,6 +528,38 @@ datum/reagents/proc/delete()
if(my_atom)
my_atom.reagents = null
+ //two helper functions to preserve data across reactions (needed for xenoarch)
+datum/reagents/proc/get_data(var/reagent_id)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+ //world << "proffering a data-carrying reagent ([reagent_id])"
+ return D.data
+
+datum/reagents/proc/set_data(var/reagent_id, var/new_data)
+ for(var/datum/reagent/D in reagent_list)
+ if(D.id == reagent_id)
+ //world << "reagent data set ([reagent_id])"
+ D.data = new_data
+
+datum/reagents/proc/copy_data(var/datum/reagent/current_reagent)
+ if (!current_reagent || !current_reagent.data) return null
+ if (!istype(current_reagent.data, /list)) return current_reagent.data
+
+ var/list/trans_data = current_reagent.data.Copy()
+
+ // We do this so that introducing a virus to a blood sample
+ // doesn't automagically infect all other blood samples from
+ // the same donor.
+ //
+ // Technically we should probably copy all data lists, but
+ // that could possibly eat up a lot of memory needlessly
+ // if most data lists are read-only.
+ if (trans_data["viruses"])
+ var/list/v = trans_data["viruses"]
+ trans_data["viruses"] = v.Copy()
+
+ return trans_data
+
///////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index ef220eaca26..97d07b4d732 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -251,12 +251,13 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
- var/beaker = null
+ var/obj/item/weapon/reagent_containers/glass/beaker = null
var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
var/mode = 0
var/condi = 0
var/useramount = 30 // Last used amount
+
/obj/machinery/chem_master/New()
create_reagents(100)
overlays += "waitlight"
@@ -277,15 +278,14 @@
stat |= NOPOWER
-/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
+/obj/machinery/chem_master/attackby(var/obj/item/B as obj, var/mob/user as mob)
if(default_unfasten_wrench(user, B))
return
if(istype(B, /obj/item/weapon/reagent_containers/glass))
-
if(src.beaker)
- user << "A beaker is already loaded into the machine."
+ user << "A beaker is already loaded into the machine."
return
src.beaker = B
user.drop_item()
@@ -294,17 +294,16 @@
src.updateUsrDialog()
icon_state = "mixer1"
- else if(istype(B, /obj/item/weapon/storage/pill_bottle))
-
+ else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle))
if(src.loaded_pill_bottle)
- user << "A pill bottle is already loaded into the machine."
+ user << "A pill bottle is already loaded into the machine."
return
-
src.loaded_pill_bottle = B
user.drop_item()
B.loc = src
user << "You add the pill bottle into the dispenser slot!"
src.updateUsrDialog()
+
return
/obj/machinery/chem_master/Topic(href, href_list)
@@ -313,44 +312,63 @@
usr.set_machine(src)
-
- if (href_list["ejectp"])
+ if(href_list["ejectp"])
if(loaded_pill_bottle)
loaded_pill_bottle.loc = src.loc
loaded_pill_bottle = null
+
else if(href_list["close"])
usr << browse(null, "window=chem_master")
usr.unset_machine()
return
+ else if(href_list["toggle"])
+ mode = !mode
+
+ else if(href_list["createbottle"])
+ if(!condi)
+ var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
+ if(!name)
+ return
+ var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
+ P.name = trim("[name] bottle")
+ P.pixel_x = rand(-7, 7) //random position
+ P.pixel_y = rand(-7, 7)
+ reagents.trans_to(P, 30)
+ else
+ var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
+ reagents.trans_to(P, 50)
+
if(beaker)
- var/datum/reagents/R = beaker:reagents
+ var/datum/reagents/R = beaker.reagents
if (href_list["analyze"])
var/dat = ""
- if(!condi)
- dat += "Chemmaster 3000Chemical infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]
(Back)"
- else
- dat += "Condimaster 3000Condiment infos:
Name: [href_list["name"]]
Description: [href_list["desc"]]
(Back)"
- usr << browse(dat, "window=chem_master;size=575x400")
+ dat += "[condi ? "Condiment" : "Chemical"] information:
"
+ dat += "Name: [href_list["name"]]
"
+ dat += "Description: [href_list["desc"]]
"
+ dat += "Back"
+ var/datum/browser/popup = new(usr, "chem_master", name)
+ popup.set_content(dat)
+ popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open(1)
return
- else if (href_list["add"])
-
+ else if(href_list["add"])
if(href_list["amount"])
var/id = href_list["add"]
var/amount = text2num(href_list["amount"])
if (amount < 0) return
R.trans_id_to(src, id, amount)
- else if (href_list["addcustom"])
-
+ else if(href_list["addcustom"])
var/id = href_list["addcustom"]
- useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
+ var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null)
+ if(!amt_temp)
+ return
+ useramount = amt_temp
src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
- else if (href_list["remove"])
-
+ else if(href_list["remove"])
if(href_list["amount"])
var/id = href_list["remove"]
var/amount = text2num(href_list["amount"])
@@ -360,38 +378,37 @@
else
reagents.remove_reagent(id, amount)
-
- else if (href_list["removecustom"])
-
+ else if(href_list["removecustom"])
var/id = href_list["removecustom"]
- useramount = input("Select the amount to transfer.", 30, useramount) as num
- useramount = isgoodnumber(useramount)
+ var/amt_temp = isgoodnumber(input(usr, "Select the amount to transfer.", "Transfer how much?", useramount) as num|null)
+ if(!amt_temp)
+ return
+ useramount = amt_temp
src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
- else if (href_list["toggle"])
- mode = !mode
-
- else if (href_list["main"])
+ else if(href_list["main"])
attack_hand(usr)
return
- else if (href_list["eject"])
+
+ else if(href_list["eject"])
if(beaker)
- beaker:loc = src.loc
+ beaker.loc = src.loc
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
- else if (href_list["createpill"]) //Also used for condiment packs.
+
+ else if(href_list["createpill"]) //Also used for condiment packs.
if(reagents.total_volume == 0) return
if(!condi)
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(href_list["many"]))
- amount = min(max(round(input(usr, "Amount:", "How many pills?", amount) as num|null), 0), 10)
+ amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0), 10)
if(!amount)
return
- vol_each = min(reagents.total_volume/amount, 50)
+ vol_each = min(reagents.total_volume / amount, 50)
var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
- if(!name)
+ if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/pill/P
@@ -406,7 +423,7 @@
reagents.trans_to(P,vol_each)
else
var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)
- if(!name)
+ if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc)
@@ -415,30 +432,17 @@
P.desc = "A small condiment pack. The label says it contains [name]."
reagents.trans_to(P,10)
- else if (href_list["createbottle"])
- if(!condi)
- var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
- if(!name)
- return
- var/obj/item/weapon/reagent_containers/glass/bottle/P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
- P.name = trim("[name] bottle")
- P.pixel_x = rand(-7, 7) //random position
- P.pixel_y = rand(-7, 7)
- reagents.trans_to(P,30)
- else
- var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
- reagents.trans_to(P,50)
else if(href_list["createpatch"])
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(href_list["many"]))
- amount = min(max(round(input(usr, "Amount:", "How many patches?", amount) as num|null), 0), 10)
+ amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0), 10)
if(!amount)
return
- vol_each = min(reagents.total_volume/amount, 50)
+ vol_each = min(reagents.total_volume / amount, 50)
var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
- if(!name)
+ if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/pill/P
@@ -461,61 +465,76 @@
/obj/machinery/chem_master/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
+
user.set_machine(src)
var/dat = ""
- if(!beaker)
+ if(beaker)
+ dat += "Beaker \[[beaker.reagents.total_volume]/[beaker.volume]\] Eject and Clear Buffer "
+ else
dat = "Please insert beaker. "
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]
"
- else
- dat += "No pill bottle inserted.
"
- dat += "Close"
- else
- var/datum/reagents/R = beaker:reagents
- dat += "Eject beaker and Clear Buffer "
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]
"
- else
- dat += "No pill bottle inserted.
"
- if(!R.total_volume)
- dat += "Beaker is empty."
- else
- dat += "Add to buffer: "
- for(var/datum/reagent/G in R.reagent_list)
- dat += "[G.name] , [G.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(All) "
- dat += "(Custom) "
- dat += " Transfer to [(!mode ? "disposal" : "beaker")]: "
- if(reagents.total_volume)
- for(var/datum/reagent/N in reagents.reagent_list)
- dat += "[N.name] , [N.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(All) "
- dat += "(Custom) "
+ dat += " Add to buffer: Transfer to [(!mode ? "disposal" : "beaker")]:"
+ if(reagents.total_volume)
+ for(var/datum/reagent/N in reagents.reagent_list)
+ dat += "- [N.name], [N.volume] Units - "
+ dat += "Analyze "
+ dat += "1 "
+ dat += "5 "
+ dat += "10 "
+ dat += "All "
+ dat += "Custom"
+ else
+ dat += "
- Buffer is empty."
+ dat += "
"
+
+ if(!condi)
+ if(src.loaded_pill_bottle)
+ dat += "Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\] Eject"
+ else
+ dat += "No pill bottle inserted."
+ else
+ dat += " "
+
+ dat += ""
+ if(!condi)
+ if(beaker && reagents.total_volume)
+ dat += "- Create pill (50 units max)"
+ dat += "
- Create multiple pills
"
+ dat += " - Create patch (50 units max)"
+ dat += "
- Create multiple patches
"
+ else
+ dat += " - Create pill (50 units max)"
+ dat += "
- Create multiple pills
"
+ dat += " - Create patch (50 units max)"
+ dat += "
- Create multiple patches
"
+ else
+ if(beaker && reagents.total_volume)
+ dat += " - Create pack (10 units max)
"
+ else
+ dat += " - Create pack (10 units max)
"
+ dat += " - Create bottle ([condi ? "50" : "30"] units max)"
+ dat += "
"
+ dat += " Close"
+ var/datum/browser/popup = new(user, "chem_master", name, 470, 500)
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open(1)
return
/obj/machinery/chem_master/proc/isgoodnumber(var/num)
@@ -523,7 +542,7 @@
if(num > 200)
num = 200
else if(num < 0)
- num = 1
+ num = 0
else
num = round(num)
return num
@@ -531,7 +550,6 @@
return 0
-
/obj/machinery/chem_master/condimaster
name = "CondiMaster 3000"
desc = "Used to create condiments and other cooking supplies."
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
index 9e859298063..335c2be3a81 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
@@ -166,7 +166,6 @@ datum/reagent/blood/on_merge(var/list/data)
src.data["viruses"] = preserve
return 1
-
datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the blood all over the place
if(!istype(T)) return
var/datum/reagent/blood/self = src
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index c97db6d16bd..e81ee2c5813 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1066,7 +1066,7 @@ datum/chemical_reaction/pestkiller
required_other = 1
/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime
+ var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
P.loc = get_turf(holder.my_atom)
/datum/chemical_reaction/slimeglow
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
new file mode 100644
index 00000000000..088c6ae2236
--- /dev/null
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -0,0 +1,52 @@
+/obj/item/weapon/reagent_containers/blood
+ name = "blood pack"
+ desc = "Contains blood used for transfusion. Must be attached to an IV drip."
+ icon = 'icons/obj/bloodpack.dmi'
+ icon_state = "empty"
+ volume = 200
+
+ var/blood_type = null
+
+/obj/item/weapon/reagent_containers/blood/New()
+ ..()
+ if(blood_type != null)
+ name = "blood pack [blood_type]"
+ reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
+ update_icon()
+
+/obj/item/weapon/reagent_containers/blood/on_reagent_change()
+ update_icon()
+
+/obj/item/weapon/reagent_containers/blood/update_icon()
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 9) icon_state = "empty"
+ if(10 to 50) icon_state = "half"
+ if(51 to INFINITY) icon_state = "full"
+
+/obj/item/weapon/reagent_containers/blood/random/New()
+ blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
+ ..()
+
+/obj/item/weapon/reagent_containers/blood/APlus
+ blood_type = "A+"
+
+/obj/item/weapon/reagent_containers/blood/AMinus
+ blood_type = "A-"
+
+/obj/item/weapon/reagent_containers/blood/BPlus
+ blood_type = "B+"
+
+/obj/item/weapon/reagent_containers/blood/BMinus
+ blood_type = "B-"
+
+/obj/item/weapon/reagent_containers/blood/OPlus
+ blood_type = "O+"
+
+/obj/item/weapon/reagent_containers/blood/OMinus
+ blood_type = "O-"
+
+/obj/item/weapon/reagent_containers/blood/empty
+ name = "empty blood pack"
+ desc = "Seems pretty useless... Maybe if there were a way to fill it?"
+ icon_state = "empty"
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 6706572d78b..8a0afbfe290 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -50,7 +50,7 @@
ignore_flags = 1 // So they can heal their comrades.
list_reagents = list("epinephrine" = 15, "salglu_solution" = 15)
-obj/item/weapon/reagent_containers/hypospray/combat/nanites
+/obj/item/weapon/reagent_containers/hypospray/combat/nanites
desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with expensive medical nanites for rapid healing."
volume = 100
list_reagents = list("nanites" = 80, "synaptizine" = 20)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 04131cd4de8..dfdb24a2863 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -8,11 +8,14 @@
volume = 50
var/apply_type = INGEST
var/apply_method = "swallow"
+ var/roundstart = 0
/obj/item/weapon/reagent_containers/pill/New()
..()
if(!icon_state)
icon_state = "pill[rand(1,20)]"
+ if(reagents.total_volume && roundstart)
+ name += " ([reagents.total_volume]u)"
/obj/item/weapon/reagent_containers/pill/attack_self(mob/user)
@@ -70,63 +73,64 @@
desc = "Highly toxic."
icon_state = "pill5"
list_reagents = list("toxin" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/cyanide
name = "cyanide pill"
desc = "Don't swallow this."
icon_state = "pill5"
list_reagents = list("cyanide" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/adminordrazine
name = "adminordrazine pill"
desc = "It's magic. We don't have to explain it."
icon_state = "pill16"
list_reagents = list("adminordrazine" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/morphine
name = "morphine pill"
desc = "Commonly used to treat insomnia."
icon_state = "pill8"
list_reagents = list("morphine" = 30)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/stimulant
name = "stimulant pill"
desc = "Often taken by overworked employees, athletes, and the inebriated. You'll snap to attention immediately!"
icon_state = "pill19"
list_reagents = list("ephedrine" = 10, "ethylredoxrazine" = 10, "coffee" = 30)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/salbutamol
name = "salbutamol pill"
desc = "Used to treat oxygen deprivation."
icon_state = "pill18"
list_reagents = list("salbutamol" = 30)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/charcoal
name = "antitoxin pill"
desc = "Neutralizes many common toxins."
icon_state = "pill17"
list_reagents = list("charcoal" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/epinephrine
name = "epinephrine pill"
desc = "Used to stabilize patients."
icon_state = "pill5"
- list_reagents = list("epinephrine" = 50)
-
+ list_reagents = list("epinephrine" = 15)
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/mannitol
name = "mannitol pill"
desc = "Used to treat brain damage."
icon_state = "pill17"
list_reagents = list("mannitol" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/mutadone
name = "mutadone pill"
desc = "Used to treat genetic damage."
icon_state = "pill20"
list_reagents = list("mutadone" = 50)
-
+ roundstart = 1
/obj/item/weapon/reagent_containers/pill/salicyclic
- name = "salicyclic acid pill"
+ name = "salicylic acid pill"
desc = "Used to dull pain."
icon_state = "pill5"
- list_reagents = list("sal_acid" = 50)
+ list_reagents = list("sal_acid" = 24)
+ roundstart = 1
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index d231d8b4f35..a97f1f44a08 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -77,11 +77,10 @@
if(istype(target, /mob/living/carbon)) //maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea.
var/amount = src.reagents.maximum_volume - src.reagents.total_volume
var/mob/living/carbon/T = target
- var/datum/reagent/B = new /datum/reagent/blood
if(!check_dna_integrity(T))
user << "You are unable to locate any blood."
return
- if(NOCLONE in T.mutations) //target done been et, no more blood in him
+ if(NOCLONE in T.mutations) //target done been eat, no more blood in him
user << "You are unable to locate any blood."
return
if(target != user)
@@ -92,46 +91,14 @@
busy = 0
return
busy = 0
- B.holder = src
- B.volume = amount
- //set reagent data
- B.data["donor"] = T
+ var/datum/reagent/B
+ B = T.take_blood(src,amount)
- /*
- if(T.virus && T.virus.spread_type != SPECIAL)
- B.data["virus"] = new T.virus.type(0)
- */
-
- for(var/datum/disease/D in T.viruses)
- if(!B.data["viruses"])
- B.data["viruses"] = list()
-
- B.data["viruses"] += new D.type(0, D, 1)
-
- B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0)
- if(T.resistances&&T.resistances.len)
- B.data["resistances"] = T.resistances.Copy()
- if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation...
- var/mob/living/carbon/human/HT = target
- B.data["blood_type"] = copytext(HT.dna.blood_type,1,0)
- var/list/temp_chem = list()
- for(var/datum/reagent/R in target.reagents.reagent_list)
- temp_chem += R.name
- temp_chem[R.name] = R.volume
- B.data["trace_chem"] = list2params(temp_chem)
- if(T.mind)
- B.data["mind"] = T.mind
- if(T.ckey)
- B.data["ckey"] = T.ckey
- if(!T.suiciding)
- B.data["cloneable"] = 1
- B.data["gender"] = T.gender
- B.data["real_name"] = T.real_name
- B.data["factions"] = T.faction
- reagents.reagent_list += B
- reagents.update_total()
- on_reagent_change()
- reagents.handle_reactions()
+ if (B)
+ src.reagents.reagent_list += B
+ src.reagents.update_total()
+ src.on_reagent_change()
+ src.reagents.handle_reactions()
user.visible_message("[user] takes a blood sample from [target].")
else //if not mob
@@ -190,10 +157,17 @@
reagents.reaction(target, INGEST)
spawn(5)
- target.add_fingerprint(user)
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- user << "You inject [trans] unit\s of the solution. [src] now contains [reagents.total_volume] unit\s."
- if(reagents.total_volume <= 0 && mode == SYRINGE_INJECT)
+ var/datum/reagent/blood/B
+ for(var/datum/reagent/blood/d in src.reagents.reagent_list)
+ B = d
+ break
+ if(B && istype(target,/mob/living/carbon))
+ var/mob/living/carbon/C = target
+ C.inject_blood(src,5)
+ else
+ src.reagents.trans_to(target, amount_per_transfer_from_this)
+ user << "You inject 5 units of the solution. The syringe now contains [src.reagents.total_volume] units."
+ if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 158b666f29d..e6f476df192 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -630,7 +630,8 @@
id = "borg_upgrade_vtec"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/vtec
- materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 5000)
+ req_tech = list("engineering" = 4, "materials" = 5)
+ materials = list("$metal"=80000 , "$glass"=6000 , "$uranium"= 5000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -639,6 +640,7 @@
id = "borg_upgrade_tasercooler"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/tasercooler
+ req_tech = list("combat" = 5, "power" = 4)
materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 2000, "$diamond" = 500)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -648,7 +650,8 @@
id = "borg_upgrade_jetpack"
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/jetpack
- materials = list("$metal"=10000,"$plasma"=15000,"$uranium" = 20000)
+ req_tech = list("engineering" = 4, "power" = 4)
+ materials = list("$metal"=10000,"$plasma"=12000,"$uranium" = 10000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
diff --git a/code/world.dm b/code/world.dm
index 039a2c95545..1b0a3d17072 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -58,7 +58,7 @@
world.log << "Database connection established."
- data_core = new /obj/effect/datacore()
+ data_core = new /datum/datacore()
spawn(-1)
diff --git a/config/admins.txt b/config/admins.txt
index 3081f865151..dc149720d8b 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -77,3 +77,4 @@ thurgatar = Game Master
xerux = Game Master
dannno = Game Master
allura = Game Master
+lo6a4evskiy = Game Master
diff --git a/html/changelog.html b/html/changelog.html
index db07feeae83..123c3211958 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,64 @@
-->
+
+ 04 February 2015
+ Danno updated:
+
+ - Fixes dufflebag's storage capacity.
+
+ Deantwo updated:
+
+ - Removes duplicate fluorine from Chemical Dispenser.
+ - Added GoonChems to the Portable Chem Dispenser.
+ - Added cancel buttons to the ChemMaster and CondiMaster when making bottles, pills, etc.
+
+ Delimusca updated:
+
+ - Added new foam armblade toy to arcade prizes.
+ - Slimes can drag themselves to mobs to start feeding.
+ - Attacking another slime will pull them off their victim if they're feeding or steal some of their mass.
+
+ GunHog updated:
+
+ - Five new silicon emotes: *buzz2, *chime, *honk, *sad and *warn
+
+ Incoming5643 updated:
+
+ - New contraband crate containing fifty butterflies.
+ - Shuttle will now always arrive, but won't launch in rounds where it would've been previously auto-recalled.
+
+ Menshin updated:
+
+ - Fixed being unable to place cables on plating.
+
+ Paprika updated:
+
+ - Helmets for hardsuits are stored inside the suit and cannot be equipped without the suit on.
+ - EVA space suits are now lighter for faster movement but lack flash or welding protection, don't hide your identity and have less radiation protection.
+
+ Perakp updated:
+
+ - Tweaked slowdown due to coldness when in in low gravity.
+
+ Steelpoint updated:
+
+ - ERT base equipment rooms are now access restriction to each role.
+ - ERT commander spawns wearing hardsuit for identification.
+ - Two boxes of metal foam grenades added for ERT engineers.
+ - Deep space sensors recently detected the derelict remains of the NTSS Omen, a outdated Medical Frigate thought lost, within close proximity to Space Station 13.
+ - If any SS13 EVA Personal are able to locate this ship, they will be able to pilot it back to the station for recovery. The ship may also have cordinates for other locations.
+
+ Xhuis updated:
+
+ - Changelings now have the ability Strained Muscles, which lets them move at inhuman speeds at the cost of rapid stamina damage. It costs one evolution points=.
+ - Changelings now have the ability Augmented Eyesight, which lets them see creatures through walls and see in the dark. It costs two evolution points.
+ - After many failed raids, the Syndicate have finally done something about poor communications between cyborgs and operatives.
+ - Syndicate Cyborgs now come equipped with operative pinpointers, which will automatically point to the nearest nuclear operative.
+ - Handheld crew monitors can now be stored in medical belts.
+
+
+
26 January 2015
Dannno updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 6e4689f9583..444c27d60ce 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2377,3 +2377,52 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
never been easier!
fleure:
- rscadd: Added briefcase filled with cash to uplink.
+2015-02-04:
+ Danno:
+ - bugfix: Fixes dufflebag's storage capacity.
+ Deantwo:
+ - bugfix: Removes duplicate fluorine from Chemical Dispenser.
+ - bugfix: Added GoonChems to the Portable Chem Dispenser.
+ - bugfix: Added cancel buttons to the ChemMaster and CondiMaster when making bottles,
+ pills, etc.
+ Delimusca:
+ - rscadd: Added new foam armblade toy to arcade prizes.
+ - tweak: Slimes can drag themselves to mobs to start feeding.
+ - tweak: Attacking another slime will pull them off their victim if they're feeding
+ or steal some of their mass.
+ GunHog:
+ - rscadd: 'Five new silicon emotes: *buzz2, *chime, *honk, *sad and *warn'
+ Incoming5643:
+ - rscadd: New contraband crate containing fifty butterflies.
+ - tweak: Shuttle will now always arrive, but won't launch in rounds where it would've
+ been previously auto-recalled.
+ Menshin:
+ - bugfix: Fixed being unable to place cables on plating.
+ Paprika:
+ - wip: Helmets for hardsuits are stored inside the suit and cannot be equipped without
+ the suit on.
+ - tweak: EVA space suits are now lighter for faster movement but lack flash or welding
+ protection, don't hide your identity and have less radiation protection.
+ Perakp:
+ - tweak: Tweaked slowdown due to coldness when in in low gravity.
+ Steelpoint:
+ - rscadd: ERT base equipment rooms are now access restriction to each role.
+ - tweak: ERT commander spawns wearing hardsuit for identification.
+ - rscadd: Two boxes of metal foam grenades added for ERT engineers.
+ - rscadd: Deep space sensors recently detected the derelict remains of the NTSS
+ Omen, a outdated Medical Frigate thought lost, within close proximity to Space
+ Station 13.
+ - rscadd: If any SS13 EVA Personal are able to locate this ship, they will be able
+ to pilot it back to the station for recovery. The ship may also have cordinates
+ for other locations.
+ Xhuis:
+ - rscadd: Changelings now have the ability Strained Muscles, which lets them move
+ at inhuman speeds at the cost of rapid stamina damage. It costs one evolution
+ points=.
+ - rscadd: Changelings now have the ability Augmented Eyesight, which lets them see
+ creatures through walls and see in the dark. It costs two evolution points.
+ - tweak: After many failed raids, the Syndicate have finally done something about
+ poor communications between cyborgs and operatives.
+ - rscadd: Syndicate Cyborgs now come equipped with operative pinpointers, which
+ will automatically point to the nearest nuclear operative.
+ - tweak: Handheld crew monitors can now be stored in medical belts.
diff --git a/html/changelogs/Danno-Suicide-7496.yml b/html/changelogs/Danno-Suicide-7496.yml
new file mode 100644
index 00000000000..e32356f3002
--- /dev/null
+++ b/html/changelogs/Danno-Suicide-7496.yml
@@ -0,0 +1,5 @@
+author: Dannno
+
+delete-after: True
+ - rscadd: "Added specific suicide messages to guns of all types."
+ - rscadd: "Added special suicide messages to various different items."
\ No newline at end of file
diff --git a/html/changelogs/Deantwo-PR-7403.yml b/html/changelogs/Deantwo-PR-7403.yml
deleted file mode 100644
index e28b1fd143d..00000000000
--- a/html/changelogs/Deantwo-PR-7403.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Deantwo
-
-delete-after: True
-
-changes:
- - bugfix: "Removes duplicate fluorine from Chemical Dispenser."
- - bugfix: "Added GoonChems to the Portable Chem Dispenser."
- - bugfix: "Added cancel buttons to the ChemMaster and CondiMaster when making bottles, pills, etc."
diff --git a/html/changelogs/Deantwo-PR-7445.yml b/html/changelogs/Deantwo-PR-7445.yml
new file mode 100644
index 00000000000..d31b8778699
--- /dev/null
+++ b/html/changelogs/Deantwo-PR-7445.yml
@@ -0,0 +1,6 @@
+author: Deantwo
+
+delete-after: True
+
+changes:
+ - tweak: "Updated the ChemMaster's UI to the station default along with some functionality improvements."
diff --git a/html/changelogs/Iamgoofball-Buffs.yml b/html/changelogs/Iamgoofball-Buffs.yml
new file mode 100644
index 00000000000..5763d9702db
--- /dev/null
+++ b/html/changelogs/Iamgoofball-Buffs.yml
@@ -0,0 +1,6 @@
+ author: Iamgoofball
+
+delete-after: True
+
+changes:
+ - rscadd: "Buffs the shit out of Styptic Powder and Silver Sulf, they're now viable to use. Synthflesh is still good for general treatment, but overall Styptic and Silver Sulf deal with their respective damage types way better now."
\ No newline at end of file
diff --git a/html/changelogs/Steelpoint-PR-7327.yml b/html/changelogs/Lo6a4evskiy-PR-7257.yml
similarity index 66%
rename from html/changelogs/Steelpoint-PR-7327.yml
rename to html/changelogs/Lo6a4evskiy-PR-7257.yml
index ce66b9d478f..507f2478826 100644
--- a/html/changelogs/Steelpoint-PR-7327.yml
+++ b/html/changelogs/Lo6a4evskiy-PR-7257.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Steelpoint
+author: Lo6a4evskiy
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,5 +33,7 @@ delete-after: True
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in single (') or double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "Deep space sensors recently detected the derelict remains of the NTSS Omen, a outdated Medical Frigate thought lost, within close proximity to Space Station 13."
- - rscadd: "If any SS13 EVA Personal are able to locate this ship, they will be able to pilot it back to the station for recovery. The ship may also have cordinates for other locations."
\ No newline at end of file
+ - rscadd: "General record now contains a species field and a photo of the crewmember. Security record consoles allow you to update it with a photo taken in-game (with detective's camera, for example, or AI's)."
+ - rscadd: "Expanded functionality of security HUDs to display rank and photos."
+ - rscadd: "Medical HUDs allow user to change others' mental and physical status. Currently has no gameplay effect other than changing records."
+ - rscadd: "Medical HUDs can perform an examination at the distance, similrarly to how attacking yourself with help intent works. Has limited ability to detect suffocation and toxin damage."
\ No newline at end of file
diff --git a/html/changelogs/Paprka-ablightonrobotics.yml b/html/changelogs/Paprka-ablightonrobotics.yml
new file mode 100644
index 00000000000..1595635449b
--- /dev/null
+++ b/html/changelogs/Paprka-ablightonrobotics.yml
@@ -0,0 +1,4 @@
+author: Paprika
+delete-after: True
+changes:
+ - tweak: "Added rnd requirements to borg upgrades and tweaked the prices."
\ No newline at end of file
diff --git a/html/changelogs/Paprka-ointmentandshit.yml b/html/changelogs/Paprka-ointmentandshit.yml
new file mode 100644
index 00000000000..ea04e9e1fa0
--- /dev/null
+++ b/html/changelogs/Paprka-ointmentandshit.yml
@@ -0,0 +1,4 @@
+author: Paprika
+delete-after: True
+changes:
+ - rscadd: "Added blood and bleeding. If you take enough brute damage on a certain limb, you will start bleeding, and will need to patch your bleeding with gauze from medbay. You can replace lost blood by eating nutritious food and waiting for your heart to reproduce it, or by getting a blood transfusion from an IV drip."
\ No newline at end of file
diff --git a/html/changelogs/TZK13-PR-7197.yml b/html/changelogs/TZK13-PR-7197.yml
new file mode 100644
index 00000000000..665b84e1627
--- /dev/null
+++ b/html/changelogs/TZK13-PR-7197.yml
@@ -0,0 +1,9 @@
+author: TZK13
+
+delete-after: True
+
+changes:
+ - rscadd: "Advancements in the field of virology by Nanotrasen's finest have uncovered three new disease symptoms for further research:"
+ - rscadd: "Ocular Restoration heals any eye trauma experienced by the infected patient."
+ - rscadd: "Revitiligo increases the pigmentation levels of the infected patient's skin."
+ - rscadd: "Spontaneous Combustion ignites the infected patient without warning."
\ No newline at end of file
diff --git a/html/changelogs/Vekter-PR-7526.yml b/html/changelogs/Vekter-PR-7526.yml
new file mode 100644
index 00000000000..e6166381f0c
--- /dev/null
+++ b/html/changelogs/Vekter-PR-7526.yml
@@ -0,0 +1,6 @@
+author: Vekter
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a toy red button to the Arcade cabinets."
diff --git a/html/changelogs/Xhuis - ChangelingAbilities.yml b/html/changelogs/Xhuis - ChangelingAbilities.yml
deleted file mode 100644
index 50085a4066a..00000000000
--- a/html/changelogs/Xhuis - ChangelingAbilities.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Xhuis
-delete-after: True
-
-
-changes:
- - rscadd: "Changelings now have the ability Strained Muscles, which lets them move at inhuman speeds at the cost of rapid stamina damage. It costs one evolution points=."
- - rscadd: "Changelings now have the ability Augmented Eyesight, which lets them see creatures through walls and see in the dark. It costs two evolution points."
\ No newline at end of file
diff --git a/html/changelogs/Xhuis - SyndiBorgPinpointers.yml b/html/changelogs/Xhuis - SyndiBorgPinpointers.yml
deleted file mode 100644
index 92cfd31e29f..00000000000
--- a/html/changelogs/Xhuis - SyndiBorgPinpointers.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Xhuis
-
-delete-after: true
-
-changes:
- - tweak: "After many failed raids, the Syndicate have finally done something about poor communications between cyborgs and operatives."
- - rscadd: "Syndicate Cyborgs now come equipped with operative pinpointers, which will automatically point to the nearest nuclear operative."
diff --git a/html/changelogs/Xhuis-HandheldConsolesOnBelts.yml b/html/changelogs/Xhuis-HandheldConsolesOnBelts.yml
deleted file mode 100644
index fabb970fa9f..00000000000
--- a/html/changelogs/Xhuis-HandheldConsolesOnBelts.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Xhuis
-delete-after: True
-
-changes:
- - tweak: Handheld crew monitors can now be stored in medical belts.
\ No newline at end of file
diff --git a/html/changelogs/drovidi-PR-7440.yml b/html/changelogs/drovidi-PR-7440.yml
new file mode 100644
index 00000000000..116b7dcf634
--- /dev/null
+++ b/html/changelogs/drovidi-PR-7440.yml
@@ -0,0 +1,8 @@
+author: drovidi
+
+delete-after: True
+
+changes:
+ - tweak: "Blobs who burst in space will be given a 30 second warning before dying."
+ - tweak: "If a blob does die from bursting in space, a new crewmember will be infected."
+ - bugfix: "If there are no blobs or infected crew left after bursting, the round will now end properly, rather than becoming endless."
\ No newline at end of file
diff --git a/icons/effects/drip.dmi b/icons/effects/drip.dmi
index c78843e5863..a36887103d1 100644
Binary files a/icons/effects/drip.dmi and b/icons/effects/drip.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index da1c71022d3..858fb2ba7c9 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 21f990563b5..90d2cf71b71 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index 9301b3f5096..85a2fb942d9 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 0afac4e41d3..7fd1a67af5e 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/bloodpack.dmi b/icons/obj/bloodpack.dmi
new file mode 100644
index 00000000000..afd95f6dba5
Binary files /dev/null and b/icons/obj/bloodpack.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 725367cf135..eee89a7e0d6 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index dbe71ba145c..34a13b74666 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index 12791090e09..030c6b6fb04 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index c149fb50bc0..50c51284344 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 166062cd3be..dbb4e8b1265 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi
new file mode 100644
index 00000000000..016513245e1
Binary files /dev/null and b/icons/obj/iv_drip.dmi differ
diff --git a/sound/vox_fem/voxtest2.ogg b/sound/vox_fem/voxtest2.ogg
deleted file mode 100644
index da1f57bc93a..00000000000
Binary files a/sound/vox_fem/voxtest2.ogg and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index fadad95ebc8..428476630ae 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -189,6 +189,7 @@
#include "code\datums\diseases\advance\symptoms\deafness.dm"
#include "code\datums\diseases\advance\symptoms\dizzy.dm"
#include "code\datums\diseases\advance\symptoms\fever.dm"
+#include "code\datums\diseases\advance\symptoms\fire.dm"
#include "code\datums\diseases\advance\symptoms\flesh_eating.dm"
#include "code\datums\diseases\advance\symptoms\genetics.dm"
#include "code\datums\diseases\advance\symptoms\hallucigen.dm"
@@ -198,11 +199,11 @@
#include "code\datums\diseases\advance\symptoms\oxygen.dm"
#include "code\datums\diseases\advance\symptoms\shedding.dm"
#include "code\datums\diseases\advance\symptoms\shivering.dm"
+#include "code\datums\diseases\advance\symptoms\skin.dm"
#include "code\datums\diseases\advance\symptoms\sneeze.dm"
#include "code\datums\diseases\advance\symptoms\stimulant.dm"
#include "code\datums\diseases\advance\symptoms\symptoms.dm"
-#include "code\datums\diseases\advance\symptoms\visionloss.dm"
-#include "code\datums\diseases\advance\symptoms\vitiligo.dm"
+#include "code\datums\diseases\advance\symptoms\vision.dm"
#include "code\datums\diseases\advance\symptoms\voice_change.dm"
#include "code\datums\diseases\advance\symptoms\vomit.dm"
#include "code\datums\diseases\advance\symptoms\weight.dm"
@@ -372,6 +373,7 @@
#include "code\game\machinery\Freezer.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\igniter.dm"
+#include "code\game\machinery\iv_drip.dm"
#include "code\game\machinery\lightswitch.dm"
#include "code\game\machinery\machinery.dm"
#include "code\game\machinery\magnet.dm"
@@ -708,6 +710,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm"
+#include "code\game\objects\structures\crates_lockers\closets\secure\misc.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm"
#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm"
@@ -1077,6 +1080,7 @@
#include "code\modules\mob\living\carbon\brain\life.dm"
#include "code\modules\mob\living\carbon\brain\MMI.dm"
#include "code\modules\mob\living\carbon\brain\say.dm"
+#include "code\modules\mob\living\carbon\human\blood.dm"
#include "code\modules\mob\living\carbon\human\death.dm"
#include "code\modules\mob\living\carbon\human\emote.dm"
#include "code\modules\mob\living\carbon\human\examine.dm"
@@ -1300,6 +1304,7 @@
#include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm"
#include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Alcohols.dm"
#include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Drinks.dm"
+#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
#include "code\modules\reagents\reagent_containers\bottle.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
|