diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index f6c80848683..c621606d621 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -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) @@ -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) @@ -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) @@ -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,6 +6306,7 @@ "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) "crs" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/aisat_interior) "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) @@ -6618,14 +6620,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibwibwkbwkbwkbwkbwibwibAXbAYbAZbBabuQbuQbuQbuQbuQbuQbBbbBcaIcaIcaIcaIcbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbBebBfbBgbBhbBhbBhbBhbBhbBibBhbBhbBjbBhbyebBkbyeaIdaJlbBlbtXbBmbBnbBobBpbBqbtXbBrbxQbBsbBtbBubBvbBwbBxbBybBzbBAbBBbBCbBDbBDbBEbBFbBGbBHbBIbBJbBKbBLbAwbzibgibBMbBMbBMbBMbBMbBMbBMbBMbBMbBNbBNbBNbBNbBNbBNbBObBPbBQbuybuybuybuybuybuybuybxhbrVbrVbrVbrVbrVbrVbrVbrVbtnbgxbBRbBSbjobjoaafaafaafaagaagaagaagaagaagaagaagaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBTaaaaaaaaaaafaaaaaabwlbBUbBVbBWbBXbBYbBZbCabCbbCcbCdbCebCfaaaaaaaafaaabBdbCgbChbCibCjbCkbClbCmbCnbCobCpbCqbCrbBhbCsbCtbCubCvbCwbCvbCvbCxbCybCzbCAbyebyebyebyebtXbCBbCCbCDbCCbCEbtXbCFbvpbCGbCHbCIbCJbCIbCIbCKbCLbCMbCNbCObCObCObCPbCQbvlbCRbCSbCTbCUbCVbAwbzibgibBMbCWbCWbCWbCXbCWbCWbCWbBMbCYbCYbCZbCYbCYbBNbDabDbbqibDcbDdbDebDfbDgbDhbJqbDjbDkbDlbDmbDnbDobDpbDqbDqbDrbDsbDdbDdbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaekaeZaekaelaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobEHbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbOnbtXbFAbCCbCCbCCbOCbFCbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbGabGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGNbtXbGObGPbGQbtXbGRbGSbGUbGTbGVbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbIkbmSbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbIHbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZbEPbEQbEPajZbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbGabGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZalQaHnalQaeZbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbGTbGVbGUbIkbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbBKbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalQalQalQbHJbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbIHbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZaHnaHnaHnaeZbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobEHbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMbJUbJVbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZamIbJWbJXajZbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebtnbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekbLiaekafOaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBbLCbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWbLXbLYbLZbMabMbbMcbDnbMdbtnbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMbMNbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebtnbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUbMUbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebtnbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebtnbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafbBcbBcbJYbJYbJYbBcbBcaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbNnbMmbMmbMmbMmbMobYnbNpbNqbNrbKjbNsbNtbNubNvbNwbNxbNybNzbNAbNwbNwbNwbNybNBbNCbNDbNEbNFbLBbNGbNHbNIbNJbNKbLDbNLbNMbNNbNObMKbMLbNPbKvbLFbNQbMUbMUcrqbLGbNRbNSbNTbLGbMVbNUbMVbNVbNWbNXbNYbBMbNZbOabObbOcbOdbOebOfbOgbOhbOibOjbOkbOlbItbOmbZlbOobOpbOpbDnbDnbDnbDnbDnbDnbDdbDdbDdbDnbsebtnbOqbsebsebOrbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBcbOsbGnbOtbGnbOubBcaaaaaaaaaaaabJYbJZbEZaaaaafbJYbJYbMkbMmbMmbOwbOvbMmbOxbMobMobOzbDLbMqbOAbOBbZmbODbOEbOFbOGbOHbOIbOFbOJbOFbOKbOLbOMbLubONbOObOPbOQbORbOSbOTbOUaafbOVbOWbNObOXbMKbMLbNPbKvbLFbOYbOZbMUbPabLGbPbbPcbPdbLGbMUbPebPfbMUbMUbLFbKvbBMbItbItbItbItbJHbPgbPhbPibJHbItbItbItbItbItbPjbPkbPlbPmbPnbPobPpbPqbPpbPrbOpbPsbPtbPubPvbPwbtnbkFbjobjobjobjoabtaafaafaafaagaagaagaagaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbPxbGnbGnbGnbPybBcaaaaaaaaaaaabJYbEYbEZaaaaafbJYbPzbPAbPBbMmbMmcbdbPDbPDbPDbPEbPFcbebMqbOAbPHccdbPJbPKbMFbPLbPMbPNbPObPPbPQbPRbPSbPSbPTbPUbLBbPVbPWbPXbPYbPZbQabQbbNLbQcbNObNObMKbMLbNPbKvbLFbQdbMUbQebLHbLGbLGbQfbLGbLGbQgbQhbQibQgbQgbLFbKvbBMbQjbQkbQkbQlbQmbKKbQnbQobQpbQqbCWbCWbCWbItbQrbQsbQtbQubQvbPobQwbQxbQybQzbOmbPtbQAbPtbPvbBRbQBbQCbjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaaaaaaaaaaaaaaaaaaaaabBcbPxbGnbGnbQDbQEbBcaaaaafaaaaaabJYbEYbDCbBcbBcbBcbQFbMkbQGbMmbMmcqmbQHbQIbQJbQKbMkcqnbMqbOAbPHcqobQLbQMbMFbMFbQNbLnbQObQPbQQbQRbMFbMFbLubQSbQTbQUbQVbQWbQXbQWbQYaafbMKbMKbMKbMKbMKbMLbyebKvbLFbQZbRabRabRbbRcbRdbRebRfbRgbMUbPebMUbMUcqpbLFbKvbBMbCWbCWbCWbRhbRibKKbRjbKKbRkbRlbCWbCWbCWbItbRmbRnbRobRpbRqbRrbRsbRtbRrbRubOpbRvbPtbRwbPvbjobRxbRybjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a1a7eb45636..846e90a51bf 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -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 ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// 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/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/iv_drip.dm b/code/game/machinery/iv_drip.dm new file mode 100644 index 00000000000..d14c2de4bf0 --- /dev/null +++ b/code/game/machinery/iv_drip.dm @@ -0,0 +1,164 @@ +/obj/machinery/iv_drip + name = "\improper IV drip" + icon = 'icons/obj/iv_drip.dmi' + anchored = 0 + density = 1 + + +/obj/machinery/iv_drip/var/mob/living/carbon/human/attached = null +/obj/machinery/iv_drip/var/mode = 1 // 1 is injecting, 0 is taking blood. +/obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null + +/obj/machinery/iv_drip/update_icon() + if(src.attached) + icon_state = "hooked" + else + icon_state = "" + + overlays = null + + if(beaker) + var/datum/reagents/reagents = beaker.reagents + if(reagents.total_volume) + var/image/filling = image('icons/obj/iv_drip.dmi', src, "reagent") + + var/percent = round((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(reagents.reagent_list) + overlays += filling + +/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location) + ..() + + 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) + visible_message("[usr] attaches \the [src] to \the [over_object].") + src.attached = over_object + src.update_icon() + + +/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? 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 as mob) + if(src.beaker) + src.beaker.loc = get_turf(src) + src.beaker = null + update_icon() + else + toggle_mode() + + +/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"]." + +/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.Attached is an empty [beaker].No chemicals are attached.[attached ? attached : "No one"] is attached.[] | [] | [] | []", 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/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index e4e6391a97d..38b22179c38 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -16,117 +16,113 @@ 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/stack/medical/gauze(src) + new /obj/item/stack/medical/gauze(src) new /obj/item/weapon/reagent_containers/hypospray/medipen(src) - new /obj/item/stack/medical/bruise_pack(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 +142,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 +157,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 +169,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 +184,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 +198,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 +240,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 +254,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/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/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/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/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 7a8e7f4d01e..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." 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..37b4be1fef5 --- /dev/null +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -0,0 +1,313 @@ +/**************************************************** + 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.8 + 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 ot 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(NOBLOOD in dna.species.specflags) + reagents.add_reagent("blood", amount, injected.data) + reagents.update_total() + return + + if(!injected) + return + + 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 ot 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) + + 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/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8d0aeed8e5c..79bda25cad5 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) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 827bb88843b..5463c2e2084 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]" 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/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/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-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/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm new file mode 100644 index 00000000000..2196a552aa4 --- /dev/null +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -0,0 +1,51 @@ +/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/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index d231d8b4f35..7c92956dc4b 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 @@ -191,7 +158,13 @@ reagents.reaction(target, INGEST) spawn(5) target.add_fingerprint(user) - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/datum/reagent/blood/B = locate() in src.reagents.reagent_list + var/trans + if(B && istype(target,/mob/living/carbon)) + var/mob/living/carbon/C = target + C.inject_blood(src,5) + else + 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) mode = SYRINGE_DRAW 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/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/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/items.dmi b/icons/obj/items.dmi index 166062cd3be..25760c88d18 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..daa6d5e9e0f Binary files /dev/null and b/icons/obj/iv_drip.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 4dd52023b0d..48711156617 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -372,6 +372,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" @@ -1078,6 +1079,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" @@ -1301,6 +1303,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"