diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index cff72ec803..b12c50f9da 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -223,6 +223,16 @@ /obj/structure/sign/poster/official/medical_green_cross{ pixel_x = 32 }, +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/item/kirbyplants{ + icon_state = "plant-11" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "aay" = ( @@ -25095,15 +25105,19 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "biR" = ( -/obj/machinery/light, -/obj/machinery/camera{ - c_tag = "Central Primary Hallway Genetics"; - dir = 1 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "biS" = ( @@ -25125,16 +25139,19 @@ /area/hallway/primary/central) "biW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock/maintenance{ - name = "Port Emergency Storage" +/obj/machinery/door/airlock/medical{ + name = "Paramedic's Office"; + req_access_txt = "5;6;12;64" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/effect/turf_decal/trimline/blue/filled, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "biX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/commons/storage/emergency/port) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/paramedic) "biY" = ( /turf/closed/wall, /area/medical/morgue) @@ -25202,19 +25219,24 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bjj" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light, +/obj/machinery/camera{ + c_tag = "Central Primary Hallway Genetics"; + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bjk" = ( @@ -25352,17 +25374,44 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/main/monastery) "bjP" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/structure/table/glass, +/obj/item/flashlight/lamp{ + pixel_x = -2; + pixel_y = 11 + }, +/obj/effect/spawner/lootdrop/cig_packs{ + pixel_x = 9; + pixel_y = 7 + }, +/obj/item/folder/white, +/obj/item/pen/blue{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "bjQ" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bjR" = ( -/obj/structure/plasticflaps/opaque, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/structure/closet/secure_closet/paramedic, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Paramedic Disbatch"; + dir = 8; + network = list("ss13","medbay") + }, +/obj/structure/sign/poster/official/help_others{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "bjS" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -25756,53 +25805,90 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -28 }, -/turf/open/floor/plasteel/freezer, -/area/commons/storage/emergency/port) -"bkY" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/storage/emergency/port) -"bkZ" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Genetics Cloning Foyer"; - network = list("ss13","medbay") +/obj/machinery/space_heater, +/obj/machinery/airalarm{ + pixel_y = 22 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/commons/storage/emergency/port) +"bkY" = ( /obj/machinery/power/apc{ dir = 1; name = "Port Emergency Storage APC"; pixel_y = 23 }, /obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 + icon_state = "0-2" }, -/turf/open/floor/plasteel/freezer, +/obj/machinery/camera{ + c_tag = "Genetics Cloning Foyer"; + network = list("ss13","medbay") + }, +/turf/open/floor/plating, +/area/commons/storage/emergency/port) +"bkZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "bla" = ( -/obj/machinery/airalarm{ - pixel_y = 22 +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plasteel/freezer, +/obj/item/cigbutt{ + pixel_x = 6; + pixel_y = -6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = -8; + pixel_y = -8 + }, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "blb" = ( -/turf/open/floor/plating, -/area/commons/storage/emergency/port) -"blc" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/machinery/power/apc{ + areastring = "/area/medical/paramedic"; + dir = 1; + name = "Paramedic Station APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) +"blc" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "bld" = ( /obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel/dark, @@ -26382,18 +26468,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "bmi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, /obj/structure/cable{ icon_state = "1-4" }, @@ -26403,44 +26481,47 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "bmj" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/structure/cable{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "bmk" = ( /obj/structure/table, /obj/item/crowbar, /obj/item/storage/toolbox/emergency, -/turf/open/floor/plasteel/freezer, +/turf/open/floor/plating, /area/commons/storage/emergency/port) "bml" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/vending/wallmed{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "bmn" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "bmp" = ( /obj/structure/bodycontainer/morgue, /obj/machinery/light/small{ @@ -26857,56 +26938,31 @@ /area/medical/genetics) "bnw" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Cloning"; - req_one_access_txt = "5;9" - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plasteel/freezer, -/area/commons/storage/emergency/port) -"bnx" = ( -/obj/structure/sign/poster/official/random{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/structure/table, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/mask/surgical, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone3) +/turf/open/floor/plating, +/area/commons/storage/emergency/port) +"bnx" = ( +/turf/closed/wall, +/area/medical/paramedic) "bny" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ dir = 8; pixel_x = 28 }, -/obj/item/kirbyplants{ - icon_state = "plant-11" - }, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone3) +/turf/closed/wall, +/area/medical/paramedic) "bnz" = ( /obj/structure/table, /obj/item/folder/white, @@ -27325,16 +27381,22 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "boA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/chair{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/table, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/mask/surgical, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "boC" = ( @@ -27858,6 +27920,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bpE" = ( @@ -36935,6 +37000,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/table/glass, +/obj/item/soap/nanotrasen, +/obj/item/clothing/neck/stethoscope, +/obj/item/gun/syringe/dart, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIj" = ( @@ -38455,7 +38524,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/vehicle/ridden/wheelchair/motorized{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/plasteel/white, @@ -38889,9 +38958,6 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "bMK" = ( -/obj/item/soap/nanotrasen, -/obj/item/clothing/neck/stethoscope, -/obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -38899,17 +38965,22 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/item/gun/syringe/dart, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bMM" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/door/window/southleft{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "Medbay Delivery"; + req_access_txt = "28" }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + dir = 4; + freq = 1400; + location = "Medbay" }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -51260,12 +51331,9 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "cBL" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_one_access_txt = "12;45;5;9" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/maintenance/department/engine) +/area/medical/paramedic) "cBM" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -51407,6 +51475,18 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"cFG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone3) "cFH" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -52723,6 +52803,20 @@ /obj/item/stack/cable_coil/cut/random, /turf/open/floor/plating, /area/maintenance/department/cargo) +"fbX" = ( +/obj/structure/chair/stool, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 14 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "fdM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54844,11 +54938,16 @@ /turf/open/floor/plasteel, /area/engineering/main) "iGJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Paramedic's Office"; + req_access_txt = "5;6;12;64" }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone3) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/blue/filled, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "iJi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -54895,6 +54994,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) +"iPu" = ( +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plating, +/area/medical/medbay/central) "iPz" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -55573,6 +55676,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/chemistry) +"jZZ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/vehicle/ridden/wheelchair/motorized{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "kas" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -56141,7 +56257,11 @@ /area/engineering/main) "kSO" = ( /obj/machinery/door/airlock/maintenance{ - name = "Port Emergency Storage" + name = "Port Emergency Storage"; + req_access_txt = "5;6;12;64" + }, +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plating, /area/commons/storage/emergency/port) @@ -60073,19 +60193,18 @@ /turf/open/floor/plating, /area/maintenance/department/science) "rvH" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - dir = 4; - freq = 1400; - location = "Medbay" +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock{ + name = "Port Emergency Storage" }, -/obj/machinery/door/window/southleft{ - dir = 4; - name = "Medbay Delivery"; - req_access_txt = "28" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/service/bar) +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/commons/storage/emergency/port) "rxa" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -62094,6 +62213,21 @@ /obj/structure/chair, /turf/open/floor/carpet, /area/service/lawoffice) +"vik" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/l3closet, +/obj/structure/window/reinforced{ + dir = 4; + layer = 2.9 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "vil" = ( /obj/machinery/mass_driver{ id = "chapelgun" @@ -62287,6 +62421,14 @@ /obj/item/clothing/mask/gas, /turf/open/floor/plating, /area/maintenance/department/science) +"vwY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/suit_storage_unit/paramedic, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "vxp" = ( /obj/machinery/door/window/eastright{ base_state = "left"; @@ -62822,12 +62964,14 @@ /turf/open/floor/wood, /area/service/lawoffice) "wtE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "wun" = ( /obj/structure/cable{ icon_state = "1-2" @@ -63183,8 +63327,11 @@ /area/maintenance/department/science) "wUf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/commons/storage/emergency/port) +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "wUz" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -63243,6 +63390,13 @@ /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, /area/engineering/supermatter) +"wZT" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_one_access_txt = "12;45;5;9" + }, +/turf/open/floor/plating, +/area/maintenance/department/engine) "xah" = ( /obj/structure/cable{ icon_state = "1-2" @@ -63793,18 +63947,14 @@ /turf/open/floor/engine, /area/science/explab) "xQc" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/airlock{ - name = "Port Emergency Storage" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plasteel/freezer, -/area/commons/storage/emergency/port) +/turf/open/floor/plasteel/dark, +/area/medical/paramedic) "xQk" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -88215,7 +88365,7 @@ bha bhL aHN bjj -xQc +bjL bkY bmi bjN @@ -88472,7 +88622,7 @@ bhb aDZ aHN biR -bjL +rvH bkZ bmj bnw @@ -88986,10 +89136,10 @@ aJI aDZ aHN biT -bjL +bnx kSO -bjL -bjL +bnx +bnx boz bpB bqZ @@ -89242,11 +89392,11 @@ bgi aJI aDZ aHN -bjL -bjL +bnx +bnx blb bml -bjL +bnx bnv bpC bra @@ -89499,10 +89649,10 @@ aaw aJI aDZ aHN -bjL +cBL bjP -blb -bjL +wtE +fbX bnx boA bpD @@ -89758,10 +89908,10 @@ aDZ bih biW wUf -wUf +xQc bmn iGJ -bjQ +cFG bpE brc bsy @@ -90016,7 +90166,7 @@ bii biX bjR blc -biX +vwY bny aax bpF @@ -90271,7 +90421,7 @@ aJI aDZ bij biY -rvH +biY biY biY biY @@ -91573,7 +91723,7 @@ bBc bCm bDr bEz -wtE +bnF buh bIg bjc @@ -92094,7 +92244,7 @@ bJo bGZ bLJ bMK -bjc +wZT bCz bPB bQp @@ -92350,8 +92500,8 @@ bIh bkh bKz bnH -boN -cBL +vik +bjc bCz bPB bQq @@ -92603,12 +92753,12 @@ bpP bEC bFT bIi -bIi +jZZ bJp bKA bLK bMM -bjc +iPu bCz bPB bPB @@ -92864,7 +93014,7 @@ bIj bJq bIj bFU -bFU +bjc bjc bCz bPC diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm index a01dcacc18..fd93beda84 100644 --- a/code/__DEFINES/dye_keys.dm +++ b/code/__DEFINES/dye_keys.dm @@ -4,6 +4,7 @@ #define DYE_REGISTRY_SNEAKERS "sneakers" #define DYE_REGISTRY_FANNYPACK "fannypack" #define DYE_REGISTRY_BEDSHEET "bedsheet" +#define DYE_REGISTRY_DOUBLE_BEDSHEET "double_bedsheet" #define DYE_LAWYER_SPECIAL "lawyer_special" #define DYE_RED "red" diff --git a/code/__DEFINES/mapexporting.dm b/code/__DEFINES/mapexporting.dm new file mode 100644 index 0000000000..cc0e2c0282 --- /dev/null +++ b/code/__DEFINES/mapexporting.dm @@ -0,0 +1,14 @@ +//Bits to save +#define SAVE_OBJECTS (1 << 1) //Save objects? +#define SAVE_MOBS (1 << 2) //Save Mobs? +#define SAVE_TURFS (1 << 3) //Save turfs? +#define SAVE_AREAS (1 << 4) //Save areas? +#define SAVE_SPACE (1 << 5) //Save space areas? (If not they will be saved as NOOP) +#define SAVE_OBJECT_PROPERTIES (1 << 6) //Save custom properties of objects (obj.on_object_saved() output) + +#define SAVE_ALL SAVE_OBJECTS | SAVE_MOBS | SAVE_TURFS | SAVE_AREAS | SAVE_SPACE | SAVE_OBJECT_PROPERTIES + +//Ignore turf if it contains +#define SAVE_SHUTTLEAREA_DONTCARE 0 +#define SAVE_SHUTTLEAREA_IGNORE 1 +#define SAVE_SHUTTLEAREA_ONLY 2 diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 97d6748dc7..01a8f41c89 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -732,3 +732,15 @@ */ /datum/component/storage/proc/get_max_volume() return max_volume || AUTO_SCALE_STORAGE_VOLUME(max_w_class, max_combined_w_class) + +/obj/item/storage/on_object_saved(depth) + if(depth >= 10) + return "" + var/dat = "" + for(var/obj/item in contents) + var/metadata = generate_tgm_metadata(item) + dat += "[dat ? ",\n" : ""][item.type][metadata]" + //Save the contents of things inside the things inside us, EG saving the contents of bags inside lockers + var/custom_data = item.on_object_saved(depth++) + dat += "[custom_data ? ",\n[custom_data]" : ""]" + return dat diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 3441ac7eaa..8c2d3631e3 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -103,6 +103,31 @@ GLOBAL_LIST_INIT(dye_registry, list( DYE_RD = /obj/item/bedsheet/rd, DYE_CMO = /obj/item/bedsheet/cmo, DYE_COSMIC = /obj/item/bedsheet/cosmos + ), + DYE_REGISTRY_DOUBLE_BEDSHEET = list( + DYE_RED = /obj/item/bedsheet/red/double, + DYE_ORANGE = /obj/item/bedsheet/orange/double, + DYE_YELLOW = /obj/item/bedsheet/yellow/double, + DYE_GREEN = /obj/item/bedsheet/green/double, + DYE_BLUE = /obj/item/bedsheet/blue/double, + DYE_PURPLE = /obj/item/bedsheet/purple/double, + DYE_BLACK = /obj/item/bedsheet/black/double, + DYE_WHITE = /obj/item/bedsheet/double, + DYE_RAINBOW = /obj/item/bedsheet/rainbow/double, + DYE_MIME = /obj/item/bedsheet/mime/double, + DYE_CLOWN = /obj/item/bedsheet/clown/double, + DYE_CHAP = /obj/item/bedsheet/chaplain/double, + DYE_QM = /obj/item/bedsheet/qm/double, + DYE_LAW = /obj/item/bedsheet/black/double, + DYE_CAPTAIN = /obj/item/bedsheet/captain/double, + DYE_HOP = /obj/item/bedsheet/hop/double, + DYE_HOS = /obj/item/bedsheet/hos/double, + DYE_CE = /obj/item/bedsheet/ce/double, + DYE_RD = /obj/item/bedsheet/rd/double, + DYE_CMO = /obj/item/bedsheet/cmo/double, + DYE_COSMIC = /obj/item/bedsheet/cosmos/double, + DYE_SYNDICATE = /obj/item/bedsheet/syndie/double, + DYE_CENTCOM = /obj/item/bedsheet/centcom/double ) )) diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index b67b7ae587..2032758624 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -59,9 +59,6 @@ I.play_tool_sound(src, 25) else to_chat(user, "You need to add at least one beaker before locking the [initial(name)] assembly!") - else if(stage == READY && !nadeassembly) - det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50 - to_chat(user, "You modify the time delay. It's set for [DisplayTimeText(det_time)].") else if(stage == EMPTY) to_chat(user, "You need to add an activation mechanism!") diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index 7a6157bf65..fb98e86ae1 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -135,16 +135,16 @@ /obj/item/grenade/tool_act(mob/living/user, obj/item/I, tool_behaviour) if(tool_behaviour == TOOL_SCREWDRIVER) switch(det_time) - if ("1") - det_time = 10 + if(1) + det_time = 1 SECONDS to_chat(user, "You set the [name] for 1 second detonation time.") - if ("10") - det_time = 30 + if(1 SECONDS) + det_time = 3 SECONDS to_chat(user, "You set the [name] for 3 second detonation time.") - if ("30") - det_time = 50 + if(3 SECONDS) + det_time = 5 SECONDS to_chat(user, "You set the [name] for 5 second detonation time.") - if ("50") + if(5 SECONDS) det_time = 1 to_chat(user, "You set the [name] for instant detonation.") add_fingerprint(user) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 4b701e00c7..3165bd48ff 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -24,6 +24,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_floor = TRUE), \ //CIT CHANGE - adds sofas to metal recipe list new/datum/stack_recipe_list("sofas", list( \ new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = TRUE, on_floor = TRUE), \ @@ -398,6 +399,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \ new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ + new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6), \ new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \ new/datum/stack_recipe("padded floor tile", /obj/item/stack/tile/padded, 1, 4, 20), \ null, \ diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 58c571d9e6..e263678943 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -383,3 +383,34 @@ /obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) return + + +//For returning special data when the object is saved +//For example, or silos will return a list of their materials which will be dumped on top of them +//Can be customised if you have something that contains something you want saved +//If you put an incorrect format it will break outputting, so don't use this if you don't know what you are doing +//NOTE: Contents is automatically saved, so if you store your things in the contents var, don't worry about this +//====Output Format Examples====: +//===Single Object=== +// "/obj/item/folder/blue" +//===Multiple Objects=== +// "/obj/item/folder/blue,\n +// /obj/item/folder/red" +//===Single Object with metadata=== +// "/obj/item/folder/blue{\n +// \tdir = 8;\n +// \tname = "special folder"\n +// \t}" +//===Multiple Objects with metadata=== +// "/obj/item/folder/blue{\n +// \tdir = 8;\n +// \tname = "special folder"\n +// \t},\n +// /obj/item/folder/red" +//====How to save easily====: +// return "[thing.type][generate_tgm_metadata(thing)]" +//Where thing is the additional thing you want to same (For example ores inside an ORM) +//Just add ,\n between each thing +//generate_tgm_metadata(thing) handles everything inside the {} for you +/obj/proc/on_object_saved(depth) + return "" diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index c86c62094b..8f5e1c5079 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -53,6 +53,12 @@ else return ..() +/obj/structure/bed/post_buckle_mob(mob/living/target) + target.pixel_y = target.get_standard_pixel_y_offset(TRUE) + +/obj/structure/bed/double/post_unbuckle_mob(mob/living/target) + target.pixel_y = target.get_standard_pixel_y_offset(FALSE) + /* * Roller beds */ @@ -214,3 +220,24 @@ name = "resting contraption" desc = "This looks similar to contraptions from Earth. Could aliens be stealing our technology?" icon_state = "abed" + +//Double Beds, for luxurious sleeping, i.e. the captain and maybe heads- Do use this for ERP +/obj/structure/bed/double + name = "double bed" + desc = "A luxurious double bed, for those too important for small dreams." + icon_state = "bed_double" + buildstackamount = 4 + max_buckled_mobs = 2 + ///The mob who buckled to this bed second, to avoid other mobs getting pixel-shifted before he unbuckles. + var/mob/living/goldilocks + +/obj/structure/bed/double/post_buckle_mob(mob/living/target) + target.pixel_y = target.get_standard_pixel_y_offset(TRUE) + if(buckled_mobs.len > 1 && !goldilocks) //Push the second buckled mob a bit higher from the normal lying position + target.pixel_y = target.get_standard_pixel_y_offset(FALSE) + 6 + goldilocks = target + +/obj/structure/bed/double/post_unbuckle_mob(mob/living/target) + target.pixel_y = target.get_standard_pixel_y_offset(FALSE) + if(target == goldilocks) + goldilocks = null diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 2172040022..8cd58d7942 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -4,6 +4,41 @@ BEDSHEETS LINEN BINS */ +#define BEDSHEET_SINGLE "single" +#define BEDSHEET_DOUBLE "double" + +GLOBAL_LIST_INIT(double_bedsheets, list(/obj/item/bedsheet/double, + /obj/item/bedsheet/blue/double, + /obj/item/bedsheet/green/double, + /obj/item/bedsheet/grey/double, + /obj/item/bedsheet/orange/double, + /obj/item/bedsheet/purple/double, + /obj/item/bedsheet/patriot/double, + /obj/item/bedsheet/rainbow/double, + /obj/item/bedsheet/red/double, + /obj/item/bedsheet/yellow/double, + /obj/item/bedsheet/mime/double, + /obj/item/bedsheet/clown/double, + /obj/item/bedsheet/captain/double, + /obj/item/bedsheet/rd/double, + /obj/item/bedsheet/medical/double, + /obj/item/bedsheet/cmo/double, + /obj/item/bedsheet/hos/double, + /obj/item/bedsheet/hop/double, + /obj/item/bedsheet/ce/double, + /obj/item/bedsheet/qm/double, + /obj/item/bedsheet/chaplain/double, + /obj/item/bedsheet/brown/double, + /obj/item/bedsheet/black/double, + /obj/item/bedsheet/centcom/double, + /obj/item/bedsheet/syndie/double, + /obj/item/bedsheet/cult/double, + /obj/item/bedsheet/wiz/double, + /obj/item/bedsheet/nanotrasen/double, + /obj/item/bedsheet/ian/double, + /obj/item/bedsheet/cosmos/double + )) + /obj/item/bedsheet name = "bedsheet" desc = "A surprisingly soft linen bedsheet." @@ -21,10 +56,15 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost var/list/dream_messages = list("white") + var/stack_amount = 3 + var/bedsheet_type = BEDSHEET_SINGLE /obj/item/bedsheet/Initialize(mapload) . = ..() AddElement(/datum/element/bed_tuckable, 0, 0, 0) + if(bedsheet_type == BEDSHEET_DOUBLE) + stack_amount *= 2 + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET /obj/item/bedsheet/attack(mob/living/M, mob/user) if(!attempt_initiate_surgery(src, M, user)) @@ -46,7 +86,7 @@ LINEN BINS /obj/item/bedsheet/attackby(obj/item/I, mob/user, params) if(!(flags_1 & HOLOGRAM_1) && (I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())) - var/obj/item/stack/sheet/cloth/C = new (get_turf(src), 3) + var/obj/item/stack/sheet/cloth/C = new (get_turf(src), stack_amount) transfer_fingerprints_to(C) C.add_fingerprint(user) qdel(src) @@ -247,9 +287,171 @@ LINEN BINS /obj/item/bedsheet/random/Initialize() ..() - var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable))) - new type(loc) - return INITIALIZE_HINT_QDEL + if(bedsheet_type == BEDSHEET_SINGLE) + var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable) + GLOB.double_bedsheets)) + new type(loc) + return INITIALIZE_HINT_QDEL + +/obj/item/bedsheet/double + icon_state = "double_sheetwhite" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/blue/double + icon_state = "double_sheetblue" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/green/double + icon_state = "double_sheetgreen" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/grey/double + icon_state = "double_sheetgrey" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/orange/double + icon_state = "double_sheetorange" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/purple/double + icon_state = "double_sheetpurple" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/patriot/double + icon_state = "double_sheetUSA" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/rainbow/double + icon_state = "double_sheetrainbow" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/red/double + icon_state = "double_sheetred" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/yellow/double + icon_state = "double_sheetyellow" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/mime/double + icon_state = "double_sheetmime" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/clown/double + icon_state = "double_sheetclown" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/captain/double + icon_state = "double_sheetcaptain" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/rd/double + icon_state = "double_sheetrd" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/medical/double + icon_state = "double_sheetmedical" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/cmo/double + icon_state = "double_sheetcmo" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/hos/double + icon_state = "double_sheethos" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/hop/double + icon_state = "double_sheethop" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/ce/double + icon_state = "double_sheetce" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/qm/double + icon_state = "double_sheetqm" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/chaplain/double + icon_state = "double_sheetchap" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/brown/double + icon_state = "double_sheetbrown" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/black/double + icon_state = "double_sheetblack" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/centcom/double + icon_state = "double_sheetcentcom" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/syndie/double + icon_state = "double_sheetsyndie" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/cult/double + icon_state = "double_sheetcult" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/wiz/double + icon_state = "double_sheetwiz" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/nanotrasen/double + icon_state = "double_sheetNT" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/ian/double + icon_state = "double_sheetian" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/cosmos/double + icon_state = "double_sheetcosmos" + dying_key = DYE_REGISTRY_DOUBLE_BEDSHEET + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/random/double + icon_state = "random_bedsheet" + bedsheet_type = BEDSHEET_DOUBLE + +/obj/item/bedsheet/random/double/Initialize() + ..() + if(bedsheet_type == BEDSHEET_DOUBLE) + var/type = pick(GLOB.double_bedsheets) + new type(loc) + return INITIALIZE_HINT_QDEL /obj/item/bedsheet/chameleon //donator chameleon bedsheet name = "chameleon bedsheet" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 7f98284ea4..f01342a903 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -672,3 +672,15 @@ if(allowed(user)) return TRUE to_chat(user, "Access denied.") + +/obj/structure/closet/on_object_saved(depth) + if(depth >= 10) + return "" + var/dat = "" + for(var/obj/item in contents) + var/metadata = generate_tgm_metadata(item) + dat += "[dat ? ",\n" : ""][item.type][metadata]" + //Save the contents of things inside the things inside us, EG saving the contents of bags inside lockers + var/custom_data = item.on_object_saved(depth++) + dat += "[custom_data ? ",\n[custom_data]" : ""]" + return dat diff --git a/code/modules/buildmode/submodes/save_area.dm b/code/modules/buildmode/submodes/save_area.dm new file mode 100644 index 0000000000..6cd235f161 --- /dev/null +++ b/code/modules/buildmode/submodes/save_area.dm @@ -0,0 +1,65 @@ +GLOBAL_VAR_INIT(save_area_executing, FALSE) + +/datum/mapGenerator/save_area + buildmode_name = "Save Area" + modules = list(/datum/mapGeneratorModule/save_area) + var/min_x = 0 + var/min_y = 0 + var/max_x = 0 + var/max_y = 0 + +/datum/mapGenerator/save_area/defineRegion(turf/Start, turf/End, replace = 0) + min_x = min(Start.x,End.x) + min_y = min(Start.y,End.y) + max_x = max(Start.x,End.x) + max_y = max(Start.y,End.y) + ..() + +/datum/mapGeneratorModule/save_area + var/areaName = "default.dm" + +//This could be optimised by making turfs that are the same go in the same, but this is a quick bodge solution so yea, fun job for coder here :) +/datum/mapGeneratorModule/save_area/generate() + var/datum/mapGenerator/save_area/L = mother + if(!istype(L)) + return + //If someone somehow gets build mode, stop them from using this. + if(!check_rights(R_ADMIN)) + message_admins("[ckey(usr)] tried to run the map save generator but was rejected due to insufficient perms.") + to_chat(usr, "You must have R_ADMIN privellages to use this.") + return + //Emergency check + if(L.map.len > 1600) + var/confirm = alert("Uhm, are you sure, the area is quiet large?", "Run generator", "Yes", "No") + if(confirm != "Yes") + return + + if(GLOB.save_area_executing) + to_chat(usr, "Someone is already running the generator! Try again in a bit.") + return + + to_chat(usr, "Saving, please wait...") + GLOB.save_area_executing = TRUE + + //Log just in case something happens + log_game("[key_name(usr)] ran the save level map generator on [L.map.len] turfs.") + message_admins("[key_name(usr)] ran the save level map generator on [L.map.len] turfs.") + + //Step 1: Get the data (This can take a while) + var/dat = "//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE\n" + dat += convert_map_to_tgm(L.map) + + //Step 2: Write the data to a file + var/filedir = file("data/temp.dmm") + if(fexists(filedir)) + fdel(filedir) + WRITE_FILE(filedir, "[dat]") + + //Step 3: Give the file to client for download + usr << ftp(filedir) + + //Step 4: Remove the file from the server (hopefully we can find a way to avoid step) + fdel(filedir) + log_game("[L.map.len] turfs have been saved by [ckey(usr)]") + alert("Area saved successfully.", "Action Successful!", "Ok") + GLOB.save_area_executing = FALSE diff --git a/code/modules/mapexporting/mapexporter.dm b/code/modules/mapexporting/mapexporter.dm new file mode 100644 index 0000000000..d21caa0f6c --- /dev/null +++ b/code/modules/mapexporting/mapexporter.dm @@ -0,0 +1,184 @@ +//Map exporter +//Inputting a list of turfs into convert_map_to_tgm() will output a string +//with the turfs and their objects / areas on said turf into the TGM mapping format +//for .dmm files. This file can then be opened in the map editor or imported +//back into the game. +//============================ +//This has been made semi-modular so you should be able to use these functions +//elsewhere in code if you ever need to get a file in the .dmm format +/atom/proc/get_save_vars() + return + +GLOBAL_LIST_INIT(save_file_chars, list( + "a","b","c","d","e", + "f","g","h","i","j", + "k","l","m","n","o", + "p","q","r","s","t", + "u","v","w","x","y", + "z","A","B","C","D", + "E","F","G","H","I", + "J","K","L","M","N", + "O","P","Q","R","S", + "T","U","V","W","X", + "Y","Z" +)) + +//Converts a list of turfs into TGM file format +/proc/convert_map_to_tgm(list/map,\ + save_flag = SAVE_ALL, \ + shuttle_area_flag = SAVE_SHUTTLEAREA_DONTCARE, \ + list/vars_to_save = list("pixel_x", "pixel_y", "dir", "name", "req_access", "req_access_txt", "piping_layer", "color", "icon_state", "pipe_color", "amount"),\ + list/obj_blacklist = list()) + //Calculate the bounds + var/minx = 1024 + var/miny = 1024 + var/maxx = -1 + var/maxy = -1 + for(var/turf/place in map) + minx = min(place.x, minx) + miny = min(place.y, miny) + maxx = max(place.x, maxx) + maxy = max(place.y, maxy) + var/width = maxx - minx + 1 + var/height = maxy - miny + 1 + + //Sort the map so weird shaped / bad inputted maps can be handled + var/list/sortedmap = sort_map(map, minx, miny, maxx, maxy) + + //Step 0: Calculate the amount of letters we need (26 ^ n > turf count) + var/turfsNeeded = width * height + var/layers = FLOOR(log(GLOB.save_file_chars.len, turfsNeeded) + 0.999,1) + + //Step 1: Run through the area and generate file data + var/list/header_chars = list() //The characters of the header + var/list/header_dat = list() //The data of the header, lines up with chars + var/header = "" //The actual header in text + var/contents = "" //The contents in text (bit at the end) + var/index = 1 + for(var/x in 1 to width) + contents += "\n([x],1,1) = {\"\n" + for(var/y in height to 1 step -1) + //====Get turfs Data==== + var/turf/place = sortedmap[x][y] + var/area/location + var/list/objects + //If there is nothing there, save as a noop (For odd shapes) + if(!place) + place = /turf/template_noop + location = /area/template_noop + objects = list() + //Ignore things in space, must be a space turf and the area has to be empty space + else if(istype(place, /turf/open/space) && istype(get_area(place), /area/space) && !(save_flag & SAVE_SPACE)) + place = /turf/template_noop + location = /area/template_noop + //Stuff to add + else + var/area/location_type = get_area(place) + location = location_type.type + objects = place + place = place.type + //====Saving shuttles only / non shuttles only==== + var/is_shuttle_area = istype(location, /area/shuttle) + if((is_shuttle_area && shuttle_area_flag == SAVE_SHUTTLEAREA_IGNORE) || (!is_shuttle_area && shuttle_area_flag == SAVE_SHUTTLEAREA_ONLY)) + place = /turf/template_noop + location = /area/template_noop + objects = list() + //====For toggling not saving areas and turfs==== + if(!(save_flag & SAVE_AREAS)) + location = /area/template_noop + if(!(save_flag & SAVE_TURFS)) + place = /turf/template_noop + //====Generate Header Character==== + var/header_char = calculate_tgm_header_index(index, layers) //The characters of the header + var/current_header = "(\n" //The actual stuff inside the header + //Add objects to the header file + var/empty = TRUE + //====SAVING OBJECTS==== + if(save_flag & SAVE_OBJECTS) + for(var/obj/thing in objects) + if(thing.type in obj_blacklist) + continue + var/metadata = generate_tgm_metadata(thing, vars_to_save) + current_header += "[empty?"":",\n"][thing.type][metadata]" + empty = FALSE + //====SAVING SPECIAL DATA==== + //This is what causes lockers and machines to save stuff inside of them + if(save_flag & SAVE_OBJECT_PROPERTIES) + var/custom_data = thing.on_object_saved() + current_header += "[custom_data ? ",\n[custom_data]" : ""]" + //====SAVING MOBS==== + if(save_flag & SAVE_MOBS) + for(var/mob/living/thing in objects) + if(istype(thing, /mob/living/carbon)) //Ignore people, but not animals + continue + var/metadata = generate_tgm_metadata(thing, vars_to_save) + current_header += "[empty?"":",\n"][thing.type][metadata]" + empty = FALSE + current_header += "[empty?"":",\n"][place],\n[location])\n" + //====Fill the contents file==== + //Compression is done here + var/position_of_header = header_dat.Find(current_header) + if(position_of_header) + //If the header has already been saved, change the character to the other saved header + header_char = header_chars[position_of_header] + else + header += "\"[header_char]\" = [current_header]" + header_chars += header_char + header_dat += current_header + index ++ + contents += "[header_char]\n" + contents += "\"}" + return "[header][contents]" + +//Sorts maps in terms of their positions, so scrambled / odd shaped maps can be saved +/proc/sort_map(list/map, minx, miny, maxx, maxy) + var/width = maxx - minx + 1 + var/height = maxy - miny + 1 + var/allTurfs = new/list(width, height) + for(var/turf/place in map) + allTurfs[place.x - minx + 1][place.y - miny + 1] = place + return allTurfs + +//vars_to_save = list() to save all vars +/proc/generate_tgm_metadata(atom/O, list/vars_to_save = list("pixel_x", "pixel_y", "dir", "name", "req_access", "req_access_txt", "piping_layer", "color", "icon_state", "pipe_color", "amount")) + var/dat = "" + var/data_to_add = list() + for(var/V in O.vars) + if(O.get_save_vars()) + if(!(V in O.get_save_vars())) + continue + else + if(!(V in vars_to_save) && vars_to_save) + continue + var/value = O.vars[V] + if(!value) + continue + if(value == initial(O.vars[V]) || !issaved(O.vars[V])) + continue + var/symbol = "" + if(istext(value)) + symbol = "\"" + value = sanitize_simple(value, list("{"="", "}"="", "\""="", ";"="", ","="")) + else if(isicon(value) || isfile(value)) + symbol = "'" + else if(!(isnum(value) || ispath(value))) + continue + //Prevent symbols from being because otherwise you can name something [";},/obj/item/gun/energy/laser/instakill{name="da epic gun] and spawn yourself an instakill gun. + data_to_add += "[V] = [symbol][value][symbol]" + //Process data to add + var/first = TRUE + for(var/data in data_to_add) + dat += "[first ? "" : ";\n"]\t[data]" + first = FALSE + if(dat) + dat = "{\n[dat]\n\t}" + return dat + +/proc/calculate_tgm_header_index(index, layers) + var/output = "" + for(var/i in 1 to layers) + var/l = GLOB.save_file_chars.len + var/c = FLOOR((index-1) / (l ** (i - 1)), 1) + c = (c % l) + 1 + output = "[GLOB.save_file_chars[c]][output]" + return output diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 2452beb0e1..ba4b02fcf4 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -190,6 +190,10 @@ icon = 'icons/obj/lavaland/survival_pod.dmi' icon_state = "bed" +/obj/structure/bed/double/pod + icon = 'icons/obj/lavaland/survival_pod.dmi' + icon_state = "bed_double" + //Survival Storage Unit /obj/machinery/smartfridge/survival_pod name = "survival pod storage" diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 34b349b198..e6281bb695 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -243,3 +243,17 @@ GLOBAL_LIST_EMPTY(silo_access_logs) sep = ", " msg += "[amount < 0 ? "-" : "+"][val] [M.name]" formatted = msg.Join() + +/obj/machinery/ore_silo/on_object_saved(var/depth = 0) + if(depth >= 10) + return "" + var/dat + var/datum/component/material_container/material_holder = GetComponent(/datum/component/material_container) + for(var/each in material_holder.materials) + var/amount = material_holder.materials[each] / MINERAL_MATERIAL_AMOUNT + var/datum/material/material_datum = each + while(amount > 0) + var/amount_in_stack = max(1, min(50, amount)) + amount -= amount_in_stack + dat += "[dat ? ",\n" : ""][material_datum.sheet_type]{\n\tamount = [amount_in_stack]\n\t}" + return dat diff --git a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm index 95cb9cca59..df129c6ff4 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -48,3 +48,4 @@ miss_sound = 'sound/weapons/slashmiss.ogg' allowed_limb_ids = list("mammal","aquatic","avian", "human") + species_category = "robot" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 26da7070bf..0ce86bffd4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -125,7 +125,7 @@ if(IS_STAMCRIT(src)) to_chat(src, "You're too exhausted to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].") return TRUE - combat_flags &= COMBAT_FLAG_ATTEMPTING_CRAWL + combat_flags |= COMBAT_FLAG_ATTEMPTING_CRAWL visible_message("[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] [L].", "You are now attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under": "over"] [L].", target = L, target_message = "[src] is attempting to crawl [(CHECK_MOBILITY(L, MOBILITY_STAND)) ? "under" : "over"] you.") diff --git a/html/changelog.html b/html/changelog.html index d3687150e4..6ffb1bd0c8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,33 @@ -->
+

25 November 2021

+

Arturlang updated:

+ +

SandPoot updated:

+ + +

24 November 2021

+

timothyteakettle updated:

+ + +

23 November 2021

+

TripleShades updated:

+ +

21 November 2021

DeltaFire15 updated: