diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 2f27c3f747..5f79f64c57 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -346,9 +346,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /turf/open/space/basic, /area/solar/starboard/fore) "aaU" = ( @@ -410,10 +407,7 @@ "abc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-4" }, /turf/open/space/basic, /area/solar/starboard/fore) @@ -432,10 +426,7 @@ "abe" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, /turf/open/space/basic, /area/solar/starboard/fore) @@ -1699,10 +1690,10 @@ "aee" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "0-8" }, /turf/open/space/basic, -/area/solar/starboard/fore) +/area/solar/port) "aef" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 @@ -3426,7 +3417,7 @@ "aiq" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-2" }, /turf/open/space/basic, /area/solar/port) @@ -3706,17 +3697,9 @@ /area/maintenance/starboard/fore) "ajc" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, +/obj/structure/cable, /turf/open/space/basic, -/area/solar/starboard/fore) +/area/solar/port) "ajd" = ( /obj/structure/cable{ icon_state = "1-2" @@ -6992,14 +6975,9 @@ /area/security/brig) "aqA" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, +/obj/structure/cable, /turf/open/space/basic, -/area/solar/starboard/fore) +/area/solar/starboard/aft) "aqB" = ( /turf/closed/wall, /area/hydroponics) @@ -9058,10 +9036,6 @@ /area/hallway/secondary/civilian) "avg" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Brig"; - req_access_txt = "2" - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -9070,6 +9044,12 @@ /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, +/obj/machinery/turnstile{ + name = "Genpop Entrance Turnstile"; + icon_state = "turnstile_map"; + dir = 8; + req_access_txt = "69" + }, /turf/open/floor/plasteel, /area/security/prison) "avh" = ( @@ -9177,13 +9157,10 @@ "avr" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-8" }, /turf/open/space/basic, -/area/solar/starboard/fore) +/area/solar/starboard/aft) "avs" = ( /turf/closed/wall, /area/router/service) @@ -9743,7 +9720,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, @@ -9751,6 +9727,12 @@ id = "briglockdown"; name = "Brig Lockdown" }, +/obj/machinery/turnstile{ + name = "Genpop Entrance Turnstile"; + icon_state = "turnstile_map"; + dir = 8; + req_access_txt = "69" + }, /turf/open/floor/plasteel, /area/security/prison) "awI" = ( @@ -12721,6 +12703,9 @@ pixel_x = 24; req_access_txt = "2" }, +/obj/effect/turf_decal/arrows/red{ + dir = 1 + }, /turf/open/floor/plasteel, /area/security/brig) "aCF" = ( @@ -12743,22 +12728,21 @@ /turf/open/floor/plasteel, /area/security/brig) "aCH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Brig"; - req_access_txt = "2" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "Brig Lockdown" +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/obj/effect/turf_decal/arrows/red{ + dir = 1 }, /turf/open/floor/plasteel, -/area/security/prison) +/area/security/brig) "aCI" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -13411,15 +13395,23 @@ /turf/open/floor/plating, /area/maintenance/solars/port) "aDW" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, +/obj/machinery/turnstile{ + dir = 4; + name = "Genpop Exit Turnstile"; + req_access_txt = "70" + }, /turf/open/floor/plasteel, -/area/security/brig) +/area/security/prison) "aDX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -13431,6 +13423,10 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "Brig Lockdown" + }, /turf/open/floor/plasteel, /area/security/prison) "aDZ" = ( @@ -22795,12 +22791,6 @@ /area/library) "aXg" = ( /obj/structure/bookcase/random/reference, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /turf/open/floor/wood, /area/library) "aXh" = ( @@ -24370,16 +24360,14 @@ /turf/open/floor/carpet, /area/crew_quarters/bar) "bau" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/camera{ - c_tag = "Aft Maintenance - Port"; - pixel_x = 22 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ +/obj/structure/disposalpipe/junction/flip{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/science/lab) "bav" = ( /obj/structure/chair/sofa/right, /obj/machinery/firealarm{ @@ -26759,24 +26747,18 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bga" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/hallway/primary/aft"; - dir = 1; - name = "Aft Primary Hallway APC"; - pixel_x = 1; - pixel_y = 24 +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "bgb" = ( /obj/structure/disposalpipe/sorting/mail{ sortType = 30 @@ -31400,13 +31382,28 @@ /turf/open/space/basic, /area/space/nearstation) "bpA" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 26 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "bpB" = ( -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, +/area/hallway/primary/aft) "bpC" = ( /obj/effect/turf_decal/plaque{ icon_state = "L10" @@ -31726,13 +31723,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "bqs" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plating, /area/maintenance/aft) "bqt" = ( @@ -32421,17 +32415,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "brJ" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/door/airlock/maintenance{ - name = "Chemistry Maintenance"; - req_access_txt = "5; 33" +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plating, -/area/medical/chemistry) +/area/maintenance/aft) "brK" = ( /obj/structure/window/reinforced/spawner/east, /obj/machinery/chem_dispenser, @@ -33041,7 +33030,6 @@ /turf/open/space/basic, /area/space/nearstation) "bsU" = ( -/obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bsV" = ( @@ -33482,17 +33470,8 @@ /turf/open/floor/plating, /area/router) "bua" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/side, -/area/science/robotics/lab) +/turf/closed/wall/r_wall, +/area/science/robotics/mechbay) "bub" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -34016,16 +33995,12 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "bvn" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/machinery/rnd/production/protolathe/department/science, /obj/structure/disposalpipe/segment{ - dir = 5 + dir = 4 }, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/turf/open/floor/plasteel, +/area/science/lab) "bvo" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -36857,24 +36832,14 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bBs" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plating, +/area/maintenance/aft) "bBt" = ( /obj/structure/cable{ icon_state = "4-8" @@ -37564,11 +37529,13 @@ name = "Thermo-Electric Generator" }) "bCX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/snack/random, -/obj/structure/disposalpipe/segment, +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/item/reagent_containers/glass/beaker/sulphuric, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/hallway/primary/aft) +/area/science/lab) "bCY" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -37618,12 +37585,19 @@ /turf/open/floor/plasteel/grimy, /area/security/detectives_office) "bDd" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/disposalpipe/segment, +/obj/machinery/camera{ + c_tag = "Aft Maintenance - Port"; + pixel_x = 22 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "bDe" = ( /obj/machinery/disposal/bin{ name = "Corpse Delivery" @@ -37697,19 +37671,27 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "bDm" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/hallway/primary/aft"; + dir = 1; + name = "Aft Primary Hallway APC"; + pixel_x = 1; + pixel_y = 24 }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 26 +/obj/structure/cable{ + icon_state = "2-4" }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/aft) "bDn" = ( /obj/machinery/icecream_vat, /turf/open/floor/plasteel/freezer, @@ -37976,8 +37958,9 @@ /turf/open/floor/plasteel/stairs, /area/crew_quarters/bar) "bDT" = ( -/obj/machinery/mecha_part_fabricator, -/turf/open/floor/plasteel/dark, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/closed/wall, /area/science/robotics/lab) "bDU" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, @@ -38776,25 +38759,11 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bFx" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 1 +/obj/machinery/mecha_part_fabricator, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 1 - }, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/machinery/requests_console{ - department = "Robotics"; - departmentType = 2; - name = "Robotics RC"; - pixel_y = 31; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/science/robotics/lab) "bFy" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -38823,22 +38792,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bFB" = ( -/obj/structure/window/reinforced{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/closed/wall, +/area/science/lab) "bFC" = ( -/obj/structure/table, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/storage/box/bodybags, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/effect/turf_decal/bot, +/obj/machinery/vending/snack/random, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "bFD" = ( /obj/structure/disposaloutlet{ dir = 4 @@ -38850,19 +38817,16 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bFE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -3; - pixel_y = 3 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/dropper, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/maintenance/aft) "bFF" = ( /obj/machinery/light_switch{ pixel_y = 24 @@ -40035,44 +39999,65 @@ /turf/open/floor/plasteel/white, /area/science/xenobiology) "bIc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/junction{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "robotics"; - name = "robotics lab shutters" +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 14 }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bId" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel/dark/side{ - dir = 9 +/obj/structure/table, +/obj/item/mmi, +/obj/item/mmi, +/obj/item/storage/box/bodybags, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bIe" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1 + }, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 1 + }, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/machinery/requests_console{ + department = "Robotics"; + departmentType = 2; + name = "Robotics RC"; + pixel_y = 31; + receive_ore_updates = 1 }, -/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel/dark/side{ - dir = 1 - }, +/turf/open/floor/plasteel, /area/science/robotics/lab) "bIf" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark/side{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/airlock/maintenance{ + name = "Chemistry Maintenance"; + req_access_txt = "5; 33" }, -/area/science/robotics/lab) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/medical/chemistry) "bIg" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple{ @@ -40090,10 +40075,11 @@ name = "Research Sector" }) "bIh" = ( -/obj/structure/window/reinforced{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery/white, +/obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bIi" = ( @@ -40101,8 +40087,21 @@ /turf/closed/wall, /area/medical/chemistry) "bIj" = ( -/obj/machinery/door/window/southright, -/turf/open/floor/plasteel/dark, +/obj/structure/table/optable{ + name = "Robotics Operating Table" + }, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bIk" = ( /turf/closed/wall/r_wall, @@ -40185,13 +40184,23 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bIt" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /obj/effect/turf_decal/tile/yellow{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bIu" = ( @@ -40327,12 +40336,21 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bIL" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/dropper, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bIM" = ( @@ -40523,7 +40541,13 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bJd" = ( -/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "bJe" = ( @@ -40749,47 +40773,42 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bJC" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/machinery/camera{ + c_tag = "Library"; + network = list("ss13","rd") }, -/obj/machinery/button/door{ - id = "robotics2"; - name = "Shutters Control Button"; - pixel_x = 24; - pixel_y = -24; - req_access_txt = "29" +/obj/machinery/airalarm{ + pixel_y = 24 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/wood, +/area/library) "bJD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/disposal/bin{ + name = "Corpse Disposal Unit" }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/red/full, +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bJE" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10; - pixel_x = -5 +/obj/machinery/mecha_part_fabricator, +/obj/machinery/light{ + dir = 1 }, -/obj/item/stack/cable_coil/random, -/obj/item/stack/cable_coil/random{ - pixel_x = -2; - pixel_y = -2 +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/item/stack/cable_coil/random{ - pixel_x = 2; - pixel_y = 2 +/obj/machinery/light_switch{ + pixel_y = 24 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/science/robotics/lab) "bJF" = ( /obj/effect/turf_decal/tile/purple{ @@ -41000,40 +41019,33 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bKd" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "robotics"; - name = "Shutters Control Button"; - pixel_y = 8; - req_access_txt = "29"; - pixel_x = -24 - }, -/turf/open/floor/plasteel/dark/side{ - dir = 8 +/obj/structure/table, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom{ + name = "Station Intercom (Common)"; + pixel_y = 26 }, +/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bKe" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics"; + name = "robotics lab shutters" }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark/side{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 9 }, +/turf/open/floor/plating, /area/science/robotics/lab) "bKf" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -41365,101 +41377,30 @@ /area/science/xenobiology) "bKN" = ( /obj/structure/table, -/obj/item/book/manual/wiki/robotics_cyborgs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/book/manual/ripley_build_and_repair{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/mmi/posibrain, -/turf/open/floor/plasteel/dark, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bKO" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = -1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 2; - pixel_y = -1 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/storage/toolbox/electrical{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/window/reinforced, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bKP" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_y = 3; - pixel_x = 4 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000; - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/machinery/button/door{ - id = "robotics3"; - name = "Shutters Control Button"; - pixel_x = 24; - pixel_y = -24; - req_access_txt = "29" - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/door/window/southright, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "bKQ" = ( -/obj/machinery/droneDispenser, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"bKR" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/machinery/camera{ - c_tag = "Library"; - network = list("ss13","rd") - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, +/turf/open/floor/plasteel/white, +/area/science/robotics/lab) +"bKR" = ( +/obj/structure/bookcase/random/religion, /turf/open/floor/wood, /area/library) "bKS" = ( @@ -43005,13 +42946,10 @@ "bOc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, /turf/open/space/basic, -/area/solar/port) +/area/solar/starboard/aft) "bOd" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -43032,10 +42970,10 @@ "bOf" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "0-2" }, /turf/open/space/basic, -/area/solar/port) +/area/solar/starboard/aft) "bOg" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -44395,29 +44333,18 @@ name = "Research Sector" }) "bQQ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/effect/turf_decal/tile/purple, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -28 }, -/obj/machinery/disposal/bin, -/obj/machinery/light, -/obj/effect/turf_decal/stripes/red/full, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/turf/open/floor/plasteel/dark/side{ + dir = 8 }, -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = -32 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/science/robotics/lab) "bQR" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/evac{ @@ -44978,26 +44905,24 @@ name = "Research Sector" }) "bRT" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 1 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/power/apc{ - areastring = "/area/science/robotics/lab"; - dir = 8; - name = "Robotics Lab APC"; - pixel_x = -25 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-4" +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/turf/open/floor/plasteel, -/area/science/robotics/lab) +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin{ + name = "Lab Delivery" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "bRU" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 @@ -45005,14 +44930,10 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "bRV" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "robotics"; - name = "robotics lab shutters" +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/plasteel/dark/side{ + dir = 9 }, -/turf/open/floor/plating, /area/science/robotics/lab) "bRW" = ( /obj/effect/turf_decal/bot, @@ -45028,24 +44949,25 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bRX" = ( -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bRY" = ( -/obj/structure/closet/secure_closet/medical3, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/storage/belt/medical, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"bRZ" = ( -/obj/structure/closet/l3closet, /obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bRY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"bRZ" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood, +/area/library) "bSa" = ( /obj/structure/closet/secure_closet/medical3, /obj/effect/turf_decal/tile/blue, @@ -45068,24 +44990,24 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bSd" = ( -/obj/structure/table, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/glasses/welding, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) -"bSe" = ( -/obj/machinery/computer/rdconsole/robotics{ +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/science/robotics/lab) +"bSe" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/effect/turf_decal/tile/purple, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark/side{ dir = 1 }, -/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bSf" = ( /obj/structure/table, @@ -45586,23 +45508,36 @@ /turf/open/floor/plasteel/white, /area/science/lab) "bTg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/science/robotics/mechbay"; + dir = 1; + name = "Mech Bay APC"; + pixel_y = 28 }, -/obj/structure/disposalpipe/segment{ - dir = 10 +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel/white, -/area/science/lab) +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/mechbay) "bTh" = ( -/obj/machinery/rnd/production/protolathe/department/science, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/start/cyborg, /turf/open/floor/plasteel, -/area/science/lab) +/area/science/robotics/lab) "bTi" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/obj/item/reagent_containers/glass/beaker/sulphuric, -/turf/open/floor/plasteel, -/area/science/lab) +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/dark/side{ + dir = 5 + }, +/area/science/robotics/lab) "bTj" = ( /obj/structure/table, /obj/item/reagent_containers/glass/beaker/large{ @@ -45773,27 +45708,16 @@ }, /area/medical/medbay/lobby) "bTC" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/plasteel/dark/side{ - dir = 5 - }, -/area/science/robotics/lab) +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "bTD" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) @@ -47758,15 +47682,18 @@ /turf/open/floor/plating, /area/router) "bXq" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 10 }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "bXr" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -48417,8 +48344,14 @@ name = "Research Sector" }) "bYB" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bYC" = ( /obj/structure/disposalpipe/segment, @@ -48476,28 +48409,25 @@ /turf/open/floor/circuit/green, /area/science/robotics/mechbay) "bYI" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/effect/landmark/start/medical_doctor, +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark/side{ +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"bYJ" = ( +/obj/structure/closet/secure_closet/medical3, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/area/science/robotics/lab) -"bYJ" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/structure/cable{ - icon_state = "1-2" +/obj/item/storage/belt/medical, +/obj/item/clothing/neck/stethoscope, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "bYK" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 5 @@ -49012,12 +48942,20 @@ /turf/closed/wall/r_wall, /area/library) "bZT" = ( -/obj/structure/table/optable{ - name = "Robotics Operating Table" +/obj/structure/table, +/obj/item/book/manual/wiki/robotics_cyborgs{ + pixel_x = -3; + pixel_y = -2 }, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel/dark, +/obj/item/book/manual/ripley_build_and_repair{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/mmi/posibrain, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, /area/science/robotics/lab) "bZU" = ( /obj/structure/table/wood, @@ -49353,8 +49291,19 @@ /turf/open/floor/engine/o2, /area/engine/atmos) "caO" = ( -/obj/machinery/rnd/production/circuit_imprinter/department/science, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, /area/science/robotics/lab) "caP" = ( /obj/structure/chair/office/light, @@ -49974,7 +49923,20 @@ /turf/open/floor/plating/airless, /area/router/aux) "ccd" = ( -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Robotics Lab"; + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 + }, /area/science/robotics/lab) "cce" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -52022,25 +51984,18 @@ /turf/open/floor/plasteel, /area/engine/atmos) "cgf" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/dark/side{ dir = 4 }, -/area/science/robotics/lab) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "cgg" = ( /obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -52140,17 +52095,19 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "cgr" = ( -/obj/machinery/power/apc/highcap/ten_k{ - areastring = "/area/science/robotics/mechbay"; +/obj/machinery/vending/wardrobe/robo_wardrobe, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/airalarm{ dir = 1; - name = "Mech Bay APC"; - pixel_y = 28 + pixel_y = -22 }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/mechbay) +/turf/open/floor/plasteel, +/area/science/robotics/lab) "cgs" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53172,13 +53129,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"ciA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/port) "ciB" = ( /obj/structure/frame/computer, /obj/structure/disposalpipe/segment, @@ -53308,18 +53258,10 @@ /turf/open/floor/plasteel, /area/quartermaster/warehouse) "ciQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "ciR" = ( @@ -53923,23 +53865,30 @@ /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) "cka" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "ckb" = ( -/obj/machinery/aug_manipulator, -/obj/machinery/camera/autoname{ +/obj/effect/turf_decal/tile/purple{ dir = 1 }, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 4 + }, /area/science/robotics/lab) "ckc" = ( /obj/machinery/portable_atmospherics/canister/air, @@ -54062,6 +54011,9 @@ }, /obj/effect/turf_decal/tile/blue, /obj/effect/landmark/start/chemist, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "ckq" = ( @@ -54206,6 +54158,9 @@ pixel_x = 32; pixel_y = -32 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "ckE" = ( @@ -54618,10 +54573,12 @@ }, /area/library) "clv" = ( -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/med/surgery, -/turf/open/floor/plasteel/dark, -/area/science/robotics/lab) +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "clw" = ( /obj/effect/landmark/start/librarian, /obj/machinery/newscaster{ @@ -55277,40 +55234,14 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "cmS" = ( -/obj/structure/rack, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 }, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/item/storage/firstaid/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/item/healthanalyzer{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/healthanalyzer{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/healthanalyzer{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/machinery/camera/autoname{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/science/robotics/lab) "cmT" = ( /obj/structure/table/reinforced, @@ -55734,41 +55665,6 @@ icon_state = "panelscorched" }, /area/maintenance/port/fore) -"cnG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/space/basic, -/area/solar/port) -"cnH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/port) -"cnI" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/port) -"cnJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/port) "cnK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55778,71 +55674,10 @@ }, /turf/open/floor/plasteel, /area/engine/teg_hot) -"cnL" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) -"cnM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) -"cnN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) "cnO" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/science/storage) -"cnP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) -"cnQ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) -"cnR" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/solar/starboard/aft) "cnS" = ( /obj/structure/cable{ icon_state = "0-2" @@ -56692,7 +56527,6 @@ icon_state = "2-4" }, /obj/machinery/holopad, -/obj/effect/turf_decal/bot, /turf/open/floor/wood, /area/library) "cpv" = ( @@ -56703,16 +56537,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "cpw" = ( +/obj/machinery/computer/operating, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/turf/open/floor/plasteel/dark/side{ - dir = 8 +/obj/structure/sign/poster/official/space_cops{ + pixel_y = 32 }, +/turf/open/floor/plasteel/white, /area/science/robotics/lab) "cpx" = ( /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -57485,6 +57320,13 @@ /area/hallway/secondary/entry) "cqW" = ( /obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window/reinforced/spawner, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cqX" = ( @@ -57807,10 +57649,29 @@ name = "Engine Room" }) "cry" = ( -/obj/structure/bookcase/random/religion, -/obj/effect/turf_decal/bot, -/turf/open/floor/wood, -/area/library) +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10; + pixel_x = -5 + }, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/stack/cable_coil/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Robotics - Surgery"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "crz" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -57825,10 +57686,12 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "crA" = ( -/obj/structure/bookcase/random/fiction, -/obj/effect/turf_decal/bot, -/turf/open/floor/wood, -/area/library) +/obj/machinery/aug_manipulator, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "crB" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ @@ -58007,9 +57870,14 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "crW" = ( -/obj/effect/landmark/start/paramedic, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/obj/machinery/computer/rdconsole/robotics{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "crX" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -58536,12 +58404,20 @@ /turf/open/floor/plating, /area/storage/tech) "csV" = ( -/obj/machinery/mecha_part_fabricator, -/obj/machinery/camera{ - c_tag = "Robotics Lab"; - network = list("ss13","rd") +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/button/door{ + id = "robotics"; + name = "Shutters Control Button"; + pixel_y = 8; + req_access_txt = "29"; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 8 }, -/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "csW" = ( /obj/effect/turf_decal/tile/neutral, @@ -59274,8 +59150,41 @@ name = "Research Observatory" }) "cum" = ( -/obj/machinery/computer/operating, -/turf/open/floor/plasteel/dark, +/obj/structure/rack, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/storage/firstaid/regular{ + empty = 1; + name = "First-Aid (empty)" + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/item/assembly/prox_sensor, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/science/robotics/lab) "cun" = ( /obj/structure/table/reinforced, @@ -59660,16 +59569,17 @@ /area/science/robotics/lab) "cuZ" = ( /obj/effect/turf_decal/tile/purple{ - dir = 4 + dir = 1 }, -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/turf_decal/tile/purple{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 5 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark/side{ - dir = 10 + dir = 4 }, /area/science/robotics/lab) "cva" = ( @@ -59820,19 +59730,15 @@ /turf/open/floor/plating, /area/medical/virology) "cvt" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark/side, +/turf/open/floor/plasteel/dark/side{ + dir = 10 + }, /area/science/robotics/lab) "cvu" = ( /obj/effect/turf_decal/tile/blue{ @@ -60146,11 +60052,8 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, /turf/open/floor/plasteel/dark/side, /area/science/robotics/lab) @@ -60174,7 +60077,14 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvS" = ( -/obj/machinery/vending/wardrobe/robo_wardrobe, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/holopad, /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "cvT" = ( @@ -61467,11 +61377,28 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cyt" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 5 +/obj/effect/turf_decal/tile/purple{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/power/apc{ + areastring = "/area/science/robotics/lab"; + dir = 8; + name = "Robotics Lab APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/science/research{ + name = "Research Sector" + }) "cyu" = ( /obj/structure/closet/wardrobe/chemistry_white{ anchored = 1 @@ -62134,15 +62061,17 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "czH" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/machinery/button/door{ + id = "robotics2"; + name = "Shutters Control Button"; + pixel_x = 24; + pixel_y = -24; + req_access_txt = "29" }, -/obj/effect/turf_decal/stripes/corner{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark/side{ - dir = 6 - }, +/turf/open/floor/plasteel/dark, /area/science/robotics/lab) "czI" = ( /obj/structure/disposalpipe/segment{ @@ -65270,12 +65199,16 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "cEP" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/purple{ + dir = 1 }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side, /area/science/robotics/lab) "cEQ" = ( /obj/effect/turf_decal/tile/blue, @@ -65965,22 +65898,54 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "cFV" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility, +/obj/item/multitool{ + pixel_x = 3 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/item/multitool{ + pixel_x = 3 }, -/turf/open/floor/plasteel/dark, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/science/robotics/lab) "cFW" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "robotics2"; + name = "robotics lab shutters" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/science/robotics/lab) "cFX" = ( /obj/machinery/chem_heater, @@ -66496,6 +66461,21 @@ /obj/structure/tank_dispenser, /turf/open/floor/engine, /area/science/storage) +"cGN" = ( +/obj/structure/closet/l3closet, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"cGO" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "cGP" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -70724,6 +70704,13 @@ "cPw" = ( /turf/open/floor/plasteel/dark, /area/science/robotics/mechbay) +"cPx" = ( +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "cPy" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70920,6 +70907,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cPP" = ( +/obj/effect/landmark/start/paramedic, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "cPQ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -71744,6 +71738,149 @@ /area/science/server{ name = "Computer Core" }) +"cRi" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side, +/area/science/robotics/lab) +"cRj" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 6 + }, +/area/science/robotics/lab) +"cRk" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_y = 3; + pixel_x = 4 + }, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000; + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/machinery/button/door{ + id = "robotics3"; + name = "Shutters Control Button"; + pixel_x = 24; + pixel_y = -24; + req_access_txt = "29" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cRl" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cRm" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light, +/obj/effect/turf_decal/stripes/red/full, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 + }, +/obj/machinery/disposal/bin{ + name = "Corpse Disposal Unit" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) +"cRn" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cRo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 + }, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cRp" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/start/roboticist, +/turf/open/floor/plasteel/dark, +/area/science/robotics/lab) +"cRq" = ( +/obj/machinery/rnd/production/circuit_imprinter/department/science, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) +"cRr" = ( +/obj/machinery/droneDispenser, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/effect/turf_decal/stripes/line{ + dir = 5; + layer = 2.03 + }, +/turf/open/floor/plasteel, +/area/science/robotics/lab) "cVq" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -86971,7 +87108,7 @@ aaa aaa aaa aaU -aiq +aee aaU aaa aaa @@ -87228,7 +87365,7 @@ aaa aaa aaa aaU -aiq +abh aaU aaa aaa @@ -87485,7 +87622,7 @@ abi aaa aaa aaK -aaM +aaL abi aaa aaa @@ -90050,17 +90187,17 @@ aaa aaa aaa aaU -bOc +aee aaU aaU aaU aaU -bOc +aee aaU aaU aaU aaU -bOc +aee aaU aaU aaU @@ -90307,17 +90444,17 @@ aaa aaa aaa aaU -bOf -ciA -ciA -ciA -ciA -cnG -cnH +abh +abh +abh +abh +abh +abh +aiq aaL -cnI -ciA -cnJ +ajc +abh +abh abh abh abh @@ -95543,9 +95680,9 @@ ckk bYF cct bFu -bIc -btn -btn +bKe +bsM +bsM bsM cuY bIk @@ -95799,13 +95936,13 @@ bYp bYx cPw caz +bsU +bRV +bQQ ccd -bId -cpw -cpw -bKd -cuZ -bKN +csV +cvt +bZT bIk aaU aaU @@ -96056,13 +96193,13 @@ bYq cPv bYH bYv -bDT -bIe -bYB +bFx +bSd +bTh bto -bYB -cvt -bSe +bTh +cvQ +crW ceb aaU aaa @@ -96223,7 +96360,7 @@ aew axi atW aCE -aDW +aCH anU anU anU @@ -96309,17 +96446,17 @@ bXU aJV brz bYv -cgr +bTg bYy crf bYv -bFx -bIf +bIe +bSe bto csZ bto -cvQ -caO +cEP +cRq ceb aaU aaa @@ -96480,7 +96617,7 @@ aeJ aeJ aeJ aew -aCH +aDW aew aIn aew @@ -96569,14 +96706,14 @@ bYv bYv cwb bYv -bYv -csV -bIe -bYB -cqz -bYB bua -cmS +bJE +bSd +bTh +cqz +bTh +cRi +cum ceb aaU aaa @@ -96825,15 +96962,15 @@ bLU bRM bRO bRR -bRT -bRV -bSd -bTC -bYI -cgf -bKe -czH -bKO +cyt +bDT +bKd +bTi +caO +ckb +cuZ +cRj +cFV ceb aaU aaa @@ -97084,13 +97221,13 @@ cEs bRS cEN cEO -cEP -bTD -bYJ -cka +bIc +bRX +cRn +cvS cmR -cFV -bKP +cRp +cRk ceb aaU aaa @@ -97340,14 +97477,14 @@ cfZ bWX bWX ckf -bIk -bFB +btn bIh -ccd -bJC +bRY +bTD +czH bKf -cFW -bKQ +cRl +cRr bIk aaU aaa @@ -97598,10 +97735,10 @@ bXU bXU bWa bIk -bFC -bIj -ccd -bJD +bId +bKN +bTD +cmS ccm coH bJH @@ -97855,10 +97992,10 @@ aaU aaU aaU bIk -clv -bsU -ccd -bJE +bIj +bKO +bTD +cry ccm cOx cOA @@ -98112,10 +98249,10 @@ aaa aaa aaU bIk -bZT -bsU -ccd -ckb +cpw +bKP +cRo +crA cdW cOy cOB @@ -98369,10 +98506,10 @@ aaU aaU aaU bIk -cum -bIj -ccd -cvS +bJD +bKQ +bYB +cgr bIk cOz cOC @@ -98629,7 +98766,7 @@ bIk bIk bIk ccB -bJH +cFW bIk cGb bRI @@ -98886,7 +99023,7 @@ bCh bRL bIs ccC -bRZ +cGN cFn cGc bMj @@ -99143,7 +99280,7 @@ coc bTz bTE ccD -bTE +cGO bTE cGd cvT @@ -99386,7 +99523,7 @@ bSE bSN bSU bTa -bTg +bau bTn bSC bRH @@ -99400,7 +99537,7 @@ bRI bTA bVO cfN -ckd +cPx ckd cGe bMj @@ -99615,7 +99752,7 @@ bWj baS bbr aZy -bKR +bJC bZF bZF cjx @@ -99643,7 +99780,7 @@ bSE bYV cEC cEL -bTh +bvn bSC bSC bRJ @@ -99656,8 +99793,8 @@ cKl cKm cKn cKo -bRX -crW +bYI +cPP bIq cqZ bMj @@ -99872,8 +100009,8 @@ bWk cdE bbs aZy -cry -crA +bKR +bRZ bZF cCJ baE @@ -99900,7 +100037,7 @@ bSE bSP cED bTb -bTi +bCX bSC brk bsp @@ -99913,7 +100050,7 @@ cel bCh cEQ bXn -bRY +bYJ bSa bSc bSg @@ -100157,7 +100294,7 @@ bSH bSG cij bSG -bSC +bFB bSC bhx bqv @@ -100170,7 +100307,7 @@ cem bRI cER cEU -bCh +bSh bCh bCh bSh @@ -100414,7 +100551,7 @@ coB bbl cEF buD -bCX +bFC bqc brm bst @@ -100427,7 +100564,7 @@ coV bCh cES cEV -cFj +cgf cFj cFo cFr @@ -100671,7 +100808,7 @@ cqe cqg cEG bdv -bDd +bqr bqe brq bst @@ -100684,7 +100821,7 @@ bAo cuW cET cEW -bQk +cka bQk bQk bQu @@ -100928,7 +101065,7 @@ cID bZm cEH bdv -bDd +bqr cyy cyA bst @@ -100941,7 +101078,7 @@ bAq cuX bFJ cEX -cqW +clv bWD cqb bKy @@ -101185,7 +101322,7 @@ cIE cEz cEI bXi -bXq +bga caQ bXC bvK @@ -101198,7 +101335,7 @@ bKi bPP bQa cEY -bvn +cqW bJg bQl bYG @@ -101442,7 +101579,7 @@ cIF ccp bqo buF -bDm +bpA bqe ceY bwf @@ -101699,7 +101836,7 @@ cIF ccp bqr bbh -bbh +bpB bqm bqm byw @@ -101956,7 +102093,7 @@ cIF ccp cpH bbh -bpA +bqs bXz bqm byD @@ -102213,7 +102350,7 @@ cIF ccp cJe bbh -bpB +brJ btv bqm bzJ @@ -102470,7 +102607,7 @@ cIG ccw csM cyo -cyt +bBs blU bqz bAD @@ -102491,7 +102628,7 @@ bot bot bjx bAH -bQQ +cRm cpz cvs cwj @@ -102727,11 +102864,11 @@ cIH cgv coE bxM -bau +bDd bXt brH bAE -bIt +bIL cdX buS buS @@ -102984,12 +103121,12 @@ cIF cgB bqr bbh -bga -bqs -brJ -bBs -bIL -ciQ +bDm +bFE +bIf +bIt +bJd +bXq cmK cws czv @@ -103245,8 +103382,8 @@ bPw bqz bqz bzA -bFE -bFG +bRT +ciQ col cxh czB @@ -103759,7 +103896,7 @@ bPw bqz brK bCf -bJd +bTC ckD cpI cyF @@ -112904,10 +113041,10 @@ aaa aaa aaa aaU -aee -aeP -aeP -aqA +aaV +aaV +aaV +abe aeP agX ajS @@ -113161,7 +113298,7 @@ aWj aWj aWj aWj -adx +aaV aaU aaU aaU @@ -113418,7 +113555,7 @@ aaa aaa aaa aaU -adx +aaV aaU aaa aaa @@ -113675,7 +113812,7 @@ aaa aaa aaa aaU -abe +abc aaU aaa aaa @@ -115078,11 +115215,11 @@ bHM aaa aaa aaU -cnM +avr aaU aaa aaU -cnM +avr aaU aaa aaa @@ -115335,11 +115472,11 @@ bHM aaa aaa bNK -bYQ +bNS bNU aaa bNK -bYQ +bNS bNU aaa aaa @@ -116620,11 +116757,11 @@ bHN bHN bHN bNL -cnM +avr aaU aaU aaU -cnM +avr aaU aaU aaU @@ -116876,13 +117013,13 @@ bZy bHN bHz ckn -cnL -cnN -bOk -bOk -bOk -cnP -cnR +aqA +bNL +bNL +bNL +bNL +bNL +bOf bOk bOk bOq @@ -117138,7 +117275,7 @@ aaU aaU aaU aaU -cnQ +bOc aaU aaU aaU @@ -117525,17 +117662,17 @@ adl abM aZG aaU -abc -aeP -aeP -aeP -aeP -ajc -aeP -aeP -aeP -aeP -avr +aaV +aaV +aaV +aaV +aaV +aaV +aaV +aaV +aaV +aaV +aaV aaU aTx aoK @@ -117782,17 +117919,17 @@ adw adH aaU aaU -abe +abc aaU aaU aaU aaU -abe +abc aaU aaU aaU aaU -abe +abc aaU aaU aoT @@ -119843,7 +119980,7 @@ aaa aaa aaa aaU -adx +aaV aaU aaa aaa @@ -120100,7 +120237,7 @@ aaa aaa aaa aaU -abe +abc aaU aaa aaa diff --git a/_maps/map_files/LambdaStation/lambda.dmm b/_maps/map_files/LambdaStation/lambda.dmm index c6553c728e..4d2d8cb624 100644 --- a/_maps/map_files/LambdaStation/lambda.dmm +++ b/_maps/map_files/LambdaStation/lambda.dmm @@ -33412,6 +33412,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/gateway/centerstation, /turf/open/floor/plasteel/dark, /area/gateway) "bkm" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 588b55679c..ca155d6e94 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -32918,15 +32918,10 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/hallway/secondary/entry) "bxZ" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/hallway/secondary/entry) "bya" = ( @@ -34199,9 +34194,8 @@ /obj/structure/transit_tube/curved/flipped{ dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/turf/open/space/basic, +/area/space/nearstation) "bAJ" = ( /obj/structure/transit_tube/horizontal, /obj/structure/window/reinforced/fulltile, @@ -34871,6 +34865,7 @@ /area/science/xenobiology) "bBV" = ( /obj/structure/transit_tube/curved, +/obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) "bBW" = ( @@ -38491,10 +38486,12 @@ /turf/open/floor/plasteel/dark, /area/chapel/dock) "bIY" = ( -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 +/obj/structure/window/reinforced{ + dir = 8; + layer = 2.9 }, -/area/hallway/secondary/entry) +/turf/open/space/basic, +/area/space) "bIZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -39538,9 +39535,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/dock) "bLp" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bLq" = ( @@ -39563,20 +39558,17 @@ /turf/open/floor/plasteel/dark, /area/chapel/dock) "bLr" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, /area/chapel/dock) "bLs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/dock) "bLt" = ( /obj/effect/decal/cleanable/oil{ icon_state = "floor6" @@ -40049,6 +40041,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -40092,13 +40085,19 @@ }, /area/chapel/dock) "bMy" = ( -/obj/structure/window/reinforced{ - dir = 8; - layer = 2.9 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/chapel/dock) "bMA" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/engine, @@ -40520,12 +40519,12 @@ /turf/open/floor/plasteel/dark, /area/chapel/dock) "bNu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bNv" = ( @@ -40945,6 +40944,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bOy" = ( @@ -40958,6 +40958,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bOz" = ( @@ -41226,6 +41229,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bPo" = ( @@ -41242,6 +41246,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/chapel/dock) "bPp" = ( @@ -41538,6 +41543,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/chapel/asteroid/monastery) "bQg" = ( @@ -44734,14 +44740,14 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "bWX" = ( -/obj/machinery/door/airlock/grunge{ - name = "Chapel" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main/monastery) +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/chapel/asteroid/monastery) "bWZ" = ( /turf/open/floor/plating{ icon_state = "panelscorched" @@ -45071,6 +45077,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/chapel/main/monastery) "bXJ" = ( @@ -45776,6 +45783,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, /area/chapel/main/monastery) "bZo" = ( @@ -46530,6 +46538,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, /area/chapel/main/monastery) "cbO" = ( @@ -46537,6 +46546,7 @@ /obj/item/reagent_containers/food/drinks/trophy{ pixel_y = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, /area/chapel/main/monastery) "cbP" = ( @@ -46693,15 +46703,15 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/carpet, /area/chapel/main/monastery) "ccF" = ( /obj/effect/landmark/start/chaplain, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /turf/open/floor/carpet, /area/chapel/main/monastery) @@ -53372,8 +53382,9 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "dpc" = ( -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/chapel/main/monastery) "dps" = ( /obj/machinery/status_display/ai, /turf/closed/wall, @@ -53737,13 +53748,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"eit" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "eiV" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -53761,10 +53765,6 @@ /obj/structure/chair/office/dark, /turf/open/floor/wood, /area/lawoffice) -"epg" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space) "epj" = ( /obj/machinery/cryopod{ dir = 8 @@ -54040,12 +54040,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"eVT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "eWi" = ( /obj/structure/cable{ icon_state = "0-4" @@ -54960,14 +54954,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"gTy" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "gUb" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -55218,14 +55204,6 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port) -"hCb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) "hDG" = ( /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; @@ -56414,10 +56392,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"koE" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "kpK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -56602,12 +56576,7 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "kIc" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -56752,12 +56721,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"kVy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "kWQ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/structure/cable/yellow{ @@ -57225,11 +57188,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) -"mgU" = ( -/obj/effect/landmark/carpspawn, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "mhl" = ( /obj/machinery/power/emitter, /obj/machinery/light{ @@ -57532,14 +57490,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/department/science) -"mSY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/chapel/dock) "mTS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -57549,12 +57499,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"mVD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "mVM" = ( /turf/open/floor/plating/airless, /area/space/nearstation) @@ -57636,12 +57580,6 @@ /obj/item/chair/stool, /turf/open/floor/carpet, /area/maintenance/department/crew_quarters/dorms) -"nho" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "nih" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/costume, @@ -58727,17 +58665,6 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit/departure_lounge) -"ppY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/chapel/dock) "prQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -60222,22 +60149,6 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"tbF" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"tbY" = ( -/obj/structure/closet/emcloset, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "tcY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -60856,10 +60767,6 @@ /obj/machinery/field/generator, /turf/open/floor/plating, /area/maintenance/department/engine) -"uxI" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "uxP" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -61064,10 +60971,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"vaB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "vco" = ( /obj/machinery/light/small{ dir = 8 @@ -61278,12 +61181,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"vxZ" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -61721,9 +61618,7 @@ /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) "wDe" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/white{ heat_capacity = 1e+006 }, @@ -61910,10 +61805,6 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) -"wUc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "wUf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, @@ -61948,25 +61839,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"wYJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "wYK" = ( /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, /area/engine/supermatter) -"wZs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) "xah" = ( /obj/structure/cable{ icon_state = "1-2" @@ -62025,10 +61901,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/lawoffice) -"xeN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "xgh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -79577,26 +79449,26 @@ bIW bKc bOy bMt -bLn -bOy +bLs +bMy bPo -bQg -bQg -bQg -bQg -bQg -bQg -bQg -bQg -bQg bWX -bXJ -bZo -bZo -bZo -bZo -bZo -bZo +bWX +bWX +bWX +bWX +bWX +bWX +bWX +bWX +cek +cdx +dpc +dpc +dpc +dpc +dpc +dpc cbO ccF cdx @@ -80088,7 +79960,7 @@ aaa bGI bHM bHM -bHM +bNw bLq bMv bNw @@ -80599,11 +80471,11 @@ aaa aaa aaa aaa -koE +aht aqG bGE bKf -mSY +bKf bMw bNy bNw @@ -80855,12 +80727,12 @@ aaa aaa aaa aaa -koE -koE +aht +aht aqG bGE bKf -mSY +bKf bMx bNz bHM @@ -81111,13 +80983,13 @@ aaa aaa aaa aaa -koE -koE -koE +aaa +aaa +aaa aqG bGE wDe -ppY +bHM bHM bNA bHM @@ -81361,23 +81233,23 @@ aZx aaa aaa aaa -mZE -bVp -bVp -bVp -bVp -bVp -eit -gTy -eit -eit -tbF -aZx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bIY -bLs -aZx +bIY +aht +aht bNB -bMy +abI abI aby abI @@ -81618,21 +81490,21 @@ aZx aaa aaa aaa -bGI -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -bIY -wZs -aZx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aht amC aaa aht @@ -81875,21 +81747,21 @@ aZx aaa aaa aaa -bGI -aZx -tbY -wYJ -xeN -xeN -xeN -wYJ -xeN -eVT -dpc -vxZ -bIY -nho -aZx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa amB aht aht @@ -82132,21 +82004,21 @@ aZx aaa aaa aaa -bGI -aZx -mVD -dpc -dpc -dpc -wUc -vaB -vaB -vaB -vaB -vaB -vaB -kVy -aZx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aht amC aaa aht @@ -82389,21 +82261,21 @@ aZx aaa aaa aaa -bGI -aZx -mVD -dpc -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx -aZx +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aht +aht amB aht aht @@ -82646,21 +82518,21 @@ aZx aaa aaa aaa -aqG -aZx -mVD -dpc -aZx -koE -koE -koE -koE -koE -koE -koE -koE -koE -koE +aaa +aaa +aaa +aaa +aaa +aht +aaa +aaa +aaa +aaa +aht +aht +aht +aht +aht amD aaa aht @@ -82902,12 +82774,12 @@ bon aZx aaa aaa -koE -aqG -aZx -mVD -dpc -aZx +aaa +aaa +aaa +aaa +aaa +aht bBV bDf bDf @@ -83162,12 +83034,12 @@ aZx aZx aZx aZx -mVD -uxI +aaa +aht bAI -epg abI -koE +abI +aht abI aaa bva @@ -83420,7 +83292,7 @@ bbR bbR aZx kIc -hCb +kIc bAJ bBX bBX @@ -83470,7 +83342,7 @@ cfN cfN xYV cjm -koE +aht aaa aaa aaa @@ -83728,7 +83600,7 @@ cfN qWo cjm cjm -koE +aht aaa aaa aaa @@ -84483,8 +84355,8 @@ bva bNK bva bva -koE -mgU +aht +aht kSb kSb aht @@ -84742,7 +84614,7 @@ bQl cqX xNx ctS -aaa +cFB aaa aaa aaa @@ -84754,8 +84626,8 @@ aaa aaa kSb kSb -koE -koE +aht +aht nKo aaa aaa diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm index 6b70eb1e0f..a4bf69b2ad 100644 --- a/code/__DEFINES/configuration.dm +++ b/code/__DEFINES/configuration.dm @@ -8,3 +8,12 @@ //flags #define CONFIG_ENTRY_LOCKED 1 //can't edit #define CONFIG_ENTRY_HIDDEN 2 //can't see value + +// Policy config keys +// MAKE SURE THESE ARE UPPERCASE +/// Displayed to cloned patients +#define POLICYCONFIG_ON_CLONE "ON_CLONE" +/// Displayed to defibbed/revival surgery'd patients before the memory loss time threshold +#define POLICYCONFIG_ON_DEFIB_INTACT "ON_DEFIB_INTACT" +/// Displayed to defibbed/revival surgery'd patients after the memory loss time threshold +#define POLICYCONFIG_ON_DEFIB_LATE "ON_DEFIB_LATE" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index d9a6452f38..5c28694005 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -37,12 +37,14 @@ #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) #define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) #define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text) -#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) +///from base of atom/get_examine_name(): (/mob, list/overrides) +#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" +#define COMSIG_PARENT_EXAMINE_MORE "atom_examine_more" ///from base of atom/examine_more(): (/mob) //Positions for overrides list - #define EXAMINE_POSITION_ARTICLE 1 - #define EXAMINE_POSITION_BEFORE 2 + #define EXAMINE_POSITION_ARTICLE (1<<0) + #define EXAMINE_POSITION_BEFORE (1<<1) //End positions - #define COMPONENT_EXNAME_CHANGED 1 + #define COMPONENT_EXNAME_CHANGED (1<<0) #define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 @@ -179,6 +181,10 @@ #define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) #define COMSIG_MOB_KEY_CHANGE "mob_key_change" //from base of /mob/transfer_ckey(): (new_character, old_character) #define COMSIG_MOB_PRE_PLAYER_CHANGE "mob_pre_player_change" //sent to the target mob from base of /mob/transfer_ckey() and /mind/transfer_to(): (our_character, their_character) +///from /mob/living/handle_eye_contact(): (mob/living/other_mob) +#define COMSIG_MOB_EYECONTACT "mob_eyecontact" + /// return this if you want to block printing this message to this person, if you want to print your own (does not affect the other person's message) + #define COMSIG_BLOCK_EYECONTACT (1<<0) // #define COMPONENT_STOP_MIND_TRANSFER 1 #define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () #define COMSIG_MOB_ON_NEW_MIND "mob_on_new_mind" //called when a new mind is assigned to a mob: () diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index fa7758be1f..42139cdeda 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -310,3 +310,9 @@ #define FOV_90_DEGREES 90 #define FOV_180_DEGREES 180 #define FOV_270_DEGREES 270 + +/// How far away you can be to make eye contact with someone while examining +#define EYE_CONTACT_RANGE 5 + +/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() +#define EXAMINE_MORE_TIME 1 SECONDS \ No newline at end of file diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 4647b83cd7..7e8b1c8f38 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -209,6 +209,8 @@ new_value = new_list continue_check_value = new_list.len if(continue_check_value && continue_check_key && ValidateListEntry(new_key, new_value)) + new_key = preprocess_key(new_key) + new_value = preprocess_value(new_value) config_entry_value[new_key] = new_value return TRUE return FALSE @@ -216,6 +218,12 @@ /datum/config_entry/keyed_list/vv_edit_var(var_name, var_value) return var_name != "splitter" && ..() +/datum/config_entry/keyed_list/proc/preprocess_key(key) + return key + +/datum/config_entry/keyed_list/proc/preprocess_value(value) + return value + //snowflake for donator things being on one line smh /datum/config_entry/multi_keyed_flag vv_VAS = FALSE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 31431ddab9..1c6e96f9e4 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -14,6 +14,7 @@ var/list/modes // allowed modes var/list/gamemode_cache var/list/votable_modes // votable modes + // var/list/ic_filter_regex var/list/storyteller_cache var/list/mode_names var/list/mode_reports @@ -414,3 +415,21 @@ continue runnable_modes[M] = probabilities[M.config_tag] return runnable_modes +/* +/datum/controller/configuration/proc/LoadChatFilter() + var/list/in_character_filter = list() + + if(!fexists("[directory]/in_character_filter.txt")) + return + log_config("Loading config file in_character_filter.txt...") + for(var/line in world.file2list("[directory]/in_character_filter.txt")) + if(!line) + continue + if(findtextEx(line,"#",1,2)) + continue + in_character_filter += REGEX_QUOTE(line) + + ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null + + syncChatRegexes() +*/ diff --git a/code/controllers/configuration/entries/policy.dm b/code/controllers/configuration/entries/policy.dm new file mode 100644 index 0000000000..de611e1813 --- /dev/null +++ b/code/controllers/configuration/entries/policy.dm @@ -0,0 +1,11 @@ +/// Seconds for CMD on defib-with-memory-loss policy config to display instead of defib-intact config +/datum/config_entry/number/defib_cmd_time_limit + config_entry_value = 300 + integer = TRUE + +/datum/config_entry/keyed_list/policyconfig + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_TEXT + +/datum/config_entry/keyed_list/policyconfig/preprocess_key(key) + return uppertext(..()) diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index 8d4de0c091..bbeb0683f0 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -4,6 +4,7 @@ SUBSYSTEM_DEF(chat) wait = 1 priority = FIRE_PRIORITY_CHAT init_order = INIT_ORDER_CHAT + var/list/payload = list() @@ -17,7 +18,7 @@ SUBSYSTEM_DEF(chat) return -/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE) +/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = TRUE) if(!target || !message) return @@ -35,8 +36,8 @@ SUBSYSTEM_DEF(chat) if(handle_whitespace) message = replacetext(message, "\n", "
") message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") - message += "
" - + if (trailing_newline) + message += "
" //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. //Do the double-encoding here to save nanoseconds @@ -47,7 +48,7 @@ SUBSYSTEM_DEF(chat) var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible if(!C) - return + continue //Send it to the old style output window. SEND_TEXT(C, original_message) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 47bd52a705..31c9581354 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -128,6 +128,8 @@ transfer_martial_arts(new_character) if(active || force_key_move) new_character.key = key //now transfer the key to link the client to our new body + if(new_character.client) + LAZYCLEARLIST(new_character.client.recent_examines) current.update_atom_languages() //CIT CHANGE - makes arousal update when transfering bodies diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 9c2128163f..40b71eec0a 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -314,6 +314,13 @@ GLOBAL_LIST_EMPTY(family_heirlooms) medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." var/dumb_thing = TRUE +/datum/quirk/social_anxiety/add() + RegisterSignal(quirk_holder, COMSIG_MOB_EYECONTACT, .proc/eye_contact) + RegisterSignal(quirk_holder, COMSIG_MOB_EXAMINATE, .proc/looks_at_floor) + +/datum/quirk/social_anxiety/remove() + UnregisterSignal(quirk_holder, list(COMSIG_MOB_EYECONTACT, COMSIG_MOB_EXAMINATE)) + /datum/quirk/social_anxiety/on_process() var/nearby_people = 0 for(var/mob/living/carbon/human/H in oview(3, quirk_holder)) @@ -330,6 +337,45 @@ GLOBAL_LIST_EMPTY(family_heirlooms) dumb_thing = FALSE //only once per life if(prob(1)) new/obj/item/reagent_containers/food/snacks/pastatomato(get_turf(H)) //now that's what I call spaghetti code +// small chance to make eye contact with inanimate objects/mindless mobs because of nerves + + + +/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A) + var/mob/living/mind_check = A + if(prob(85) || (istype(mind_check) && mind_check.mind)) + return + + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, quirk_holder, "You make eye contact with [A]."), 3) + +/datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner) + if(prob(75)) + return + var/msg + if(triggering_examiner) + msg = "You make eye contact with [other_mob], " + else + msg = "[other_mob] makes eye contact with you, " + + switch(rand(1,3)) + if(1) + quirk_holder.Jitter(10) + msg += "causing you to start fidgeting!" + if(2) + quirk_holder.stuttering = max(3, quirk_holder.stuttering) + msg += "causing you to start stuttering!" + if(3) + quirk_holder.Stun(2 SECONDS) + msg += "causing you to freeze up!" + + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "anxiety_eyecontact", /datum/mood_event/anxiety_eyecontact) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, quirk_holder, "[msg]"), 3) // so the examine signal has time to fire and this will print after + return COMSIG_BLOCK_EYECONTACT + +/datum/mood_event/anxiety_eyecontact + description = "Sometimes eye contact makes me so nervous...\n" + mood_change = -5 + timeout = 3 MINUTES /datum/quirk/phobia name = "Phobia" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bbd38e9021..5d29ef1598 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -366,6 +366,20 @@ SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) +/** + * Called when a mob examines (shift click or verb) this atom twice (or more) within EXAMINE_MORE_TIME (default 1.5 seconds) + * + * This is where you can put extra information on something that may be superfluous or not important in critical gameplay + * moments, while allowing people to manually double-examine to take a closer look + * + * Produces a signal [COMSIG_PARENT_EXAMINE_MORE] + */ +/atom/proc/examine_more(mob/user) + . = list() + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE_MORE, user, .) + if(!LAZYLEN(.)) // lol ..length + return list("You examine [src] closer, but find nothing of interest...") + /// Updates the icon of the atom /atom/proc/update_icon() // I expect we're going to need more return flags and options in this proc diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 6f798a41ef..512e3108d4 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -411,6 +411,11 @@ to_chat(occupant, "There is a bright flash!
You feel like a new being.
") mob_occupant.flash_act() + var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/policy = policies[POLICYCONFIG_ON_CLONE] + if(policy) + to_chat(occupant, policy) + occupant.log_message("revived using cloning.", LOG_GAME) mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, mob_occupant.getCloneLoss()) occupant.forceMove(T) diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index b906b1afb5..fc99edd3eb 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -184,6 +184,15 @@ blocked = FALSE return +/obj/machinery/computer/arcade/battle/examine_more(mob/user) + to_chat(user, "Scribbled on the side of the Arcade Machine you notice some writing...\ + \nmagical -> >=50 power\ + \nsmart -> defend, defend, light attack\ + \nshotgun -> defend, defend, power attack\ + \nshort temper -> counter, counter, counter\ + \npoisonous -> light attack, light attack, light attack\ + \nchonker -> power attack, power attack, power attack") + return ..() /obj/machinery/computer/arcade/battle/emag_act(mob/user) . = ..() diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 58d907e14b..60e869815b 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -113,6 +113,26 @@ . = ..() . += "It has [uses ? uses : "no"] charges left." +/obj/item/card/id/examine_more(mob/user) + var/list/msg = list("You examine [src] closer, and note the following...") + + if(mining_points) + msg += "There's [mining_points] mining equipment redemption point\s loaded onto this card." + if(registered_account) + msg += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." + if(registered_account.account_job) + var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) + if(D) + msg += "The [D.account_holder] reports a balance of [D.account_balance] cr." + msg += "Alt-Click the ID to pull money from the linked account in the form of holochips." + msg += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID." + if(registered_account.account_holder == user.real_name) + msg += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number." + else + msg += "There is no registered account linked to this card. Alt-Click to add one." + + return msg + /obj/item/card/emag/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/emagrecharge)) var/obj/item/emagrecharge/ER = W diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index b683ea9934..bcae1d750f 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -619,6 +619,13 @@ if(req_defib) if(defib.healdisk) H.heal_overall_damage(25, 25) + var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) + var/late = timelimit && (tplus > timelimit) + var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + if(policy) + to_chat(H, policy) + H.log_message("revived using a defibrillator, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) if(req_defib) defib.deductcharge(revivecost) cooldown = 1 diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 9b5ca2b066..54824940c1 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -4,6 +4,7 @@ singular_name = "telecrystal" icon = 'icons/obj/telescience.dmi' icon_state = "telecrystal" + grind_results = list(/datum/reagent/telecrystal = 20) w_class = WEIGHT_CLASS_TINY max_amount = 50 item_flags = NOBLUDGEON diff --git a/code/game/say.dm b/code/game/say.dm index 35a1b1d072..a5691ad11f 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -110,6 +110,8 @@ GLOBAL_LIST_INIT(freqtospan, list( /// Quirky citadel proc for our custom sayverbs to strip the verb out. Snowflakey as hell, say rewrite 3.0 when? /atom/movable/proc/quoteless_say_quote(input, list/spans = list(speech_span), message_mode) + if((input[1] == "!") && (length_char(input) > 1)) + return "" var/pos = findtext(input, "*") return pos? copytext(input, pos + 1) : input @@ -144,6 +146,8 @@ GLOBAL_LIST_INIT(freqtospan, list( return "[copytext_char("[freq]", 1, 4)].[copytext_char("[freq]", 4, 5)]" /atom/movable/proc/attach_spans(input, list/spans) + if((input[1] == "!") && (length(input) > 2)) + return var/customsayverb = findtext(input, "*") if(customsayverb) input = capitalize(copytext(input, customsayverb + length(input[customsayverb]))) diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index 81ad7ddc26..89ed669e7b 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -113,8 +113,7 @@ for(var/i in 1 to healseverity) new /obj/effect/temp_visual/heal(targetturf, "#1E8CE1") if(totaldamage) - L.adjustBruteLoss(-brutedamage) - L.adjustFireLoss(-burndamage) + L.heal_overall_damage(brutedamage, burndamage, only_organic = FALSE) //Maybe a machine god shouldn't murder augmented followers instead of healing them L.adjustOxyLoss(-oxydamage) L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE) clockwork_say(ranged_ability_user, text2ratvar("[has_holy_water ? "Heal tainted" : "Mend wounded"] flesh!")) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 13a1803188..ba58769d3e 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -192,6 +192,7 @@ /datum/asset/spritesheet/goonchat/register() InsertAll("emoji", 'icons/emoji.dmi') + InsertAll("emoji", 'icons/emoji_32.dmi') // pre-loading all lanugage icons also helps to avoid meta InsertAll("language", 'icons/misc/language.dmi') diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index d506e5fe02..e230ae55bb 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -198,7 +198,7 @@ //////////////////////////SPACEWIND///////////////////////////// /turf/open/proc/consider_pressure_difference(turf/T, difference) - SSair.high_pressure_delta |= src + SSair.high_pressure_delta[src] = TRUE if(difference > pressure_difference) pressure_direction = get_dir(src, T) pressure_difference = difference @@ -304,7 +304,8 @@ if(!thermal_conductivity) return FALSE - SSair.active_super_conductivity |= src + SSair.active_super_conductivity[src] = TRUE + return TRUE /turf/open/consider_superconductivity(starting) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 120bfbe5e4..a562210164 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -155,3 +155,10 @@ cost = 30 message = "of paperframes" export_types = list(/obj/item/stack/sheet/paperframes) + +/datum/export/stack/telecrystal + unit_name = "raw" + cost = 1000 + message = "telecrystals" + export_types = list(/obj/item/stack/telecrystal) + diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index c181d6fb74..08f9a927c6 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -301,3 +301,36 @@ /obj/item/clothing/head/wizard/fake) crate_name = "wizard costume crate" crate_type = /obj/structure/closet/crate/wooden + +/datum/supply_pack/costumes_toys/wedding + name = "Wedding Crate" + desc = "Tie the knot IN SPACE! Hold your own extravagant wedding with this crate of suits and bridal gowns. Complete with champagne, cake, and the luxurious cost you would expect for an event to remember." + cost = 10000 // weddings are absurdly expensive and so is this crate + contains = list(/obj/item/clothing/under/suit/black_really, //we don't actually need suits since you can vend them but the crate should feel "complete" + /obj/item/clothing/under/suit/black_really, + /obj/item/clothing/under/suit/charcoal, + /obj/item/clothing/under/suit/charcoal, + /obj/item/clothing/under/suit/navy, + /obj/item/clothing/under/suit/navy, + /obj/item/clothing/under/suit/burgundy, + /obj/item/clothing/under/suit/burgundy, // A pair of each "fancy suit" color for variety + /obj/item/clothing/under/suit/white, + /obj/item/clothing/under/suit/white, // white is a weird color for a groom but some people are weird + /obj/item/clothing/under/suit/polychromic, + /obj/item/clothing/under/suit/polychromic, // in case you can't be satisfied with the most fitting choices, of course. + /obj/item/clothing/under/dress/wedding, + /obj/item/clothing/under/dress/wedding, // this is what you actually bought the crate for. You can't get these anywhere else. + /obj/item/clothing/under/dress/wedding/orange, + /obj/item/clothing/under/dress/wedding/orange, + /obj/item/clothing/under/dress/wedding/purple, + /obj/item/clothing/under/dress/wedding/purple, + /obj/item/clothing/under/dress/wedding/blue, + /obj/item/clothing/under/dress/wedding/blue, + /obj/item/clothing/under/dress/wedding/red, + /obj/item/clothing/under/dress/wedding/red, // two of each + /obj/item/reagent_containers/food/drinks/bottle/champagne, //appropriate booze for a wedding + /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake, // we don't have a full wedding cake but this will do + /obj/item/storage/fancy/ringbox/silver, + /obj/item/storage/fancy/ringbox/silver) //diamond rings cost the same price as this crate via cargo so we're not giving you two for free. Wedding rings are traditionally less valuable anyway. + crate_name = "wedding crate" + diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 7f670e756f..7f1ba86ff5 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -119,6 +119,8 @@ /// Messages currently seen by this client var/list/seen_messages + ///A lazy list of atoms we've examined in the last EXAMINE_MORE_TIME (default 1.5) seconds, so that we will call [atom/proc/examine_more()] instead of [atom/proc/examine()] on them when examining + var/list/recent_examines ///When was the last time we warned them about not cryoing without an ahelp, set to -5 minutes so that rounstart cryo still warns var/cryo_warned = -5 MINUTES diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 65e8063ce0..33d32227e1 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -2,7 +2,8 @@ . = text if(!CONFIG_GET(flag/emojis)) return - var/static/list/emojis = icon_states(icon('icons/emoji.dmi')) + var/list/emojis = icon_states(icon('icons/emoji.dmi')) + emojis |= icon_states(icon('icons/emoji_32.dmi')) var/parsed = "" var/pos = 1 var/search = 0 @@ -18,7 +19,7 @@ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat) var/tag = sheet.icon_tag("emoji-[emoji]") if(tag) - parsed += tag + parsed += "[tag]" //evil way of enforcing 16x16 pos = search + length(text[pos]) else parsed += copytext(text, pos, search) @@ -34,7 +35,8 @@ . = text if(!CONFIG_GET(flag/emojis)) return - var/static/list/emojis = icon_states(icon('icons/emoji.dmi')) + var/list/emojis = icon_states(icon('icons/emoji.dmi')) + emojis |= icon_states(icon('icons/emoji_32.dmi')) var/final = "" //only tags are added to this var/pos = 1 var/search = 0 diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index 4a50ccb306..553dd8f309 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -2,7 +2,7 @@ name = "Wisdom cow" typepath = /datum/round_event/wisdomcow max_occurrences = 1 - weight = 20 + weight = 10 /datum/round_event/wisdomcow/announce(fake) priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Nanotrasen Cow Ranching Agency") diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 6d9e141309..ce27dccb74 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -2,18 +2,30 @@ For the main html chat area *********************************/ -//Precaching a bunch of shit +/// Should match the value set in the browser js +#define MAX_COOKIE_LENGTH 5 + +//Precaching a bunch of shit. Someone ship this out of here GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of icons for the browser output -//On client, created on login +//lazy renaming to chat_output, instead renamed to old chatOutput +/** + * The chatOutput datum exists to handle the goonchat browser. + * On client, created on Client/New() + */ /datum/chatOutput - var/client/owner //client ref + /// The client that owns us. + var/client/owner + /// How many times client data has been checked var/total_checks = 0 - var/last_check = 0 - var/loaded = FALSE // Has the client loaded the browser output area? - var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do - var/cookieSent = FALSE // Has the client sent a cookie for analysis - var/broken = FALSE + /// When to next clear the client data checks counter + var/next_time_to_clear = 0 + /// Has the client loaded the browser output area? + var/loaded = FALSE + /// If they haven't loaded chat, this is where messages will go until they do + var/list/messageQueue + var/cookieSent = FALSE // Has the client sent a cookie for analysis + var/broken = FALSE var/list/connectionHistory //Contains the connection history passed from chat cookie var/adminMusicVolume = 25 //This is for the Play Global Sound verb @@ -22,13 +34,18 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico messageQueue = list() connectionHistory = list() +/** + * start: Tries to load the chat browser + * Aborts if a problem is encountered. + * Async because this is called from Client/New. + */ /datum/chatOutput/proc/start() + set waitfor = FALSE //Check for existing chat if(!owner) return FALSE if(!winexists(owner, "browseroutput")) // Oh goddamnit. - set waitfor = FALSE broken = TRUE message_admins("Couldn't start chat for [key_name_admin(owner)]!") . = FALSE @@ -43,6 +60,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico return TRUE +/// Loads goonchat and sends assets. /datum/chatOutput/proc/load() set waitfor = FALSE if(!owner) @@ -53,6 +71,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico owner << browse(file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput") +/// Interprets input from the client. Will send data back if required. /datum/chatOutput/Topic(href, list/href_list) if(usr.client != owner) return TRUE @@ -83,20 +102,22 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if("setMusicVolume") data = setMusicVolume(arglist(params)) - if("colorPresetPost") //User just swapped color presets in their goonchat preferences. Do we do anything else? switch(href_list["preset"]) if("light") owner.force_white_theme() if("dark" || "normal") owner.force_dark_theme() - + // if("swaptodarkmode") + // swaptodarkmode() + // if("swaptolightmode") + // swaptolightmode() if(data) ehjax_send(data = data) -//Called on chat output done-loading by JS. +/// Called on chat output done-loading by JS. /datum/chatOutput/proc/doneLoading() if(loaded) return @@ -113,34 +134,75 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico messageQueue = null sendClientData() + syncRegex() + //do not convert to to_chat() SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.") +/// Hides the standard output and makes the browser visible. /datum/chatOutput/proc/showChat() winset(owner, "output", "is-visible=false") winset(owner, "browseroutput", "is-disabled=false;is-visible=true") +/// Calls syncRegex on all currently owned chatOutput datums +/proc/syncChatRegexes() + for (var/user in GLOB.clients) + var/client/C = user + var/datum/chatOutput/Cchat = C.chatOutput + if (Cchat && !Cchat.broken && Cchat.loaded) + Cchat.syncRegex() + +/// Used to dynamically add regexes to the browser output. Currently only used by the IC filter. +/datum/chatOutput/proc/syncRegex() + var/list/regexes = list() + /* + if (config.ic_filter_regex) + regexes["show_filtered_ic_chat"] = list( + config.ic_filter_regex.name, + "ig", + "$1" + ) + */ + if (regexes.len) + ehjax_send(data = list("syncRegex" = regexes)) + +/// Sends json encoded data to the browser. /datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data) if(islist(data)) data = json_encode(data) C << output("[data]", "[window]:ehjaxCallback") -/datum/chatOutput/proc/sendMusic(music, pitch) +/** + * Sends music data to the browser. If enabled by the browser, it will start playing. + * Arguments: + * music must be a https adress. + * extra_data is a list. The keys "pitch", "start" and "end" are used. + ** "pitch" determines the playback rate + ** "start" determines the start time of the sound + ** "end" determines when the musics stops playing + */ +/datum/chatOutput/proc/sendMusic(music, pitch, list/extra_data) //someone remove pitch if(!findtext(music, GLOB.is_http_protocol)) return var/list/music_data = list("adminMusic" = url_encode(url_encode(music))) - if(pitch) - music_data["musicRate"] = pitch + + if(extra_data?.len) + music_data["musicRate"] = extra_data["pitch"] || pitch + music_data["musicSeek"] = extra_data["start"] + music_data["musicHalt"] = extra_data["end"] + ehjax_send(data = music_data) +/// Stops music playing throw the browser. /datum/chatOutput/proc/stopMusic() ehjax_send(data = "stopMusic") +/// Setter for adminMusicVolume. Sanitizes the value to between 0 and 100. /datum/chatOutput/proc/setMusicVolume(volume = "") if(volume) adminMusicVolume = clamp(text2num(volume), 0, 100) -//Sends client connection details to the chat to handle and save +/// Sends client connection details to the chat to handle and save /datum/chatOutput/proc/sendClientData() //Get dem deets var/list/deets = list("clientData" = list()) @@ -150,11 +212,11 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico var/data = json_encode(deets) ehjax_send(data = data) -//Called by client, sent data to investigate (cookie history so far) +/// Called by client, sent data to investigate (cookie history so far) /datum/chatOutput/proc/analyzeClientData(cookie = "") //Spam check - if(world.time > last_check + (3 SECONDS)) - last_check = world.time + if(world.time > next_time_to_clear) + next_time_to_clear = world.time + (3 SECONDS) total_checks = 0 total_checks += 1 @@ -172,12 +234,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if (connData && islist(connData) && connData.len > 0 && connData["connData"]) connectionHistory = connData["connData"] //lol fuck var/list/found = new() - if(connectionHistory.len > 5) + + if(connectionHistory.len > MAX_COOKIE_LENGTH) message_admins("[key_name(src.owner)] was kicked for an invalid ban cookie)") qdel(owner) return - for(var/i in min(connectionHistory.len, 5) to 1 step -1) + for(var/i in connectionHistory.len to 1 step -1) if(QDELETED(owner)) //he got cleaned up before we were done return @@ -191,45 +254,33 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico //Uh oh this fucker has a history of playing on a banned account!! if (found.len > 0) - //TODO: add a new evasion ban for the CURRENT client details, using the matched row details message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") cookieSent = TRUE -//Called by js client every 60 seconds +/// Called by js client every 60 seconds /datum/chatOutput/proc/ping() return "pong" -//Called by js client on js error +/// Called by js client on js error /datum/chatOutput/proc/debug(error) log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") -//Global chat procs -/proc/to_chat_immediate(target, message, handle_whitespace=TRUE) +/// Global chat proc. to_chat_immediate will circumvent SSchat and send data as soon as possible. +/proc/to_chat_immediate(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE) if(!target || !message) return - //Ok so I did my best but I accept that some calls to this will be for shit like sound and images - //It stands that we PROBABLY don't want to output those to the browser output so just handle them here - if (istype(target, /savefile)) - CRASH("Invalid message! [message]") - - if(!istext(message)) - if (istype(message, /image) || istype(message, /sound)) - CRASH("Invalid message! [message]") - return - if(target == world) target = GLOB.clients var/original_message = message - //Some macros remain in the string even after parsing and fuck up the eventual output - message = replacetext(message, "\improper", "") - message = replacetext(message, "\proper", "") if(handle_whitespace) message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") //EIGHT SPACES IN TOTAL!! + if(trailing_newline) + message += "
" if(islist(target)) // Do the double-encoding outside the loop to save nanoseconds @@ -272,14 +323,19 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. C << output(url_encode(url_encode(message)), "browseroutput:output") -/proc/to_chat(target, message, handle_whitespace = TRUE) +/// Sends a text message to the target. +/proc/to_chat(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE) if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) - to_chat_immediate(target, message, handle_whitespace) + to_chat_immediate(target, message, handle_whitespace, trailing_newline, confidential) return - SSchat.queue(target, message, handle_whitespace) + SSchat.queue(target, message, handle_whitespace, trailing_newline, confidential) -/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) +/// Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) +/datum/chatOutput/proc/swaptolightmode() owner.force_white_theme() +/// Light mode stuff. (See darkmode.dm for documentation) /datum/chatOutput/proc/swaptodarkmode() owner.force_dark_theme() + +#undef MAX_COOKIE_LENGTH diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index 0acb127517..ce51cd8de8 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -38,10 +38,10 @@
- Decrease font size - - Increase font size + - Decrease line height - - Increase line height + + Decrease font size + Increase font size + Decrease line height + Increase line height Toggle ping display Highlight string Save chat log diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 0d53b44ba8..ac30076de4 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -29,12 +29,13 @@ var opts = { 'scrollSnapTolerance': 10, //If within x pixels of bottom 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup 'imageRetryDelay': 50, //how long between attempts to reload images (in ms) - 'imageRetryLimit': 50, //how many attempts should we make? + 'imageRetryLimit': 50, //how many attempts should we make? 'popups': 0, //Amount of popups opened ever 'wasd': false, //Is the user in wasd mode? 'priorChatHeight': 0, //Thing for height-resizing detection 'restarting': false, //Is the round restarting? 'colorPreset': 0, // index in the color presets list. + //'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009??? <- /tg/ take on darktheme //Options menu 'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu @@ -65,14 +66,17 @@ var opts = { 'volumeUpdateDelay': 5000, //Time from when the volume updates to data being sent to the server 'volumeUpdating': false, //True if volume update function set to fire 'updatedVolume': 0, //The volume level that is sent to the server - + 'musicStartAt': 0, //The position the music starts playing + 'musicEndAt': 0, //The position the music... stops playing... if null, doesn't apply (so the music runs through) + 'defaultMusicVolume': 25, 'messageCombining': true, }; +var replaceRegexes = {}; -// Array of names for chat display color presets. +// Array of names for chat display color presets. CIT SPECIFIC. // If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head. var colorPresets = [ 'normal', @@ -84,12 +88,6 @@ function clamp(val, min, max) { return Math.max(min, Math.min(val, max)) } -function outerHTML(el) { - var wrap = document.createElement('div'); - wrap.appendChild(el.cloneNode(true)); - return wrap.innerHTML; -} - //Polyfill for fucking date now because of course IE8 and below don't support it if (!Date.now) { Date.now = function now() { @@ -103,6 +101,7 @@ if (typeof String.prototype.trim !== 'function') { }; } +// CIT SPECIFIC. function updateColorPreset() { var el = $("#colorPresetLink")[0]; el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css"; @@ -172,7 +171,7 @@ function byondDecode(message) { // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. // Marvelous. message = message.replace(/\+/g, "%20"); - try { + try { // This is a workaround for the above not always working when BYOND's shitty url encoding breaks. (byond bug id:2399401) if (decodeURIComponent) { message = decodeURIComponent(message); @@ -185,57 +184,71 @@ function byondDecode(message) { return message; } -//Actually turns the highlight term match into appropriate html -function addHighlightMarkup(match) { - var extra = ''; - if (opts.highlightColor) { - extra += ' style="background-color: '+opts.highlightColor+'"'; +function replaceRegex() { + var selectedRegex = replaceRegexes[$(this).attr('replaceRegex')]; + if (selectedRegex) { + var replacedText = $(this).html().replace(selectedRegex[0], selectedRegex[1]); + $(this).html(replacedText); } - return ''+match+''; + $(this).removeAttr('replaceRegex'); } -//Highlights words based on user settings +// Get a highlight markup span +function createHighlightMarkup() { + var extra = ''; + if (opts.highlightColor) { + extra += ' style="background-color: ' + opts.highlightColor + '"'; + } + return ''; +} + +// Get all child text nodes that match a regex pattern +function getTextNodes(elem, pattern) { + var result = $([]); + $(elem).contents().each(function(idx, child) { + if (child.nodeType === 3 && /\S/.test(child.nodeValue) && pattern.test(child.nodeValue)) { + result = result.add(child); + } + else { + result = result.add(getTextNodes(child, pattern)); + } + }); + return result; +} + +// Highlight all text terms matching the registered regex patterns function highlightTerms(el) { - if (el.children.length > 0) { - for(var h = 0; h < el.children.length; h++){ - highlightTerms(el.children[h]); - } - } + var pattern = new RegExp("(" + opts.highlightTerms.join('|') + ")", 'gi'); + var nodes = getTextNodes(el, pattern); - var hasTextNode = false; - for (var node = 0; node < el.childNodes.length; node++) - { - if (el.childNodes[node].nodeType === 3) - { - hasTextNode = true; - break; - } - } - - if (hasTextNode) { //If element actually has text - var newText = ''; - for (var c = 0; c < el.childNodes.length; c++) { //Each child element - if (el.childNodes[c].nodeType === 3) { //Is it text only? - var words = el.childNodes[c].data.split(' '); - for (var w = 0; w < words.length; w++) { //Each word in the text - var newWord = null; - for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term - if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found - newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup); - break; - } - if (window.console) - console.log(newWord) - } - newText += newWord || words[w].replace("<", "<"); - newText += w >= words.length - 1 ? '' : ' '; - } - } else { //Every other type of element - newText += outerHTML(el.childNodes[c]); + nodes.each(function (idx, node) { + var content = $(node).text(); + var parent = $(node).parent(); + var pre = $(node.previousSibling); + $(node).remove(); + content.split(pattern).forEach(function (chunk) { + // Get our highlighted span/text node + var toInsert = null; + if (pattern.test(chunk)) { + var tmpElem = $(createHighlightMarkup()); + tmpElem.text(chunk); + toInsert = tmpElem; } - } - el.innerHTML = newText; - } + else { + toInsert = document.createTextNode(chunk); + } + + // Insert back into our element + if (pre.length == 0) { + var result = parent.prepend(toInsert); + pre = $(result[0].firstChild); + } + else { + pre.after(toInsert); + pre = $(pre[0].nextSibling); + } + }); + }); } function iconError(E) { @@ -268,41 +281,96 @@ function output(message, flag) { message = byondDecode(message).trim(); - //Stuff we do along with appending a message - var atBottom = false; - var bodyHeight = $('body').height(); - var messagesHeight = $messages.outerHeight(); - var scrollPos = $('body,html').scrollTop(); - - //Should we snap the output to the bottom? - if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { - atBottom = true; - if ($('#newMessages').length) { - $('#newMessages').remove(); - } - //If not, put the new messages box in - } else { - if ($('#newMessages').length) { - var messages = $('#newMessages .number').text(); - messages = parseInt(messages); - messages++; - $('#newMessages .number').text(messages); - if (messages == 2) { - $('#newMessages .messageWord').append('s'); + //The behemoth of filter-code (for Admin message filters) + //Note: This is proooobably hella inefficient + var filteredOut = false; + if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) { + //Get this filter type (defined by class on message) + var messageHtml = $.parseHTML(message), + messageClasses; + if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) { + var internal = false; + messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false); + if (messageClasses) { + for (var i = 0; i < messageClasses.length; i++) { //Every class + if (messageClasses[i] == 'internal') { + internal = true; + break; + } + } + } + if (!internal) { + filteredOut = 'All'; } } else { - $messages.after('1 new message '); + //If the element or it's child have any classes + if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) { + messageClasses = $(messageHtml).attr('class').split(/\s+/); + if (!!$(messageHtml).children().attr('class')) { + messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/)); + } + var tempCount = 0; + for (var i = 0; i < messageClasses.length; i++) { //Every class + var thisClass = messageClasses[i]; + $.each(opts.showMessagesFilters, function(key, val) { //Every filter + if (key !== 'All' && val.show === false && typeof val.match != 'undefined') { + for (var i = 0; i < val.match.length; i++) { + var matchClass = val.match[i]; + if (matchClass == thisClass) { + filteredOut = key; + break; + } + } + } + if (filteredOut) return false; + }); + if (filteredOut) break; + tempCount++; + } + } else { + if (!opts.showMessagesFilters['Misc'].show) { + filteredOut = 'Misc'; + } + } } } + //Stuff we do along with appending a message + var atBottom = false; + if (!filteredOut) { + var bodyHeight = $('body').height(); + var messagesHeight = $messages.outerHeight(); + var scrollPos = $('body,html').scrollTop(); + + //Should we snap the output to the bottom? + if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { + atBottom = true; + if ($('#newMessages').length) { + $('#newMessages').remove(); + } + //If not, put the new messages box in + } else { + if ($('#newMessages').length) { + var messages = $('#newMessages .number').text(); + messages = parseInt(messages); + messages++; + $('#newMessages .number').text(messages); + if (messages == 2) { + $('#newMessages .messageWord').append('s'); + } + } else { + $messages.after('1 new message '); + } + } + } opts.messageCount++; //Pop the top message off if history limit reached - //if (opts.messageCount >= opts.messageLimit) { - //$messages.children('div.entry:first-child').remove(); - //opts.messageCount--; //I guess the count should only ever equal the limit - //} + if (opts.messageCount >= opts.messageLimit) { + $messages.children('div.entry:first-child').remove(); + opts.messageCount--; //I guess the count should only ever equal the limit + } // Create the element - if combining is off, we use it, and if it's on, we // might discard it bug need to check its text content. Some messages vary @@ -323,6 +391,7 @@ function output(message, flag) { badge = $('', {'class': 'r', 'text': 2}); } lastmessages.html(message); + lastmessages.find('[replaceRegex]').each(replaceRegex); lastmessages.append(badge); badge.animate({ "font-size": "0.9em" @@ -340,6 +409,13 @@ function output(message, flag) { //Actually append the message entry.className = 'entry'; + if (filteredOut) { + entry.className += ' hidden'; + entry.setAttribute('data-filter', filteredOut); + } + + $(entry).find('[replaceRegex]').each(replaceRegex); + $last_message = trimmed_message; $messages[0].appendChild(entry); $(entry).find("img.icon").error(iconError); @@ -360,11 +436,11 @@ function output(message, flag) { //Actually do the snap //Stuff we can do after the message shows can go here, in the interests of responsiveness if (opts.highlightTerms && opts.highlightTerms.length > 0) { - highlightTerms(entry); + highlightTerms($(entry)); } } - if (atBottom) { + if (!filteredOut && atBottom) { $('body,html').scrollTop($messages.outerHeight()); } } @@ -408,6 +484,20 @@ function toHex(n) { return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16); } +/* +function swap() { //Swap to darkmode + if (opts.darkmode){ + document.getElementById("sheetofstyles").href = "browserOutput_white.css"; + opts.darkmode = false; + runByond('?_src_=chat&proc=swaptolightmode'); + } else { + document.getElementById("sheetofstyles").href = "browserOutput.css"; + opts.darkmode = true; + runByond('?_src_=chat&proc=swaptodarkmode'); + } + setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365); +} +*/ function handleClientData(ckey, ip, compid) { //byond sends player info to here var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid}; @@ -488,6 +578,7 @@ function ehjaxCallback(data) { } else if (data.adminMusic) { if (typeof data.adminMusic === 'string') { var adminMusic = byondDecode(data.adminMusic); + var bindLoadedData = false; adminMusic = adminMusic.match(/https?:\/\/\S+/) || ''; if (data.musicRate) { var newRate = Number(data.musicRate); @@ -497,9 +588,32 @@ function ehjaxCallback(data) { } else { $('#adminMusic').prop('defaultPlaybackRate', 1.0); } + if (data.musicSeek) { + opts.musicStartAt = Number(data.musicSeek) || 0; + bindLoadedData = true; + } else { + opts.musicStartAt = 0; + } + if (data.musicHalt) { + opts.musicEndAt = Number(data.musicHalt) || null; + bindLoadedData = true; + } + if (bindLoadedData) { + $('#adminMusic').one('loadeddata', adminMusicLoadedData); + } $('#adminMusic').prop('src', adminMusic); $('#adminMusic').trigger("play"); } + } else if (data.syncRegex) { + for (var i in data.syncRegex) { + + var regexData = data.syncRegex[i]; + var regexName = regexData[0]; + var regexFlags = regexData[1]; + var regexReplaced = regexData[2]; + + replaceRegexes[i] = [new RegExp(regexName, regexFlags), regexReplaced]; + } } } } @@ -530,6 +644,27 @@ function sendVolumeUpdate() { } } +function adminMusicEndCheck(event) { + if (opts.musicEndAt) { + if ($('#adminMusic').prop('currentTime') >= opts.musicEndAt) { + $('#adminMusic').off(event); + $('#adminMusic').trigger('pause'); + $('#adminMusic').prop('src', ''); + } + } else { + $('#adminMusic').off(event); + } +} + +function adminMusicLoadedData(event) { + if (opts.musicStartAt && ($('#adminMusic').prop('duration') === Infinity || (opts.musicStartAt <= $('#adminMusic').prop('duration'))) ) { + $('#adminMusic').prop('currentTime', opts.musicStartAt); + } + if (opts.musicEndAt) { + $('#adminMusic').on('timeupdate', adminMusicEndCheck); + } +} + function subSlideUp() { $(this).removeClass('scroll'); $(this).css('height', ''); @@ -608,23 +743,32 @@ $(function() { * ******************************************/ var savedConfig = { - 'sfontSize': getCookie('fontsize'), - 'slineHeight': getCookie('lineheight'), + fontsize: getCookie('fontsize'), //no need for compatabiliy, cookie name is the same + lineheight: getCookie('lineheight'), 'spingDisabled': getCookie('pingdisabled'), 'shighlightTerms': getCookie('highlightterms'), 'shighlightColor': getCookie('highlightcolor'), 'smusicVolume': getCookie('musicVolume'), 'smessagecombining': getCookie('messagecombining'), + 'sdarkmode': getCookie('darkmode'), 'scolorPreset': getCookie('colorpreset'), }; - if (savedConfig.sfontSize) { - $messages.css('font-size', savedConfig.sfontSize); - internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal'); + if (savedConfig.fontsize) { + $messages.css('font-size', savedConfig.fontsize); + internalOutput('Loaded font size setting of: '+savedConfig.fontsize+'', 'internal'); } - if (savedConfig.slineHeight) { - $("body").css('line-height', savedConfig.slineHeight); - internalOutput('Loaded line height setting of: '+savedConfig.slineHeight+'', 'internal'); + if (savedConfig.lineheight) { + $("body").css('line-height', savedConfig.lineheight); + internalOutput('Loaded line height setting of: '+savedConfig.lineheight+'', 'internal'); + } + // if(savedConfig.sdarkmode == 'true'){ + // swap(); + // } + if (savedConfig.scolorPreset) { + opts.colorPreset = Number(savedConfig.scolorPreset); + updateColorPreset(); + internalOutput('Loaded color preset of: '+colorPresets[opts.colorPreset]+'', 'internal'); } if (savedConfig.spingDisabled) { if (savedConfig.spingDisabled == 'true') { @@ -634,15 +778,11 @@ $(function() { internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal'); } if (savedConfig.shighlightTerms) { - var savedTerms = $.parseJSON(savedConfig.shighlightTerms); - var actualTerms = ''; - for (var i = 0; i < savedTerms.length; i++) { - if (savedTerms[i]) { - actualTerms += savedTerms[i] + ', '; - } - } + var savedTerms = $.parseJSON(savedConfig.shighlightTerms).filter(function (entry) { + return entry !== null && /\S/.test(entry); + }); + var actualTerms = savedTerms.length != 0 ? savedTerms.join(', ') : null; if (actualTerms) { - actualTerms = actualTerms.substring(0, actualTerms.length - 2); internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal'); opts.highlightTerms = savedTerms; } @@ -651,13 +791,6 @@ $(function() { opts.highlightColor = savedConfig.shighlightColor; internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); } - - if (savedConfig.scolorPreset) { - opts.colorPreset = Number(savedConfig.scolorPreset); - updateColorPreset(); - internalOutput('Loaded color preset of: '+colorPresets[opts.colorPreset]+'', 'internal'); - } - if (savedConfig.smusicVolume) { var newVolume = clamp(savedConfig.smusicVolume, 0, 100); $('#adminMusic').prop('volume', newVolume / 100); @@ -669,7 +802,7 @@ $(function() { else{ $('#adminMusic').prop('volume', opts.defaultMusicVolume / 100); } - + if (savedConfig.smessagecombining) { if (savedConfig.smessagecombining == 'false') { opts.messageCombining = false; @@ -746,76 +879,17 @@ $(function() { href = escaper(href); runByond('?action=openLink&link='+href); } + runByond('byond://winset?mapwindow.map.focus=true'); }); - //Fuck everything about this event. Will look into alternatives. $('body').on('keydown', function(e) { if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') { return; } - if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix. return; } - - e.preventDefault() - - var k = e.which; - // Hardcoded because else there would be no feedback message. - if (k == 113) { // F2 - runByond('byond://winset?screenshot=auto'); - internalOutput('Screenshot taken', 'internal'); - } - - var c = ""; - switch (k) { - case 8: - c = 'BACK'; - case 9: - c = 'TAB'; - case 13: - c = 'ENTER'; - case 19: - c = 'PAUSE'; - case 27: - c = 'ESCAPE'; - case 33: // Page up - c = 'NORTHEAST'; - case 34: // Page down - c = 'SOUTHEAST'; - case 35: // End - c = 'SOUTHWEST'; - case 36: // Home - c = 'NORTHWEST'; - case 37: - c = 'WEST'; - case 38: - c = 'NORTH'; - case 39: - c = 'EAST'; - case 40: - c = 'SOUTH'; - case 45: - c = 'INSERT'; - case 46: - c = 'DELETE'; - case 93: // That weird thing to the right of alt gr. - c = 'APPS'; - - default: - c = String.fromCharCode(k); - } - - if (c.length == 0) { - if (!e.shiftKey) { - c = c.toLowerCase(); - } - runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c); - return false; - } else { - runByond('byond://winset?mapwindow.map.focus=true'); - return false; - } + runByond('byond://winset?mapwindow.map.focus=true'); }); //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll) @@ -843,6 +917,9 @@ $(function() { $('#toggleOptions').click(function(e) { handleToggleClick($subOptions, $(this)); }); + // $('#darkmodetoggle').click(function(e) { + // swap(); + // }); $('#toggleAudio').click(function(e) { handleToggleClick($subAudio, $(this)); }); @@ -856,41 +933,31 @@ $(function() { }); $('#decreaseFont').click(function(e) { - var fontSize = parseInt($messages.css('font-size')); - fontSize = fontSize - 1 + 'px'; - $messages.css({'font-size': fontSize}); - setCookie('fontsize', fontSize, 365); - internalOutput('Font size set to '+fontSize+'', 'internal'); + savedConfig.fontsize = Math.max(parseInt(savedConfig.fontsize || 13) - 1, 1) + 'px'; + $messages.css({'font-size': savedConfig.fontsize}); + setCookie('fontsize', savedConfig.fontsize, 365); + internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal'); }); $('#increaseFont').click(function(e) { - var fontSize = parseInt($messages.css('font-size')); - fontSize = fontSize + 1 + 'px'; - $messages.css({'font-size': fontSize}); - setCookie('fontsize', fontSize, 365); - internalOutput('Font size set to '+fontSize+'', 'internal'); + savedConfig.fontsize = (parseInt(savedConfig.fontsize || 13) + 1) + 'px'; + $messages.css({'font-size': savedConfig.fontsize}); + setCookie('fontsize', savedConfig.fontsize, 365); + internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal'); }); $('#decreaseLineHeight').click(function(e) { - var Heightline = parseFloat($("body").css('line-height')); - var Sizefont = parseFloat($("body").css('font-size')); - var lineheightvar = Heightline / Sizefont - lineheightvar -= 0.1; - lineheightvar = lineheightvar.toFixed(1) - $("body").css({'line-height': lineheightvar}); - setCookie('lineheight', lineheightvar, 365); - internalOutput('Line height set to '+lineheightvar+'', 'internal'); + savedConfig.lineheight = Math.max(parseFloat(savedConfig.lineheight || 1.2) - 0.1, 0.1).toFixed(1); + $("body").css({'line-height': savedConfig.lineheight}); + setCookie('lineheight', savedConfig.lineheight, 365); + internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal'); }); $('#increaseLineHeight').click(function(e) { - var Heightline = parseFloat($("body").css('line-height')); - var Sizefont = parseFloat($("body").css('font-size')); - var lineheightvar = Heightline / Sizefont - lineheightvar += 0.1; - lineheightvar = lineheightvar.toFixed(1) - $("body").css({'line-height': lineheightvar}); - setCookie('lineheight', lineheightvar, 365); - internalOutput('Line height set to '+lineheightvar+'', 'internal'); + savedConfig.lineheight = (parseFloat(savedConfig.lineheight || 1.2) + 0.1).toFixed(1); + $("body").css({'line-height': savedConfig.lineheight}); + setCookie('lineheight', savedConfig.lineheight, 365); + internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal'); }); $('#togglePing').click(function(e) { @@ -908,13 +975,13 @@ $(function() { // Requires IE 10+ to issue download commands. Just opening a popup // window will cause Ctrl+S to save a blank page, ignoring innerHTML. if (!window.Blob) { - output('This function is only supported on IE 10+. Upgrade if possible.', 'internal'); + output('This function is only supported on IE 10 and up. Upgrade if possible.', 'internal'); return; } $.ajax({ type: 'GET', - url: 'browserOutput.css', + url: 'browserOutput.css', // browserOutput_white.css success: function(styleData) { var blob = new Blob(['Chat Log', $messages.html(), '']); @@ -958,20 +1025,12 @@ $(function() { $('body').on('submit', '#highlightTermForm', function(e) { e.preventDefault(); - var count = 0; - while (count < opts.highlightLimit) { + opts.highlightTerms = []; + for (var count = 0; count < opts.highlightLimit; count++) { var term = $('#highlightTermInput'+count).val(); - if (term) { - term = term.trim(); - if (term === '') { - opts.highlightTerms[count] = null; - } else { - opts.highlightTerms[count] = term.toLowerCase(); - } - } else { - opts.highlightTerms[count] = null; + if (term !== null && /\S/.test(term)) { + opts.highlightTerms.push(term.trim().toLowerCase()); } - count++; } var color = $('#highlightColor').val(); @@ -992,8 +1051,8 @@ $(function() { $messages.empty(); opts.messageCount = 0; }); - - $('#changeColorPreset').click(function() { + + $('#changeColorPreset').click(function() { //CIT SPECIFIC opts.colorPreset = (opts.colorPreset+1) % colorPresets.length; updateColorPreset(); setCookie('colorpreset', opts.colorPreset, 365); @@ -1026,9 +1085,9 @@ $(function() { }); $('img.icon').error(iconError); - - - + + + /***************************************** * diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 0579c23120..22431f9978 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -36,8 +36,9 @@ return FALSE return ..() -/mob/living/carbon/human/experience_pressure_difference() - playsound(src, 'sound/effects/space_wind.ogg', 50, 1) +/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0, throw_target) + if(prob(pressure_difference * 2.5)) + playsound(src, 'sound/effects/space_wind.ogg', 50, 1) if(shoes && istype(shoes, /obj/item/clothing)) var/obj/item/clothing/S = shoes if (S.clothing_flags & NOSLIP) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index f3dca33bcf..60cf81582e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -86,12 +86,24 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE, MODE_TERROR_SPIDER = TRUE) //skyrat change var/talk_key = get_key(message) - var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE, MODE_SING = TRUE) // Skyrat edit: MODE_SING + var/static/list/one_character_prefix = list(MODE_HEADSET = TRUE, MODE_ROBOT = TRUE, MODE_WHISPER = TRUE, MODE_SING = TRUE) + + var/ic_blocked = FALSE + /* + if(client && !forced && config.ic_filter_regex && findtext(message, config.ic_filter_regex)) + //The filter doesn't act on the sanitized message, but the raw message. + ic_blocked = TRUE + */ if(sanitize) message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) if(!message || message == "") return + if(ic_blocked) + //The filter warning message shows the sanitized message though. + to_chat(src, "That message contained a word prohibited in IC chat! Consider reviewing the server rules.\n\"[message]\"") + return + var/datum/saymode/saymode = SSradio.saymodes[talk_key] var/message_mode = get_message_mode(message) var/original_message = message diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ba9cdfda64..4ad97a9f84 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -198,7 +198,7 @@ desc = "Known for its wisdom, shares it with all" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/wisdomcow = 1) //truly the best meat gold_core_spawnable = FALSE - speak_chance = 30 //the cow is eager to share its wisdom! + speak_chance = 10 //the cow is eager to share its wisdom! //but is wise enough to not lag the server too bad milk_reagent = /datum/reagent/medicine/liquid_wisdom /mob/living/simple_animal/cow/wisdom/Initialize() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c7394c9f97..c4594de86b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -297,8 +297,14 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA . = view(dist, src) SEND_SIGNAL(src, COMSIG_MOB_FOV_VIEW, .) -//mob verbs are faster than object verbs. See https://secure.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() -/mob/verb/examinate(atom/A as mob|obj|turf in fov_view()) //It used to be oview(12), but I can't really say why +/** + * Examine a mob + * + * mob verbs are faster than object verbs. See + * [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716) + * for why this isn't atom/verb/examine() + */ +/mob/verb/examinate(atom/A as mob|obj|turf in view()) //It used to be oview(12), but I can't really say why set name = "Examine" set category = "IC" @@ -306,18 +312,63 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA // shift-click catcher may issue examinate() calls for out-of-sight turfs return - if(is_blind(src)) + if(is_blind()) to_chat(src, "Something is there but you can't see it!") return face_atom(A) - var/flags = SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) - if(flags & COMPONENT_DENY_EXAMINATE) - if(flags & COMPONENT_EXAMINATE_BLIND) - to_chat(src, "Something is there but you can't see it!") - return - var/list/result = A.examine(src) + var/list/result + if(client) + LAZYINITLIST(client.recent_examines) + if(isnull(client.recent_examines[A]) || client.recent_examines[A] < world.time) + result = A.examine(src) + client.recent_examines[A] = world.time + EXAMINE_MORE_TIME // set the value to when the examine cooldown ends + RegisterSignal(A, COMSIG_PARENT_QDELETING, .proc/clear_from_recent_examines, override=TRUE) // to flush the value if deleted early + addtimer(CALLBACK(src, .proc/clear_from_recent_examines, A), EXAMINE_MORE_TIME) + handle_eye_contact(A) + else + result = A.examine_more(src) + else + result = A.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist? + to_chat(src, result.Join("\n")) + SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) + +/mob/proc/clear_from_recent_examines(atom/A) + if(!client) + return + UnregisterSignal(A, COMSIG_PARENT_QDELETING) + LAZYREMOVE(client.recent_examines, A) + +/** + * handle_eye_contact() is called when we examine() something. If we examine an alive mob with a mind who has examined us in the last second within 5 tiles, we make eye contact! + * + * Note that if either party has their face obscured, the other won't get the notice about the eye contact + * Also note that examine_more() doesn't proc this or extend the timer, just because it's simpler this way and doesn't lose much. + * The nice part about relying on examining is that we don't bother checking visibility, because we already know they were both visible to each other within the last second, and the one who triggers it is currently seeing them + */ +/mob/proc/handle_eye_contact(mob/living/examined_mob) + return + +/mob/living/handle_eye_contact(mob/living/examined_mob) + if(!istype(examined_mob) || src == examined_mob || examined_mob.stat >= UNCONSCIOUS || !client || !examined_mob.client?.recent_examines || !(src in examined_mob.client.recent_examines)) + return + + if(get_dist(src, examined_mob) > EYE_CONTACT_RANGE) + return + + var/mob/living/carbon/examined_carbon = examined_mob + // check to see if their face is blocked (or if they're not a carbon, in which case they can't block their face anyway) + if(!istype(examined_carbon) || (!(examined_carbon.wear_mask && examined_carbon.wear_mask.flags_inv & HIDEFACE) && !(examined_carbon.head && examined_carbon.head.flags_inv & HIDEFACE))) + if(SEND_SIGNAL(src, COMSIG_MOB_EYECONTACT, examined_mob, TRUE) != COMSIG_BLOCK_EYECONTACT) + var/msg = "You make eye contact with [examined_mob]." + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, src, msg), 3) // so the examine signal has time to fire and this will print after + + var/mob/living/carbon/us_as_carbon = src // i know >casting as subtype, but this isn't really an inheritable check + if(!istype(us_as_carbon) || (!(us_as_carbon.wear_mask && us_as_carbon.wear_mask.flags_inv & HIDEFACE) && !(us_as_carbon.head && us_as_carbon.head.flags_inv & HIDEFACE))) + if(SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT) + var/msg = "[src] makes eye contact with you." + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, examined_mob, msg), 3) //same as above //note: ghosts can point, this is intended diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 49c987bc62..78e2b63955 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -50,12 +50,16 @@ usr.emote("me",1,message,TRUE) /mob/say_mod(input, message_mode) + if(message_mode == MODE_WHISPER_CRIT) + return ..() + if((input[1] == "!") && (length_char(input) > 1)) + message_mode = MODE_CUSTOM_SAY + return copytext_char(input, 2) var/customsayverb = findtext(input, "*") - if(customsayverb && message_mode != MODE_WHISPER_CRIT) + if(customsayverb) message_mode = MODE_CUSTOM_SAY return lowertext(copytext_char(input, 1, customsayverb)) - else - return ..() + return ..() /proc/uncostumize_say(input, message_mode) . = input diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index aed3ff5848..4afc2f1d5b 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -96,6 +96,9 @@ else . += "You're too far away to read it!" +/obj/item/paper/examine_more(mob/user) + ui_interact(user) + /obj/item/paper/proc/show_content(mob/user) user.examinate(src) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 0f53add567..b9da8271ab 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -928,10 +928,18 @@ M.adjustOxyLoss(-20, 0) M.adjustToxLoss(-20, 0) M.updatehealth() + var/tplus = world.time - M.timeofdeath if(M.revive()) M.grab_ghost() M.emote("gasp") log_combat(M, M, "revived", src) + var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) + var/late = timelimit && (tplus > timelimit) + var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + if(policy) + to_chat(M, policy) + M.log_message("revived using strange reagent, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 96ce50895e..988441fa2b 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1154,6 +1154,13 @@ /mob/living/proc/bluespace_shuffle() do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) +/datum/reagent/telecrystal + name = "Telecrystal Dust" + description = "A blood-red dust comprised of something that was much more useful when it was intact." + reagent_state = SOLID + color = "#660000" // rgb: 102, 0, 0. + taste_description = "contraband" + /datum/reagent/aluminium name = "Aluminium" description = "A silvery white and ductile member of the boron group of chemical elements." diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index dd36af9b32..c61ee330e6 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -60,6 +60,7 @@ playsound(get_turf(target), 'sound/magic/lightningbolt.ogg', 50, 1) target.adjustOxyLoss(-50, 0) target.updatehealth() + var/tplus = world.time - target.timeofdeath if(target.revive()) user.visible_message("...[target] wakes up, alive and aware!", "IT'S ALIVE!") target.visible_message("...[target] wakes up, alive and aware!") @@ -68,6 +69,13 @@ for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life! if(O.organ_flags & ORGAN_FAILING) O.applyOrganDamage(-5) + var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) + var/late = timelimit && (tplus > timelimit) + var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + if(policy) + to_chat(target, policy) + target.log_message("revived using surgical revival, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) return TRUE else user.visible_message("...[target.p_they()] convulses, then lies still.") diff --git a/config/config.txt b/config/config.txt index f45ce6b7a3..30415b0210 100644 --- a/config/config.txt +++ b/config/config.txt @@ -8,6 +8,7 @@ $include donator_groupings.txt $include dynamic_config.txt $include plushies/defines.txt $include job_threats.txt +$include policy.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: diff --git a/config/in_character_filter.txt b/config/in_character_filter.txt new file mode 100644 index 0000000000..46df3fd60c --- /dev/null +++ b/config/in_character_filter.txt @@ -0,0 +1,7 @@ +############################################################################################### +# Words that will block in character chat messages from sending. # +# Case is not important. Commented-out examples are listed below, just remove the "#". # +############################################################################################### +#lol +#omg +#wtf \ No newline at end of file diff --git a/config/policy.txt b/config/policy.txt new file mode 100644 index 0000000000..610acd2be8 --- /dev/null +++ b/config/policy.txt @@ -0,0 +1,13 @@ +## Policy configuration +## Current valid keys are: +## ON_CLONE - displayed after a successful cloning operation to the cloned person +## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold +## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold +## +## EXAMPLE: +## POLICYCONFIG ON_CLONE insert text here span classes are fully supported + +## Misc entries for above + +## Defib time limit for "cloning memory disorder" memory loss in seconds +# DEFIB_CMD_TIME_LIMIT 300 diff --git a/html/changelogs/AutoChangeLog-pr-12594.yml b/html/changelogs/AutoChangeLog-pr-12594.yml new file mode 100644 index 0000000000..8b64b6657a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12594.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - rscadd: "You can now \"audibly emote\" by having ! at the start of a sentence." diff --git a/html/changelogs/AutoChangeLog-pr-12624.yml b/html/changelogs/AutoChangeLog-pr-12624.yml new file mode 100644 index 0000000000..8b25a0121f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12624.yml @@ -0,0 +1,5 @@ +author: "silicons" +delete-after: True +changes: + - config: "policy configuration added, plus support hooks for assisting enforcement of clone memory disorder. +logging: added logging of revival by defib, cloning, strangereagent, and revival surgery" diff --git a/html/changelogs/AutoChangeLog-pr-12711.yml b/html/changelogs/AutoChangeLog-pr-12711.yml new file mode 100644 index 0000000000..ee0e8f2b05 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12711.yml @@ -0,0 +1,4 @@ +author: "LetterN" +delete-after: True +changes: + - bugfix: "bye xss" diff --git a/html/changelogs/AutoChangeLog-pr-12713.yml b/html/changelogs/AutoChangeLog-pr-12713.yml new file mode 100644 index 0000000000..80476cfdfe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12713.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - rscdel: "Removes northern tunnel to the monastery on Pubby" diff --git a/html/changelogs/AutoChangeLog-pr-12714.yml b/html/changelogs/AutoChangeLog-pr-12714.yml new file mode 100644 index 0000000000..5e3d26d38c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12714.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - balance: "Sentinels compromise now heals augmented bodyparts." diff --git a/html/changelogs/AutoChangeLog-pr-12715.yml b/html/changelogs/AutoChangeLog-pr-12715.yml new file mode 100644 index 0000000000..60475eef85 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12715.yml @@ -0,0 +1,5 @@ +author: "HeroWithYay" +delete-after: True +changes: + - rscadd: "Added Telecrystal Dust" + - tweak: "Telecrystals can be sold at cargo" diff --git a/html/changelogs/AutoChangeLog-pr-12716.yml b/html/changelogs/AutoChangeLog-pr-12716.yml new file mode 100644 index 0000000000..7c5d2a844f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12716.yml @@ -0,0 +1,4 @@ +author: "LetterN" +delete-after: True +changes: + - rscadd: "Added d[thing] emojis" diff --git a/html/changelogs/AutoChangeLog-pr-12717.yml b/html/changelogs/AutoChangeLog-pr-12717.yml new file mode 100644 index 0000000000..82be1b122b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12717.yml @@ -0,0 +1,4 @@ +author: "Yakumo Chen" +delete-after: True +changes: + - rscadd: "Adds a wedding crate to cargo full of wedding attire." diff --git a/html/changelogs/AutoChangeLog-pr-12720.yml b/html/changelogs/AutoChangeLog-pr-12720.yml new file mode 100644 index 0000000000..eb8847118d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12720.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "due to recent biological advancements, you can now make eye contact with people." diff --git a/html/changelogs/AutoChangeLog-pr-12722.yml b/html/changelogs/AutoChangeLog-pr-12722.yml new file mode 100644 index 0000000000..26ee0b36f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12722.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - tweak: "wisdom cow is half as common and is wise enough to lag the server 66% less" diff --git a/html/changelogs/AutoChangeLog-pr-12725.yml b/html/changelogs/AutoChangeLog-pr-12725.yml new file mode 100644 index 0000000000..bebf6eec55 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12725.yml @@ -0,0 +1,10 @@ +author: "EmeraldSundisk" +delete-after: True +changes: + - rscadd: "Adds turnstiles to CogStation's security wing" + - rscadd: "Readds robotics to the Corpse Disposal Network" + - rscadd: "Readds chemistry's ability to send items directly to the experimentation lab" + - tweak: "Visual renovation and slight adjustments to CogStation's robotics lab" + - tweak: "Slight visual adjustments elsewhere (the library)" + - bugfix: "CogStation's mail and disposal pipes are once again complete" + - bugfix: "CogStation's robotics lab now has spawners, lights, and other room essentials" diff --git a/html/changelogs/AutoChangeLog-pr-12732.yml b/html/changelogs/AutoChangeLog-pr-12732.yml new file mode 100644 index 0000000000..f16fdd56c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12732.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - bugfix: "a singular stray pixel" diff --git a/icons/emoji_32.dmi b/icons/emoji_32.dmi new file mode 100644 index 0000000000..44b36a35e4 Binary files /dev/null and b/icons/emoji_32.dmi differ diff --git a/icons/mob/clothing/mask_muzzled.dmi b/icons/mob/clothing/mask_muzzled.dmi index 0a10f1edbe..a1404cfbce 100644 Binary files a/icons/mob/clothing/mask_muzzled.dmi and b/icons/mob/clothing/mask_muzzled.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 7fd57696c8..dbf8a1b49f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -268,6 +268,7 @@ #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" #include "code\controllers\configuration\entries\plushies.dm" +#include "code\controllers\configuration\entries\policy.dm" #include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm"