diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm index f8d701debe..2d66300953 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm @@ -71,8 +71,9 @@ /turf/closed/wall/r_wall, /area/engine/engineering) "di" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, /area/engine/engineering) "dl" = ( /obj/structure/cable{ @@ -304,12 +305,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/engineering) "kH" = ( @@ -523,6 +518,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/structure/sign/warning/enginesafety{ + pixel_x = 32 + }, /turf/open/floor/plasteel, /area/engine/engineering) "qv" = ( @@ -543,7 +541,13 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/engine/engineering) "qN" = ( /obj/structure/table/reinforced, @@ -848,6 +852,10 @@ /obj/machinery/igniter{ id = "TEG_igniter" }, +/mob/living/carbon/monkey{ + name = "Mumkey Jones" + }, +/obj/item/clothing/head/hardhat/atmos, /turf/open/floor/engine/vacuum, /area/engine/engineering) "An" = ( @@ -882,14 +890,6 @@ /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 1 }, -/obj/machinery/camera{ - c_tag = "TEG - North Center"; - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engine/engineering) "AX" = ( @@ -1042,12 +1042,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"EI" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/plasteel, -/area/engine/engineering) "EL" = ( /turf/closed/wall, /area/engine/engineering) @@ -1082,6 +1076,11 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/engine/engineering) +"Fs" = ( +/obj/structure/rack, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/engine/engineering) "FG" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 10 @@ -1218,11 +1217,6 @@ /turf/open/floor/plasteel, /area/engine/engineering) "Jd" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, /obj/machinery/atmospherics/pipe/manifold/orange/visible, /turf/open/floor/plasteel, /area/engine/engineering) @@ -1312,15 +1306,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/engineering) "LD" = ( @@ -1372,6 +1357,7 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 4 }, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/engineering) "Nz" = ( @@ -1429,12 +1415,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, -/obj/machinery/airalarm{ - dir = 1; - locked = 0; - pixel_y = -22 - }, /obj/machinery/light, +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/engine/engineering) "Pz" = ( @@ -1452,6 +1436,9 @@ /obj/machinery/light{ dir = 1 }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, /turf/open/floor/plasteel, /area/engine/engineering) "PK" = ( @@ -1522,12 +1509,11 @@ /turf/open/space, /area/space/nearstation) "Rl" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/engineering) "Rz" = ( @@ -1602,7 +1588,13 @@ /turf/open/floor/plating, /area/engine/engineering) "TE" = ( -/obj/structure/closet/crate/internals, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, /turf/open/floor/plasteel, /area/engine/engineering) "TH" = ( @@ -1648,6 +1640,10 @@ dir = 4 }, /obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera{ + c_tag = "TEG - North Center"; + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/engineering) "Uq" = ( @@ -1671,18 +1667,15 @@ /area/engine/engineering) "UT" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /turf/open/floor/plasteel, /area/engine/engineering) "UY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/airalarm{ + pixel_y = 23 + }, /turf/open/floor/plasteel, /area/engine/engineering) "Vi" = ( @@ -1811,10 +1804,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/obj/structure/extinguisher_cabinet{ - dir = 4; - pixel_y = -27 - }, /turf/open/floor/plasteel, /area/engine/engineering) "YC" = ( @@ -1837,9 +1826,10 @@ /turf/open/floor/plasteel, /area/engine/engineering) "YP" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/item/pipe_dispenser, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engine/engineering) "YQ" = ( @@ -1878,7 +1868,9 @@ /turf/open/floor/plasteel, /area/engine/engineering) "Zu" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, /obj/machinery/meter, /turf/open/floor/plasteel, /area/engine/engineering) @@ -1887,13 +1879,6 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engine/engineering) "ZC" = ( @@ -2170,7 +2155,7 @@ iD MP MP MP -ij +MP yX qn qn @@ -2251,11 +2236,11 @@ ME QS uB Ok -Ok -Ok +di +di Ok Bz -Zu +lI Wc Ok zG @@ -2307,8 +2292,8 @@ iP wk go fF -EI -EI +UT +UT sn qc Nh @@ -2367,7 +2352,7 @@ KA KA Ok dZ -bO +Zu ev tl qb @@ -2477,7 +2462,7 @@ IP Zs sD Jd -EL +YP YG AX PK @@ -2505,7 +2490,7 @@ SX ou vG Zv -di +Xe qJ Lw Xe @@ -2595,7 +2580,7 @@ PK Dv Dv bO -YP +sH As yN yN @@ -2651,7 +2636,7 @@ eh zx XW ST -Ok +Fs MP tw tw diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 264fdb1058..c0b4e6a88a 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -1257,6 +1257,16 @@ /turf/open/floor/plating, /area/maintenance/fore/secondary) "acV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solar/port/fore) +"acW" = ( /obj/structure/cable{ icon_state = "0-2" }, @@ -1266,11 +1276,6 @@ }, /turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) -"acW" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/fore) "acX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -1489,7 +1494,12 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/fore) -"adu" = ( +"adw" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solar/port/fore) +"adx" = ( /obj/structure/cable{ icon_state = "4-8" }, @@ -1502,56 +1512,17 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) -"adv" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/fore) -"adw" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/fore) -"adx" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/fore) "ady" = ( /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/port/fore) -"adz" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/solar/port/fore) "adA" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/structure/cable, +/obj/machinery/power/solar{ + id = "auxsolareast"; + name = "Port Auxiliary Solar Array" }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/lattice/catwalk, -/turf/open/space, +/turf/open/floor/plasteel/airless/solarpanel, /area/solar/port/fore) "adB" = ( /obj/structure/cable{ @@ -1817,12 +1788,11 @@ /turf/open/space, /area/solar/starboard/fore) "adZ" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "auxsolareast"; - name = "Port Auxiliary Solar Array" +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plasteel/airless/solarpanel, +/obj/structure/lattice/catwalk, +/turf/open/space, /area/solar/port/fore) "aea" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, @@ -5054,12 +5024,16 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "ajq" = ( -/obj/structure/lattice/catwalk, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/space, -/area/solar/port/fore) +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) "ajr" = ( /obj/structure/table/wood, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -5417,16 +5391,12 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "ajW" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/maintenance/solars/port/fore) +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solar/port/fore) "ajX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -6668,15 +6638,17 @@ /area/security/courtroom) "amv" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plating, -/area/maintenance/solars/starboard/fore) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solar/port/fore) "amw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -8572,13 +8544,15 @@ /turf/open/floor/plasteel, /area/security/processing) "aqJ" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/solar/port/fore) "aqK" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel, @@ -42345,15 +42319,9 @@ /turf/open/floor/plasteel, /area/science/circuit) "bXv" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/stack/rods, +/turf/open/space, +/area/space) "bXw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, @@ -45067,7 +45035,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/engine/engineering) +/area/engine/atmos) "cez" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, @@ -45521,9 +45489,12 @@ /turf/open/floor/plasteel, /area/engine/engineering) "cfK" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall, -/area/engine/engineering) +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/port/fore) "cfL" = ( /obj/machinery/firealarm{ pixel_y = 24 @@ -46323,18 +46294,11 @@ /turf/open/floor/plating, /area/maintenance/solars/port/aft) "chO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" + req_access_txt = "13" }, /turf/open/floor/plating, -/area/maintenance/solars/port/aft) +/area/maintenance/fore/secondary) "chP" = ( /obj/structure/cable{ icon_state = "4-8" @@ -49352,15 +49316,16 @@ /turf/open/space, /area/maintenance/aft) "csg" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access_txt = "10;13" + name = "Solar Maintenance"; + req_access_txt = "10; 13" }, /turf/open/floor/plating, -/area/engine/engineering) +/area/maintenance/solars/starboard/fore) "csi" = ( /obj/structure/transit_tube/curved/flipped{ dir = 1 @@ -51153,13 +51118,10 @@ /turf/open/floor/plasteel, /area/security/processing) "cxW" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/lattice, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "cxY" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 1"; @@ -51258,14 +51220,13 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "cyC" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ + name = "External Access"; req_access_txt = "13" }, /turf/open/floor/plating, -/area/maintenance/starboard) +/area/maintenance/port/fore) "cyD" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -51287,15 +51248,13 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cyG" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ - name = "Atmospherics External Airlock"; - req_access_txt = "24" + name = "External Access"; + req_access_txt = "13" }, /turf/open/floor/plating, -/area/engine/atmos) +/area/maintenance/starboard/fore) "cyK" = ( /obj/structure/cable{ icon_state = "4-8" @@ -51341,18 +51300,14 @@ /turf/open/space/basic, /area/space) "cyU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 + dir = 8 }, /obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" + req_access_txt = "13" }, /turf/open/floor/plating, -/area/maintenance/solars/starboard/aft) +/area/maintenance/starboard) "czg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -52258,10 +52213,9 @@ /turf/open/space, /area/space/nearstation) "cCS" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) +/turf/closed/wall/r_wall, +/area/engine/atmos) "cCT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -52328,12 +52282,15 @@ /turf/closed/wall, /area/engine/engineering) "cDY" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 }, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "cDZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -53612,6 +53569,11 @@ dir = 8 }, /area/crew_quarters/fitness/pool) +"dCt" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "dCV" = ( /obj/structure/cable{ icon_state = "1-4" @@ -54280,6 +54242,12 @@ }, /turf/open/floor/plasteel, /area/security/range) +"fty" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) "ftE" = ( /obj/item/radio/intercom{ pixel_y = 25 @@ -54838,10 +54806,6 @@ dir = 8 }, /area/medical/sleeper) -"haL" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "haM" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -55122,6 +55086,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"imk" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "imH" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -55417,6 +55388,10 @@ }, /turf/open/floor/wood, /area/crew_quarters/bar) +"jiK" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall, +/area/engine/engineering) "jjC" = ( /obj/structure/table/wood, /obj/item/toy/cards/deck, @@ -56729,6 +56704,19 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/maintenance/bar) +"mQp" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) "mQS" = ( /obj/machinery/light{ dir = 8; @@ -58858,14 +58846,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/pool) "tAH" = ( -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "tCa" = ( /obj/structure/table/wood, /obj/item/instrument/guitar{ @@ -58888,6 +58872,19 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"tEK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) "tHh" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/tile/red, @@ -59258,7 +59255,7 @@ "uDO" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, /turf/open/space, /area/solar/port/fore) @@ -60002,6 +59999,16 @@ /obj/machinery/holopad, /turf/open/floor/plasteel/showroomfloor, /area/security/main) +"wmu" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) "woR" = ( /obj/machinery/cryopod{ dir = 1 @@ -60161,6 +60168,16 @@ /obj/item/hand_labeler, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wWi" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/turf/open/floor/plating, +/area/engine/atmos) "wWT" = ( /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel/white, @@ -67551,7 +67568,7 @@ gXs gXs gJi gJi -haL +gXs aag gJi aaa @@ -68305,7 +68322,7 @@ aaa aaa aaa aae -ktS +aaa gXs aaa aaa @@ -68562,7 +68579,7 @@ aaa aaa aaa aaa -ktS +aaa gXs aaa aaa @@ -68819,7 +68836,7 @@ aaa aaa aaa aaa -ktS +aaa gXs aaa aaa @@ -69076,7 +69093,7 @@ aaa aaa aaa aaa -ktS +aaa gXs aaa cqq @@ -69333,7 +69350,7 @@ aaf aaf aaf aaa -ktS +aaa arB asE cyb @@ -73695,11 +73712,11 @@ aaa aae aaa aaa -aaa aag alU alU alU +alU aCW amC asK @@ -73952,9 +73969,9 @@ aaa aaa aaa aaa -aaa aag -aqJ +cyC +amC amC gLH ase @@ -74209,7 +74226,7 @@ aaa aaa aaa aaa -aaa +gJi alU alU alU @@ -74958,7 +74975,6 @@ aaa aaa aaa aaa -aaa aaS aaS aaS @@ -74977,6 +74993,7 @@ aaS aaf aaf aaf +aaf aaa aaa aaa @@ -75215,7 +75232,6 @@ aaa aaa aaa aaa -aaa abY aaa aaf @@ -75228,7 +75244,7 @@ acy aaa aaf aaa -aiS +bXv aaa aaS aaa @@ -75237,6 +75253,7 @@ aaa aaa aaa aaa +aaa alU aoR apO @@ -75472,25 +75489,25 @@ aaa aaa aaa aaa -aaa abY aaa +acW acV -adv -adZ +adA aaa +acW acV -adv -adZ +adA aaa +acW acV -adv -adZ +adA aaa aaS aaf aaf aaf +aaf aaa aaa aaa @@ -75726,23 +75743,22 @@ aaa aaa aaa aaa -aaa aae aaa aaa abY aaf -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA aaf aaf aaa @@ -75751,6 +75767,7 @@ aaa aaa aaa aaa +aaa alU alU alU @@ -75986,20 +76003,19 @@ aaa aaa aaa aaa -aaa abY aaa -acV -adu -adZ +acW +adx +adA aaf -acV -adu -adZ +acW +adx +adA aaf -acV -adu -adZ +acW +adx +adA aaa aaf aaa @@ -76008,6 +76024,7 @@ aaa aaa aaa aaa +aaa aaf aaa ali @@ -76243,20 +76260,20 @@ aaa aaa aaa aaa -aaa aaf aaf -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA +aaf aaf aaf aaf @@ -76497,26 +76514,26 @@ aaa aaa aaa aaa -aaa aaS aaS aaS aaf aaa -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA aaa -acV -adu -adZ +acW +adx +adA aaa aaf aaa +aaa ajV alR alR @@ -76754,27 +76771,27 @@ aaa aaa aaa aaa -aaa aaS aaa aaf aaa aaa aaa -adw +adZ aaa aaa aaa -adw +adZ aaa aaa aaa -adw +adZ aaa aaa ajV ajV ajV +ajV alQ amy ang @@ -77011,13 +77028,12 @@ aaa aaa aaa aaa -aaa aaS aaf abs abZ abZ -acW +adw ady ady ady @@ -77027,9 +77043,10 @@ ady ady ady ady +cfK uDO ajq -ajW +akB akB alh alT @@ -77268,27 +77285,27 @@ aaa aaa aaa aaa -aaa aaS aaa aaf aaa aaa aaa -adx +ajW aaa aaa aaa -adx +ajW aaa aaa aaa -adx +ajW aaa aaa ajV ajV ajV +ajV alS amz anh @@ -77525,26 +77542,26 @@ aaa aaa aaa aaa -aaa aaS aba aaS aaf aaa -acV -adz -adZ +acW +amv +adA aaa -acV -adz -adZ +acW +amv +adA aaa -acV -adz -adZ +acW +amv +adA aaa aaf aaa +aaa ajV alR alR @@ -77785,22 +77802,22 @@ aaa aaa aaa aaa +aaf +aaf +acW +amv +adA aaa -aaf -aaf -acV -adz -adZ +acW +amv +adA aaa -acV -adz -adZ +acW +amv +adA +aaf +aaf aaa -acV -adz -adZ -aaf -aaf aaa aaa aaa @@ -78042,24 +78059,24 @@ aaa aaa aaa aaa -aaa aaS aaa -acV -adz -adZ +acW +amv +adA aaf -acV -adz -adZ +acW +amv +adA aaf -acV -adz -adZ +acW +amv +adA aaa aaf aaf aaf +aaf gXs alU alF @@ -78299,25 +78316,25 @@ aaa aaa aaa aaa -aaa aaS aaf -acV -adz -adZ +acW +amv +adA aaa -acV -adz -adZ +acW +amv +adA aaa -acV -adz -adZ +acW +amv +adA aaf aaf aaa aaa aaa +aaa alU alU ank @@ -78556,22 +78573,22 @@ aaa aaa aaa aaa +aaS +aaa +acW +aqJ +adA +aaa +acW +aqJ +adA +aaa +acW +aqJ +adA aaa aaS aaa -acV -adA -adZ -aaa -acV -adA -adZ -aaa -acV -adA -adZ -aaa -aaS aaa aaa aaa @@ -78658,9 +78675,9 @@ aaf aaa aaf aaa -aaa +aaf hrF -aaa +aaf aaa aaf aaa @@ -78813,7 +78830,6 @@ aaa aaa aaa aaa -aaa aaS aaa aaf @@ -78831,6 +78847,7 @@ aaa aaS aaf aaf +aaf gXs alU amC @@ -78915,9 +78932,9 @@ aaf aaf aaf aaf -aaf -hrF -aaf +cfx +tEK +cfx aaf aaf aaf @@ -79070,7 +79087,6 @@ aaa aaa aaa aaa -aaa aaS aaS aaS @@ -79089,6 +79105,7 @@ aaS aaa aaa aaa +aaa alU amE ann @@ -79173,7 +79190,7 @@ aaf aaa aaa cfx -chO +chN cfx aaa aaf @@ -79421,8 +79438,8 @@ caf aoV aag aaf -aaa -aaa +gXs +gXs aaf aaa aaa @@ -79675,9 +79692,9 @@ bLv bCq aoV cbj -aoV -aag -aaf +bLv +cDY +bLv aaf bCq bCq @@ -79933,7 +79950,7 @@ bCq bCq cbj bLv -bXv +bHE bLv aaf bCq @@ -79949,7 +79966,7 @@ ciQ cfw aaa aaa -aaa +gXs aaf aaf aaa @@ -80204,9 +80221,9 @@ cgC chR ciS cfw -aaa -aaa -aaa +aag +aag +aag aaa aaf aaf @@ -80461,9 +80478,9 @@ cgB chQ ciR cfw -aag -aag -aag +bCq +cDY +bCq aaa aaa aaf @@ -80719,7 +80736,7 @@ chS cfw cfw bCq -bXv +bHE bCq aaa aaa @@ -90215,7 +90232,7 @@ bUE bWM bXJ bMK -bMK +bYH bYH bYH bVg @@ -92531,10 +92548,10 @@ bWQ bWQ caD bWQ -ccw -ccw +bLK +bLK cey -ccw +bLK ccw ccw ccw @@ -92810,14 +92827,14 @@ ckF cpE cjR crW -csg +ciZ +wmu aag aaa aaa aaa aaa aaa -aaa ctv ctv ctv @@ -93067,14 +93084,14 @@ crw cjO ccw crX -cfK +ciZ +jiK aag aaa aaa aaa aaa aaa -aaa aaT aaT aaT @@ -93325,7 +93342,7 @@ cjm ccw ccw cig -aag +cig aag aag aag @@ -95003,10 +95020,10 @@ aaa aaa aaa aaa -aaa acw abp abp +abp adR abp lJC @@ -95259,10 +95276,10 @@ aaa aaa aaa aaa -aaa aaf aag acU +anF adr sXy aeC @@ -95517,12 +95534,12 @@ aaa aaa aaa aaa -aaa aag abp abp abp abp +abp mxn abp abp @@ -96045,7 +96062,7 @@ aaa ahn ahn ahn -tAH +anF ahn eMs anG @@ -96301,8 +96318,8 @@ aaa aaa aaa aaa -gJi -gJi +ahn +chO ahn ahn khB @@ -96390,10 +96407,10 @@ bQA bPj bOh cCQ -bLK -cyG -bLK -aoV +cCS +chg +cCS +aaf aoV aoV aaf @@ -96558,8 +96575,8 @@ aaa aaa aaa aaa -aaa -aaa +gJi +gJi dFX wWW dqb @@ -96646,21 +96663,21 @@ cbI ccC cdD bOh -cCG +cCQ cCS +wWi cCS -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cCI -cDY +aaa +aaa +aaa +gXs +aaa +aaa +aaa +aaa +aaa +aaa +cCQ aaf aaf aaf @@ -96903,21 +96920,21 @@ cbH ccB cbH bOh -aaf -aaa -aoV -aaf -aoV -aoV -aoV -aaf -aoV -aoV -aoV -aoV -aoV -aoV -gXs +cCG +tAH +dCt +fty +dCt +dCt +dCt +fty +dCt +dCt +dCt +dCt +dCt +dCt +imk aoV aaa aaa @@ -97161,11 +97178,11 @@ ccD cbH bOh aaf -aaf -aaf -aaf -aaf -aoV +aaa +aaa +aaa +aaa +aaa aoV aaf aoV @@ -100424,7 +100441,7 @@ aaa aaa aaa aaa -aaa +gXs aaf aaf alO @@ -100680,8 +100697,8 @@ aaa aaa aaa aaa -aaa -aag +gJi +alO alO arp alO @@ -100937,9 +100954,9 @@ aaa aaa aaa aaa -aaa -aag -cxW +gJi +cyG +anf anf aqv ayf @@ -101194,10 +101211,10 @@ aaf aaf aaf aaf -aaf -aag +cxW alO anf +anf alO mAH jaF @@ -101703,7 +101720,7 @@ aaa aaa aaf aaa -aaa +amw amw amw amw @@ -101960,8 +101977,8 @@ eaR jIs jIs jIs -acx -amv +csg +ane ane cxN aog @@ -102217,7 +102234,7 @@ aaa aaa aaf aaa -aaa +amw amw amw amw @@ -110535,7 +110552,7 @@ cmw cnj cnj cnj -aaa +cnj aaa aaf aaa @@ -110742,7 +110759,7 @@ aaf aaf aaf bky -cyC +btp bns boF bqe @@ -110791,8 +110808,8 @@ clx cmv cnk cnK -cyU -cpi +cnK +mQp cpi cpi cqJ @@ -110997,9 +111014,9 @@ aQE aNa aaa aaf -aaa -aaf -aaa +gXs +bky +cyU bns boF bqe @@ -111049,7 +111066,7 @@ cmx cnj cnj cnj -aaa +cnj aaa aaf aaa @@ -111254,7 +111271,7 @@ afE aNa aaa aaa -aaa +gXs aaf aaa bns @@ -112836,7 +112853,7 @@ aaa aaa aaf cNW -cPI +cOe cNW aaf aaf @@ -113092,9 +113109,9 @@ aaa aaa aaa aaf -aag -aag -aag +cNW +cPI +cNW aaf aaa aaa @@ -113348,11 +113365,11 @@ aaa aaa aaa aaa -aaa -aaa +gXs aag -aaa -aaa +aag +aag +gXs aaa aaa aaa @@ -113607,7 +113624,7 @@ aaa aaa aaa aaa -aaf +aag aaa aaa aaa diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index 8bf6d0e32b..3c64b9f6ad 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -1848,9 +1848,6 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/obj/machinery/light_switch{ - pixel_y = -24 - }, /turf/open/floor/plasteel/dark, /area/crew_quarters/observatory) "aez" = ( @@ -2177,6 +2174,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/light_switch{ + pixel_x = 24 + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/observatory) "afl" = ( @@ -2722,10 +2722,6 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/camera{ - c_tag = "Observatory Viewing Area"; - dir = 4 - }, /obj/machinery/light/small{ dir = 8 }, @@ -2882,7 +2878,6 @@ /turf/closed/wall/r_wall, /area/security/processing) "agX" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable{ icon_state = "1-2" }, @@ -3188,6 +3183,9 @@ /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "ahL" = ( @@ -3327,15 +3325,12 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/observatory) "aif" = ( -/obj/machinery/firealarm{ - pixel_y = 26 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aig" = ( @@ -4175,22 +4170,11 @@ /turf/open/floor/plasteel, /area/construction/secondary) "akg" = ( -/obj/machinery/power/solar_control{ - dir = 4; - id = "foreport"; - name = "Port Bow Solar Control" - }, -/obj/structure/sign/warning/electricshock{ - pixel_x = -32 - }, /obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" }, /turf/open/floor/plating, -/area/maintenance/solars/port) +/area/maintenance/solars/starboard/fore) "akh" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -4200,14 +4184,16 @@ /turf/open/floor/plating, /area/construction/secondary) "akj" = ( -/obj/structure/chair{ - dir = 8 - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/door/airlock/external{ + name = "Starboard Bow Solar Exterior Airlock"; + req_access_txt = "10;13" + }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, -/area/maintenance/solars/port) +/area/maintenance/solars/starboard/fore) "akk" = ( /obj/item/stack/tile/plasteel{ pixel_x = 10; @@ -4365,18 +4351,12 @@ /turf/open/floor/plasteel, /area/security/warden) "akz" = ( -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/solars/port) +/turf/open/floor/plasteel, +/area/router/service) "akA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -4483,17 +4463,8 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "akN" = ( -/obj/structure/plasticflaps, -/obj/structure/fans/tiny, -/obj/machinery/door/poddoor/preopen{ - id = "secblock"; - name = "Security Router" - }, -/obj/machinery/conveyor/auto{ - id = "sec" - }, -/turf/open/floor/plating, -/area/router/sec) +/turf/open/space/basic, +/area/router/aux) "akO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6200,12 +6171,20 @@ /turf/open/floor/grass, /area/hydroponics) "aoJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/visible, -/obj/machinery/space_heater, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/obj/machinery/firealarm{ + pixel_y = 26 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "aoK" = ( /turf/closed/wall/r_wall, /area/router/service) @@ -6300,7 +6279,7 @@ /obj/machinery/conveyor{ id = "serv_off" }, -/obj/machinery/door/poddoor/preopen{ +/obj/machinery/door/poddoor{ id = "servblock"; name = "Service Router" }, @@ -6309,7 +6288,7 @@ "aoT" = ( /obj/structure/plasticflaps, /obj/structure/fans/tiny, -/obj/machinery/door/poddoor/preopen{ +/obj/machinery/door/poddoor{ id = "servblock"; name = "Service Router" }, @@ -6336,16 +6315,16 @@ /turf/open/floor/plasteel, /area/security/brig) "aoW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/external/glass{ - name = "Port Bow Solars External Access"; - req_access_txt = "10;13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/machinery/power/solar_control{ + dir = 4; + id = "foreport"; + name = "Port Bow Solar Control" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plating, /area/maintenance/solars/port) @@ -7340,12 +7319,19 @@ /turf/open/floor/plasteel, /area/security/brig) "arr" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 +/obj/machinery/light/small{ + dir = 1; + light_color = "#ffc1c1" + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/chair{ + dir = 8 }, -/obj/item/stock_parts/cell/high/plus, /turf/open/floor/plating, /area/maintenance/solars/port) "ars" = ( @@ -7779,10 +7765,16 @@ /turf/open/floor/plasteel, /area/security/prison) "asl" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/camera{ - c_tag = "Port Bow Solar Maintenance"; - dir = 1 +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external/glass{ + name = "Port Bow Solars External Access"; + req_access_txt = "10;13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/solars/port) @@ -7996,12 +7988,18 @@ name = "Canister Storage" }) "asH" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 +/obj/machinery/camera{ + c_tag = "Port Bow Solar Maintenance"; + dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 }, /turf/open/floor/plating, /area/maintenance/solars/port) @@ -8241,12 +8239,16 @@ /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/kitchen) "atn" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 8 }, -/obj/machinery/door/airlock/external, -/turf/open/floor/plasteel, -/area/router/service) +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/maintenance/solars/port) "ato" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -8607,7 +8609,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/item/toy/cards/deck, /turf/open/floor/plasteel, /area/crew_quarters/bar) @@ -10456,13 +10458,11 @@ /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) "aya" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 }, -/obj/machinery/camera{ - c_tag = "AI Core Exterior"; - dir = 1 +/obj/structure/cable{ + icon_state = "2-4" }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -15009,13 +15009,19 @@ /turf/open/floor/plasteel/stairs/medium, /area/hallway/secondary/entry) "aHa" = ( -/obj/structure/disposalpipe/junction/yjunction, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 8 +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/locker"; + dir = 8; + name = "Locker Room APC"; + pixel_x = -24 }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/port/fore) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "aHb" = ( /obj/structure/chair, /obj/machinery/firealarm{ @@ -15103,19 +15109,19 @@ }, /area/chapel/main) "aHj" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/door/airlock/external{ - name = "Starboard Bow Solar Exterior Airlock"; - req_access_txt = "10;13" +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, -/turf/open/floor/plating, -/area/maintenance/solars/starboard/fore) +/turf/open/floor/plasteel, +/area/tcommsat/computer) "aHk" = ( /obj/structure/chair{ dir = 4 @@ -15163,12 +15169,12 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "aHp" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/port/fore) +/turf/open/floor/plating, +/area/maintenance/fore) "aHq" = ( /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment, @@ -15271,13 +15277,14 @@ /area/bridge) "aHE" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/turf/open/floor/plating, +/area/tcommsat/computer) "aHF" = ( /turf/open/floor/plasteel/dark, /area/bridge) @@ -15841,12 +15848,16 @@ /turf/open/floor/carpet/royalblue, /area/bridge) "aIJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Fore Maintenance"; + req_one_access_txt = "12;46" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, /area/hallway/primary/port/fore) "aIK" = ( /obj/structure/table/wood, @@ -16804,7 +16815,7 @@ /area/bridge) "aKw" = ( /obj/structure/table, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/item/toy/cards/deck, /obj/structure/disposalpipe/segment{ dir = 4 @@ -17089,13 +17100,22 @@ /turf/open/floor/plating, /area/maintenance/fore) "aLc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Central Maintenance"; - req_one_access_txt = "12" +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/hallway/primary/port/fore) "aLd" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, @@ -17721,14 +17741,16 @@ /turf/closed/wall, /area/maintenance/department/chapel) "aMo" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "1-4" }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) "aMp" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/orange/hidden, @@ -17880,18 +17902,15 @@ }, /area/chapel/main) "aMG" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/obj/machinery/camera{ - c_tag = "Central Starboard Maintenance"; - dir = 8; - pixel_y = -22 - }, -/mob/living/simple_animal/hostile/retaliate/bat, -/turf/open/floor/plating, -/area/maintenance/starboard/central) +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) "aMH" = ( /obj/structure/cable{ icon_state = "2-8" @@ -19880,9 +19899,16 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/fitness/cogpool) "aQS" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plating, -/area/maintenance/central) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port/fore) "aQT" = ( /obj/machinery/door/airlock/engineering{ name = "Thermo-Electric Generator"; @@ -20966,19 +20992,18 @@ /turf/open/floor/plasteel, /area/security/brig) "aTh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light{ +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external/glass{ + name = "Telecommunications External Access"; + req_access_txt = "61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/machinery/power/apc{ - name = "AI Upload Foyer APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/turf/open/floor/plating, +/area/tcommsat/computer) "aTi" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -22384,6 +22409,18 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/department/eva) +"aWr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Central Maintenance"; + req_one_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/hallway/primary/port/fore) "aWs" = ( /obj/machinery/light{ dir = 8; @@ -22411,16 +22448,10 @@ /turf/open/floor/plating, /area/maintenance/central) "aWu" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/fitness/cogpool"; - dir = 4; - name = "Pool APC"; - pixel_x = 24 - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/central) "aWv" = ( @@ -22778,18 +22809,18 @@ /turf/open/floor/wood, /area/library) "aXf" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/structure/table/wood, +/obj/machinery/photocopier, /obj/machinery/light{ dir = 1; - light_color = "#c1caff" + light_color = "#e8eaff" }, -/turf/open/floor/carpet, -/area/library) +/obj/item/paper/fluff/cogstation/eva, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) "aXg" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/wood, -/area/library) +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "aXh" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible{ dir = 6 @@ -22837,6 +22868,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"aXm" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 1 + }, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) "aXn" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -22876,6 +22913,15 @@ "aXr" = ( /turf/open/floor/plasteel, /area/ai_monitored/storage/eva) +"aXs" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/tcommsat/computer) "aXt" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/securearea, @@ -23872,35 +23918,20 @@ /turf/closed/wall, /area/lawoffice) "aZz" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/lattice, +/obj/machinery/camera{ + c_tag = "Routing Depot - Fore Exterior"; dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/dark, -/area/lawoffice) +/turf/open/space/basic, +/area/maintenance/department/eva) "aZA" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/computer/card{ dir = 8 }, +/obj/item/paper/guides/cogstation/job_changes, /turf/open/floor/plasteel/dark, -/area/lawoffice) +/area/security/checkpoint/customs) "aZB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23920,7 +23951,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/book/manual/wiki/security_space_law, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/window/reinforced/spawner/north, /turf/open/floor/plasteel/dark, /area/lawoffice) "aZD" = ( @@ -23977,13 +24010,21 @@ /turf/open/floor/plasteel, /area/hallway/secondary/civilian) "aZI" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/landmark/start/lawyer, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/window/northleft{ + name = "Law Office Counter"; + req_access_txt = "38" + }, /turf/open/floor/plasteel/dark, /area/lawoffice) "aZJ" = ( @@ -24385,13 +24426,21 @@ /turf/open/floor/wood, /area/library) "baz" = ( -/obj/machinery/photocopier, -/obj/machinery/light{ - dir = 1; - light_color = "#e8eaff" +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/book/manual/wiki/security_space_law, +/obj/structure/window/reinforced/spawner/north, /turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/area/lawoffice) "baA" = ( /obj/structure/filingcabinet/chestdrawer, /obj/item/folder/blue, @@ -24424,10 +24473,12 @@ /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "baE" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/structure/bookcase/random/reference, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/wood, +/turf/open/floor/plasteel/dark, /area/library) "baF" = ( /obj/structure/chair/office/dark{ @@ -24976,18 +25027,21 @@ /turf/open/floor/plating, /area/security/checkpoint/customs) "bbQ" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32; - pixel_y = 32 +/obj/structure/cable{ + icon_state = "0-2" }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/fitness/cogpool"; + dir = 4; + name = "Pool APC"; + pixel_x = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/turf/open/floor/plating, +/area/maintenance/central) "bbR" = ( /obj/structure/closet/crate/hydroponics, /obj/effect/turf_decal/tile/green, @@ -25236,11 +25290,17 @@ /turf/closed/wall/r_wall, /area/science/mixing) "bcz" = ( -/obj/machinery/computer/card{ - dir = 8 +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/newscaster{ + pixel_x = -30 }, /turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/area/lawoffice) "bcA" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -26085,9 +26145,21 @@ /turf/open/floor/plasteel, /area/quartermaster/office) "beC" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/item/radio/off, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/tcommsat/computer) "beD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -26110,13 +26182,16 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "beG" = ( -/obj/structure/lattice, -/obj/machinery/camera{ - c_tag = "Routing Depot - Fore Exterior"; +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/lawyer, +/obj/structure/chair/stool, +/turf/open/floor/plasteel/dark, +/area/lawoffice) "beH" = ( /obj/structure/window/reinforced/spawner/east, /obj/machinery/light{ @@ -27393,19 +27468,16 @@ /turf/open/floor/wood, /area/medical/medbay/lobby) "bhy" = ( -/obj/structure/closet/crate/science, -/obj/item/stack/sheet/metal/ten, -/obj/item/stack/sheet/glass/five, -/obj/item/stack/rods/twentyfive, -/obj/item/target/syndicate, -/obj/item/target/alien, -/obj/item/target, -/obj/item/target/clown, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 10 +/obj/structure/plasticflaps, +/obj/structure/fans/tiny, +/obj/machinery/conveyor/auto{ + id = "sec" }, -/turf/open/floor/plasteel, -/area/science/mixing) +/obj/machinery/door/poddoor{ + name = "Security Router" + }, +/turf/open/floor/plating, +/area/router/sec) "bhz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ @@ -27774,8 +27846,15 @@ /turf/open/floor/plating, /area/quartermaster/storage) "bim" = ( -/turf/open/space/basic, -/area/space/nearstation) +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/massdriver{ + id = "router_in"; + name = "mass driver button (Router)"; + pixel_x = 24; + pixel_y = -8 + }, +/turf/open/floor/plating, +/area/maintenance/disposal) "bin" = ( /obj/machinery/computer/mecha{ dir = 4 @@ -30316,6 +30395,18 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"bnl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) "bnm" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 4 @@ -30587,9 +30678,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bnS" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness/cogpool) "bnT" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, @@ -30706,17 +30799,17 @@ /turf/open/floor/plasteel, /area/ai_monitored/nuke_storage) "bof" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/machinery/door/airlock/external/glass{ name = "Pool Exterior Access"; req_access_txt = "13" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/space/basic, /area/crew_quarters/fitness/cogpool) "bog" = ( /obj/machinery/light{ @@ -31910,7 +32003,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/item/storage/pill_bottle/dice, +/obj/item/storage/box/dice, /obj/item/toy/cards/deck, /turf/open/floor/plasteel/white/corner{ dir = 1 @@ -32817,19 +32910,9 @@ /turf/open/floor/plasteel/stairs/left, /area/hydroponics) "bsx" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/external{ - name = "Recycler Exterior Access"; - req_one_access_txt = "13;50" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal) +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/crew_quarters/fitness/cogpool) "bsy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -33235,21 +33318,9 @@ /turf/open/floor/plating, /area/maintenance/aft) "btw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/department/eva) +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/turf/open/floor/plating/airless, +/area/router) "btx" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -33867,9 +33938,18 @@ /area/janitor) "bvb" = ( /obj/structure/disposalpipe/segment, -/obj/effect/landmark/blobstart, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/engineering{ + name = "Electrical Substation"; + req_access_txt = "10" + }, +/obj/structure/fans/tiny, /turf/open/floor/plating, -/area/maintenance/starboard/central) +/area/engine/storage_shared{ + name = "Electrical Substation" + }) "bvc" = ( /obj/machinery/computer/cargo/request, /obj/machinery/airalarm{ @@ -34166,17 +34246,13 @@ /turf/open/floor/plasteel, /area/crew_quarters/bar) "bvM" = ( -/obj/machinery/door/airlock/external/glass{ - name = "External Construction Access"; - req_one_access_txt = "10;31" +/obj/structure/lattice, +/obj/machinery/camera{ + c_tag = "Routing Depot - Aft Exterior"; + pixel_x = 22 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel, -/area/quartermaster/warehouse) +/turf/open/space/basic, +/area/router) "bvN" = ( /obj/machinery/atmospherics/components/binary/valve/digital/on{ dir = 4 @@ -34423,10 +34499,13 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "bwp" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-8" +/obj/structure/disposalpipe/segment{ + dir = 6 }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plating, /area/maintenance/starboard/central) "bwq" = ( @@ -34650,6 +34729,20 @@ }, /turf/open/floor/plating, /area/router) +"bwM" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "Central Starboard Maintenance"; + dir = 8; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/mob/living/simple_animal/hostile/retaliate/bat, +/turf/open/floor/plating, +/area/maintenance/starboard/central) "bwN" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -34883,21 +34976,30 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) "bxm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/tcommsat/computer) -"bxn" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-8" }, -/turf/open/floor/plasteel, -/area/tcommsat/computer) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/department/eva) +"bxn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/camera{ + c_tag = "AI Core Exterior"; + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/maintenance/department/eva) "bxo" = ( /obj/machinery/door/airlock/external{ name = "Telecommunications External Access"; @@ -34921,11 +35023,16 @@ /turf/open/floor/plating, /area/maintenance/department/chapel) "bxq" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plating, -/area/tcommsat/computer) +/area/maintenance/starboard/central) "bxr" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple, @@ -34955,18 +35062,13 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bxt" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Telecommunications External Access"; - req_access_txt = "61" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 }, /turf/open/floor/plating, -/area/tcommsat/computer) +/area/maintenance/disposal) "bxu" = ( /obj/structure/rack, /obj/item/circuitboard/machine/telecomms/broadcaster, @@ -35124,18 +35226,15 @@ /turf/open/floor/plasteel, /area/tcommsat/computer) "bxK" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, /turf/open/floor/plasteel, -/area/tcommsat/computer) +/area/maintenance/disposal) "bxL" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -35428,32 +35527,29 @@ /turf/open/floor/plasteel, /area/router/eva) "byt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"byu" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/central) +"byv" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/camera{ c_tag = "Central Starboard Exterior Access" }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) -"byu" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "Central Starboard Exterior Access"; - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) -"byv" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/starboard/central) "byw" = ( @@ -35815,11 +35911,11 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "bzp" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/maintenance/solars/starboard/fore) +/area/maintenance/disposal) "bzq" = ( /obj/machinery/light{ dir = 8 @@ -36136,14 +36232,19 @@ /turf/open/floor/plasteel, /area/gateway) "bAd" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Central Starboard Exterior Access"; + req_access_txt = "13" }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 + dir = 4 }, /turf/open/floor/plating, /area/maintenance/starboard/central) @@ -36375,6 +36476,15 @@ /area/medical/medbay/zone2{ name = "Medbay Treatment Center" }) +"bAz" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) "bAA" = ( /obj/structure/lattice, /obj/structure/cable{ @@ -36532,6 +36642,19 @@ /area/medical/medbay/zone2{ name = "Medbay Treatment Center" }) +"bAN" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/fragile, +/obj/item/clothing/head/helmet/space/fragile, +/obj/item/tank/internals/air, +/obj/item/flashlight, +/obj/machinery/airalarm{ + dir = 1; + locked = 0; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/central) "bAO" = ( /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -37527,12 +37650,20 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/morgue) "bDb" = ( -/mob/living/simple_animal/mouse/white{ - desc = "Wubba lubba dub dub."; - name = "Rick" +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/plasteel/showroomfloor, -/area/medical/morgue) +/obj/machinery/door/airlock/external{ + name = "Recycler Exterior Access"; + req_one_access_txt = "13;50" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal) "bDc" = ( /obj/machinery/vending/security, /obj/structure/disposalpipe/segment, @@ -38158,16 +38289,20 @@ }, /area/crew_quarters/heads/captain) "bEr" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/locker"; - dir = 8; - name = "Locker Room APC"; - pixel_x = -24 +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32; + pixel_y = 32 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) "bEs" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/tile/yellow{ @@ -38355,9 +38490,15 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/bar) "bEK" = ( -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/machinery/space_heater, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/engineering{ + name = "Engine Room" + }) "bEL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38591,9 +38732,19 @@ /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai) "bFg" = ( -/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/machinery/suit_storage_unit/engine, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, /turf/open/floor/plasteel, -/area/quartermaster/miningoffice) +/area/engine/engineering{ + name = "Engine Room" + }) "bFh" = ( /obj/effect/turf_decal/tile/brown, /obj/machinery/light, @@ -39046,23 +39197,9 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bFY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/noticeboard{ - pixel_y = 28 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/obj/structure/lattice/catwalk, +/turf/closed/wall/r_wall, +/area/engine/atmos) "bFZ" = ( /obj/machinery/chem_heater, /turf/open/floor/plasteel/white, @@ -39247,14 +39384,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bGu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Fore Maintenance"; - req_one_access_txt = "12;46" +/obj/structure/cable{ + icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plating, -/area/hallway/primary/port/fore) +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "bGv" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -39621,20 +39759,15 @@ /turf/open/floor/plasteel, /area/security/main) "bHi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port/fore) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "bHj" = ( /obj/structure/table, /obj/structure/bedsheetbin/towel, @@ -40740,7 +40873,11 @@ /obj/machinery/airalarm{ pixel_y = 24 }, -/turf/open/floor/wood, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/library) "bJD" = ( /obj/machinery/disposal/bin{ @@ -40891,15 +41028,11 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bJU" = ( -/obj/effect/turf_decal/tile/brown, -/obj/machinery/light{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningoffice) +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet/restrooms) "bJV" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1; @@ -41361,7 +41494,11 @@ /area/science/robotics/lab) "bKR" = ( /obj/structure/bookcase/random/religion, -/turf/open/floor/wood, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/library) "bKS" = ( /obj/machinery/door/firedoor, @@ -42981,22 +43118,30 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "bOn" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Shuttle Maintenance Access" +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance{ + name = "Bathroom Maintenance"; + req_access_txt = "12" }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/crew_quarters/toilet/restrooms) "bOo" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/docking, /turf/open/floor/plating, /area/hallway/secondary/exit) "bOp" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Departures Shuttle Dock" +/obj/structure/cable{ + icon_state = "2-8" }, -/turf/open/floor/plasteel, -/area/hallway/secondary/exit) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/aft) "bOq" = ( /obj/machinery/power/tracker, /obj/structure/cable, @@ -44925,8 +45070,12 @@ /turf/open/floor/plasteel/dark, /area/science/robotics/lab) "bRZ" = ( -/obj/structure/bookcase/random/fiction, -/turf/open/floor/wood, +/obj/structure/bookcase/random/nonfiction, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/library) "bSa" = ( /obj/structure/closet/secure_closet/medical3, @@ -45708,11 +45857,11 @@ /area/engine/atmos) "bTJ" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/violet/hidden{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/disposal) "bTK" = ( /turf/open/floor/engine/co2, /area/engine/atmos) @@ -45950,17 +46099,12 @@ /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload_foyer) "bUj" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/violet/hidden{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "bUk" = ( /obj/structure/closet/crate, /obj/effect/decal/cleanable/cobweb, @@ -46332,11 +46476,11 @@ /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload_foyer) "bUV" = ( -/obj/structure/lattice, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/violet/hidden{ dir = 10 }, +/obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) "bUW" = ( @@ -46569,15 +46713,15 @@ /turf/open/floor/plasteel, /area/quartermaster/sorting) "bVt" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/brown{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "1-4" +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) "bVu" = ( /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom{ @@ -46688,14 +46832,9 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload_foyer) "bVD" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "bVE" = ( /obj/effect/landmark/start/atmospheric_technician, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -47121,13 +47260,16 @@ /turf/open/floor/engine/n2o, /area/engine/atmos) "bWq" = ( -/obj/structure/lattice, -/obj/machinery/camera{ - c_tag = "Routing Depot - Aft Exterior"; - pixel_x = 22 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) "bWr" = ( /obj/structure/closet/l3closet/scientist, /obj/effect/turf_decal/stripes/line, @@ -47293,17 +47435,18 @@ /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload_foyer) "bWJ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "2-4" - }, +/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai_upload_foyer) +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) "bWK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/orange/visible, @@ -47901,11 +48044,9 @@ /turf/open/floor/plating, /area/router) "bXN" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/maintenance/aft) +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/morgue) "bXO" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder, @@ -47922,7 +48063,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/space/nearstation) "bXQ" = ( /obj/structure/closet/l3closet/scientist, @@ -47979,7 +48120,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/space/nearstation) "bXW" = ( /obj/structure/disposalpipe/segment{ @@ -48671,8 +48812,10 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "bZo" = ( -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) +/obj/effect/turf_decal/tile/brown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) "bZp" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -48706,13 +48849,13 @@ /turf/open/floor/plating, /area/hallway/primary/central) "bZs" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance{ - name = "Bathroom Maintenance"; - req_access_txt = "12" +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/turf/open/floor/plating, -/area/crew_quarters/toilet/restrooms) +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) "bZt" = ( /turf/closed/wall, /area/maintenance/starboard/aft) @@ -48859,8 +49002,11 @@ /turf/open/floor/carpet, /area/library) "bZK" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/wood, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/library) "bZL" = ( /obj/machinery/air_sensor/atmos/nitrous_tank, @@ -48928,14 +49074,15 @@ }, /area/library) "bZV" = ( +/obj/structure/window/reinforced/spawner/east, /obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/machinery/light{ + dir = 1; + light_color = "#c1caff" }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet, /area/library) "bZW" = ( /obj/structure/sign/warning/fire, @@ -49653,18 +49800,24 @@ /turf/open/floor/plating, /area/ai_monitored/storage/eva) "cbI" = ( -/obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ - dir = 1 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) "cbJ" = ( /obj/structure/table/reinforced, /obj/item/analyzer, @@ -49706,19 +49859,13 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Airlock"; - req_access_txt = "24" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/atmos) "cbM" = ( @@ -50874,24 +51021,17 @@ /turf/closed/wall/r_wall, /area/medical/medbay/lobby) "cea" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/photocopier, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/requests_console{ - department = "Cargo Bay"; - departmentType = 2; - name = "Cargo RC"; - pixel_y = 30 +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" }, -/obj/machinery/camera{ - c_tag = "Supply - Delivery Office Aft"; - network = list("ss13","rd") - }, -/obj/item/paper/guides/cogstation/disposals, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) +/area/library) "ceb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -52612,9 +52752,8 @@ /turf/open/floor/plasteel, /area/engine/teg_hot) "chC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/maintenance/disposal) +/turf/closed/wall/r_wall/rust, +/area/space/nearstation) "chD" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53089,6 +53228,17 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"ciA" = ( +/obj/effect/turf_decal/tile/brown, +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) "ciB" = ( /obj/structure/frame/computer, /obj/structure/disposalpipe/segment, @@ -54655,18 +54805,15 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "clO" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/brown, +/obj/effect/turf_decal/tile/purple{ + dir = 4 }, -/obj/machinery/door/airlock/engineering{ - name = "Electrical Substation"; - req_access_txt = "10" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/plating, -/area/engine/storage_shared{ - name = "Electrical Substation" - }) +/turf/open/floor/plasteel, +/area/quartermaster/miningoffice) "clP" = ( /obj/structure/table, /obj/item/stock_parts/subspace/amplifier, @@ -55625,6 +55772,29 @@ icon_state = "panelscorched" }, /area/maintenance/port/fore) +"cnG" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Shuttle Maintenance Access" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cnH" = ( +/obj/machinery/door/airlock/external/glass{ + name = "Departures Shuttle Dock" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) +"cnI" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/space/nearstation) +"cnJ" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/space/nearstation) "cnK" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -55634,10 +55804,69 @@ }, /turf/open/floor/plasteel, /area/engine/teg_hot) +"cnL" = ( +/obj/structure/closet/crate/science, +/obj/item/stack/sheet/metal/ten, +/obj/item/stack/sheet/glass/five, +/obj/item/stack/rods/twentyfive, +/obj/item/target/syndicate, +/obj/item/target/alien, +/obj/item/target, +/obj/item/target/clown, +/turf/open/floor/plasteel, +/area/science/mixing) +"cnM" = ( +/obj/machinery/mass_driver{ + dir = 8; + id = "pb_in"; + name = "Router Driver" + }, +/turf/open/floor/plating/airless, +/area/router/aux) +"cnN" = ( +/obj/structure/bookcase/random/fiction, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/library) "cnO" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/science/storage) +"cnP" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/kirbyplants{ + icon_state = "plant-21"; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/library) +"cnQ" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/camera{ + c_tag = "Supply - Warehouse Exterior"; + dir = 1 + }, +/turf/open/space/basic, +/area/quartermaster/warehouse) +"cnR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) "cnS" = ( /obj/structure/cable{ icon_state = "0-2" @@ -56406,18 +56635,25 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "cpm" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/delivery, +/obj/machinery/photocopier, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/requests_console{ + department = "Cargo Bay"; + departmentType = 2; + name = "Cargo RC"; + pixel_y = 30 }, -/obj/machinery/newscaster{ - pixel_x = -30 +/obj/machinery/camera{ + c_tag = "Supply - Delivery Office Aft"; + network = list("ss13","rd") }, -/turf/open/floor/plasteel/dark, -/area/lawoffice) +/obj/item/paper/guides/cogstation/disposals, +/obj/item/paper/fluff/cogstation/mulebot, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "cpn" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -58290,8 +58526,9 @@ req_access_txt = "5" }, /obj/item/clipboard, -/obj/item/clothing/glasses/hud/health, /obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/paper/guides/cogstation/letter_med, +/obj/item/clothing/glasses/hud/health, /obj/item/pen, /obj/item/clothing/glasses/hud/health, /turf/open/floor/plasteel/white, @@ -61157,17 +61394,15 @@ /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "cyd" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/orange/hidden{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/quartermaster/miningoffice) +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) "cye" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -65512,19 +65747,24 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cFs" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/noticeboard{ + pixel_y = 28 }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/obj/item/paper/guides/cogstation/letter_med, /turf/open/floor/plasteel/white, -/area/medical/medbay/zone2{ - name = "Medbay Treatment Center" - }) +/area/medical/medbay/central) "cFt" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -67715,12 +67955,10 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "cJg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/warehouse) "cJh" = ( /obj/structure/table, /obj/structure/bedsheetbin/towel, @@ -67823,15 +68061,17 @@ name = "Engine Room" }) "cJq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/machinery/suit_storage_unit/engine, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supplymain/visible, +/obj/structure/cable{ + icon_state = "1-2" }, +/obj/machinery/door/airlock/external/glass{ + name = "External Construction Access"; + req_one_access_txt = "10;31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, -/area/engine/engineering{ - name = "Engine Room" - }) +/area/quartermaster/warehouse) "cJr" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -67840,23 +68080,28 @@ /turf/open/space/basic, /area/space/nearstation) "cJs" = ( -/obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/quartermaster/warehouse) "cJt" = ( -/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/power/apc{ + name = "AI Upload Foyer APC"; + pixel_y = -24 + }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 5 }, -/turf/open/space/basic, -/area/space/nearstation) +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) "cJu" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -69804,12 +70049,20 @@ /turf/open/floor/plating, /area/quartermaster/miningdock/airless) "cNC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet/restrooms) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/turret_protected/ai_upload_foyer) "cND" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -70752,15 +71005,25 @@ /turf/open/space/basic, /area/space/nearstation) "cPG" = ( -/obj/structure/lattice, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera{ - c_tag = "Supply - Warehouse Exterior"; - dir = 1 +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/turretid{ + control_area = "/area/science/server"; + icon_state = "control_stun"; + name = "Computer Core turret control"; + pixel_x = -3; + pixel_y = -23; + req_access_txt = "65" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/server{ + name = "Computer Core" + }) "cPH" = ( /obj/machinery/conveyor_switch{ id = "EngiCargoConveyer" @@ -71613,9 +71876,6 @@ /obj/item/paper/guides/jobs/medical/cloning{ pixel_x = -4 }, -/obj/item/paper/fluff/cogstation/cloner{ - pixel_x = 6 - }, /turf/open/floor/plasteel, /area/medical/medbay/central) "cRc" = ( @@ -71681,22 +71941,11 @@ /turf/open/floor/plasteel/white/corner, /area/engine/atmos) "cRh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 4 }, -/obj/machinery/turretid{ - control_area = "/area/science/server"; - icon_state = "control_stun"; - name = "Computer Core turret control"; - pixel_x = -3; - pixel_y = -23; - req_access_txt = "65" - }, -/turf/open/floor/plasteel, -/area/science/server{ - name = "Computer Core" - }) +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload_foyer) "cRi" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -71840,6 +72089,53 @@ }, /turf/open/floor/plasteel, /area/science/robotics/lab) +"cRs" = ( +/obj/machinery/recharge_station, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ + dir = 9 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/ai_upload_foyer) +"cRt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/quartermaster/warehouse) +"cRu" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/science/mixing) +"cRv" = ( +/mob/living/simple_animal/opossum{ + desc = "Wubba lubba dub dub."; + name = "Rick" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/medical/morgue) +"cRw" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/item/paper/guides/cogstation/letter_med{ + pixel_y = 4 + }, +/obj/item/storage/backpack/duffelbag/med/surgery, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2{ + name = "Medbay Treatment Center" + }) "cVq" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -71947,14 +72243,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"frb" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/supplymain/visible, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space/basic, -/area/space/nearstation) "fti" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ @@ -84767,7 +85055,7 @@ akI aAJ cMp aYa -bxm +akI akI aNC bxv @@ -85023,7 +85311,7 @@ aLH akI aAK aRC -bxn +aHj akI bxA hiV @@ -85536,11 +85824,11 @@ aaU aaa aaU aEa -cMK -bxq +aXm +aXs bxC akI -bxK +beC bxY byh byb @@ -85794,7 +86082,7 @@ aaU aaU aEa cMK -bxt +aHE akI akI akI @@ -86050,9 +86338,9 @@ aaU aaa aaU aEa -aHE -bab -aaa +cMK +aTh +akI aaa aaU aaa @@ -86307,7 +86595,8 @@ aaU aaU aaU aEb -aPT +aya +bab aaU aaU aye @@ -86325,7 +86614,6 @@ aye aye aye aye -aye aaa aaa aaa @@ -90474,7 +90762,7 @@ aaa aaa aaa aaa -aaa +aWj aaU aaa aaU @@ -90730,9 +91018,9 @@ aaa aaa aaa aaa -aaa -aWj -aaU +bcw +aUZ +bcw aaa bcy cnU @@ -90988,7 +91276,7 @@ aaa aaa aaa bcw -aUZ +cRu bcw aaa bcy @@ -91010,7 +91298,7 @@ aaa aaa aaU aaa -bAb +brs bxT bFq bHY @@ -91180,10 +91468,10 @@ aaa aaa aaU abx -aqw -aoW -aqw -aqw +aiN +alu +aiN +abx aaU aaa aaa @@ -91437,9 +91725,9 @@ aaa aaa aaU abx -akg -apS -arr +aiN +asl +aiN abx aaU aaa @@ -91694,9 +91982,9 @@ aaa aaa aaU aiN -akj -anV -asl +aoW +apS +asH abx aaU aaU @@ -91951,9 +92239,9 @@ aaa aaa aaU aiN -akz +arr aDO -asH +atn awm axc awm @@ -92528,7 +92816,7 @@ aaa aaa aaa aaa -aaU +aaa bcy bed boJ @@ -93042,11 +93330,11 @@ aaa aaa aaa aaa -aaa +aaU +bQe +aaU aaU aaU -aaa -aaa bcw bdf bdf @@ -93299,13 +93587,13 @@ aaa aaa aaa aaa -aaa -bim +aaU +aye +aaU aaU aaU -aaa bcw -bhy +cnL bdf bpR bJw @@ -93557,10 +93845,10 @@ aaa aaa aaa aaU -aaa -aaa -aaU -aaU +chC +abp +abp +abp bcy biK bdf @@ -93814,10 +94102,10 @@ aaa aaa aaa aaU -aaa -aaa -aaa -aaU +brs +brs +brs +brs bcw biT bdf @@ -94071,8 +94359,8 @@ aaU aaU aaU aaU -aaa -aaa +cnI +cnJ bgW bgW bgW @@ -95316,7 +95604,7 @@ aNL aNL aVl aYT -baz +aXf bFH aYT aaU @@ -96860,7 +97148,7 @@ aVL aYT baG bbM -bcz +aZA aYT bdy beM @@ -97834,16 +98122,16 @@ aaa aaa aaa aaa -aak -aak -aak +aaU +aaa +aaU aaa aaa aaa aaa aaa aaa -akN +bhy alq alq apn @@ -97911,7 +98199,7 @@ bgA bWf bXm bZQ -ccN +bWq ccN cei ccN @@ -98169,7 +98457,7 @@ aZy aZy aZy aZy -beJ +aXg bfd bjg bUt @@ -98348,9 +98636,9 @@ aaa aaa aaa aaa -aWj -aWj -aWj +aaU +aaa +aaU aaa aaa aaa @@ -98598,16 +98886,16 @@ aaU aar abM ace -aWj -aWj -aWj -aWj -aWj -aWj -aWj -aWj +aaU +aaU +aaU +aaU +aaU +aaU +aaU +aaU abp -aWj +aaU aaU aaU aaU @@ -98855,16 +99143,16 @@ aaU aar abR ace -aWj +aaU aaa aaa aaa aaa aaa aaa -aWj -aWj -aWj +aaU +aaa +aaU aaa aaa aaa @@ -99112,7 +99400,7 @@ aaU aar abM acf -aWj +aaU aaa aaa aaa @@ -99197,12 +99485,12 @@ bWh csG bQA aZy -aXf +bZV bZJ bZF cpu bax -bZV +cea bZX ccY cab @@ -99368,8 +99656,8 @@ aaa aaU aaa acM -aWj -aWj +aaa +aaU aaa aaa aaa @@ -99445,8 +99733,8 @@ bnz bpw bQx bll -aZz -cpm +aZC +bcz bad bah baR @@ -99454,8 +99742,8 @@ bWi aWh cmN aZy -aXg -bZK +baE +bRZ bZF csH bay @@ -99625,7 +99913,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -99702,8 +99990,8 @@ bnA bpy bQI bll -aZA aZI +beG bae chP baS @@ -99712,7 +100000,7 @@ baS bbr aZy bJC -bZF +bZK bZF cjx bay @@ -99882,7 +100170,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -99959,7 +100247,7 @@ bnD bpC bQx bll -aZC +baz aZN bCS bak @@ -99969,10 +100257,10 @@ cdE bbs aZy bKR -bRZ +cnN bZF cCJ -baE +cnP bZS bZS bGI @@ -100139,7 +100427,7 @@ aaa aaU aaa aaU -aWj +aaa aaU add adC @@ -100396,7 +100684,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adf aad @@ -100653,7 +100941,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adf aad @@ -100910,7 +101198,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adf aad @@ -101167,7 +101455,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adf aad @@ -101424,7 +101712,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adf aad @@ -101681,7 +101969,7 @@ aaa aaU aaa aaU -aWj +aaa aaU adh adC @@ -101938,7 +102226,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -102193,9 +102481,9 @@ aaa aaa aaa aaU -aar aaU -aWj +aaU +aaU aaU aaU aaU @@ -102450,9 +102738,9 @@ aaa aaa aaa abp -aar +akN aTd -aWj +aaa abp aaa aaU @@ -102577,7 +102865,7 @@ caR czi cKj buS -bFY +cFs cEX bIU aJE @@ -102707,9 +102995,9 @@ aaa aaa aaa aaU -aar aaU -aWj +aaU +aaU aaU aaU aaU @@ -102966,7 +103254,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -103223,7 +103511,7 @@ aaa aaa aaa aaU -aWj +aaa aaU aaa adj @@ -103353,7 +103641,7 @@ cFe cFk cFm cFq -cFs +cRw cFz bqt blx @@ -103480,7 +103768,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adj @@ -103737,7 +104025,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adF @@ -103994,7 +104282,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adF @@ -104251,7 +104539,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adF @@ -104285,12 +104573,12 @@ aJF aJF aJF aJF -bEr -bEK -bEK -bGu -bHi aHa +aHp +aHp +aIJ +aLc +aMo cBj cBw cBF @@ -104508,7 +104796,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adF @@ -104547,15 +104835,15 @@ aim aim aEh aEq -aHp -aIJ -aLc -aQS -aQS -aQS -aQS +aMG aQS +aWr aWu +aWu +aWu +aWu +aWu +bbQ aWA aXd bre @@ -104598,8 +104886,8 @@ bLz bNe ajO bQb -bUj -aTh +cnR +cJt bfh brb bzN @@ -104765,7 +105053,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adF @@ -104839,9 +105127,9 @@ bOV aRq cjD bnU -btw +bxm bns -aya +bxn avy alo awn @@ -104856,7 +105144,7 @@ bPp bPU bQi bUU -bWJ +cNC bWP cbV bzR @@ -105022,7 +105310,7 @@ aaa aaa aaa aaU -aWj +aaa aaU adj adj @@ -105096,7 +105384,7 @@ aSt aSt aSt aSt -cpG +aWd aSt brs avv @@ -105113,7 +105401,7 @@ cRf bPV bQT bVq -cRh +cPG bfh cbY cdn @@ -105279,7 +105567,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaU adj @@ -105340,7 +105628,7 @@ axV aog aog aSH -beG +aZz aaU aaU aaU @@ -105352,9 +105640,9 @@ aRv aaU aaU aaU -aWj -aSq -aWj +aSt +cpG +aSt aaU avv ajO @@ -105370,7 +105658,7 @@ ajO ajO aRy bVC -aRy +cRh bfh bfh bBR @@ -105536,7 +105824,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -105626,8 +105914,8 @@ bmH aYZ bht bcY -bVD -beC +cyd +cRs cgF bfh bBS @@ -105660,7 +105948,7 @@ cbm byQ bHK cGU -byQ +bXN bHK bIu bJh @@ -105793,7 +106081,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -105850,7 +106138,7 @@ aOJ aOJ bmF bnT -aRJ +bnT aRJ aRJ chm @@ -106050,7 +106338,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -106106,13 +106394,13 @@ bfv bfv bkW bmJ +bnS bof aQJ aQJ aQJ aQJ aQJ -aQJ aRZ aaU aaa @@ -106174,7 +106462,7 @@ cyP byQ bzS czw -bDb +cRv bBu crX czI @@ -106307,7 +106595,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -106364,7 +106652,7 @@ bjL blD bmK boi -aaU +bsx aaU aaU aaU @@ -106564,7 +106852,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -106622,7 +106910,7 @@ aOJ aPN bes aaU -aye +bQe aye bQe aye @@ -106821,7 +107109,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -107078,7 +107366,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -107191,11 +107479,11 @@ cIA cIP cIY cJf -cJg -cNC -bZo -bZs -bXN +bGu +bHi +bJU +bOn +bOp bJp bJp cyT @@ -107335,7 +107623,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -107592,7 +107880,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaU @@ -107656,7 +107944,7 @@ aye aye aaU aWj -bnS +btw buq bwC bAr @@ -107849,7 +108137,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -108104,9 +108392,9 @@ aaa aaa aaa aaU -aar +aaU aTd -aWj +aaU aaU aaU aaU @@ -108363,7 +108651,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -108436,7 +108724,7 @@ bMS bBv bXM bvB -bWq +bvM acY adz bsz @@ -108620,7 +108908,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -108877,7 +109165,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -108941,7 +109229,7 @@ aaa aaa aaU aWj -bnS +btw buq bwZ bBC @@ -109013,7 +109301,7 @@ bme bme bme bme -bOn +cnG bme bOo aaa @@ -109134,7 +109422,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -109272,7 +109560,7 @@ bOe bOi cnd bOl -bOp +cnH aaa aaa aaa @@ -109391,7 +109679,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -109648,7 +109936,7 @@ aaa aaa aaa aaU -aWj +aaa aae aaa aaa @@ -109786,7 +110074,7 @@ bme bOh cne bOm -bOp +cnH aaa aaa aaa @@ -109905,7 +110193,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -110162,7 +110450,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -110242,7 +110530,7 @@ bsz aej agc agT -cJq +bFg apm aqS arP @@ -110419,7 +110707,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -110480,7 +110768,7 @@ bpH ang coh cfy -clO +bvb aRu aSv aSy @@ -110498,7 +110786,7 @@ cxa bPr sVC aNH -bbQ +bEr cJA aqO anE @@ -110676,7 +110964,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -110755,7 +111043,7 @@ cxb bsz aej agC -aoJ +bEK cJB apm aqT @@ -110933,7 +111221,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -111188,9 +111476,9 @@ aaa aaa aaa aaU -aav +aaU aTd -aWj +aaU aaU aaU aaU @@ -111328,7 +111616,7 @@ bme bOi bOj bOl -bOp +cnH cnE aaa aaa @@ -111447,7 +111735,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -111704,7 +111992,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaU @@ -111842,7 +112130,7 @@ bOe bOh cnc bOm -bOp +cnH aaa aaa aaa @@ -111961,7 +112249,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -111982,7 +112270,7 @@ afm apT adS bEu -ahN +aif afa aha ahx @@ -112097,7 +112385,7 @@ bme bme bme bme -bOn +cnG bme bOo aaa @@ -112218,7 +112506,7 @@ aaa aaa aaa aaU -aWj +aaa aaa aaa aaa @@ -112239,7 +112527,7 @@ aiV anv aec axS -ahN +aif afK ahb ahx @@ -112288,7 +112576,7 @@ bxP arE aMI cgX -chC +bim cik bwW bsT @@ -112475,7 +112763,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -112496,7 +112784,7 @@ aja aoM aec agi -ahN +aif afK ahc ahx @@ -112730,9 +113018,9 @@ aaa aaa aaa aaU -aav aaU -aWj +aaU +aaU aaU aaU aaU @@ -112753,7 +113041,7 @@ bEp bEp bEp bEp -ahN +aif afK ahd ahx @@ -112798,8 +113086,8 @@ arE att cqr arE -byt -bzo +byv +bAN aMI cgZ cif @@ -112987,9 +113275,9 @@ aaa aaa aaa abp -aav +aaa aTd -aWj +aaa abp aaa aaa @@ -113007,10 +113295,10 @@ abe aeP agX ajS -aHj +akg bvm ahP -ahN +aif afK afK ahT @@ -113055,7 +113343,7 @@ att btP bwo arE -byu +bAd arE aMI cha @@ -113244,19 +113532,19 @@ aaa aaa aaa aaU -aav aaU -aWj -aWj -aWj -aWj -aWj -aWj -aWj -aWj -aWj -aWj -aWj +aaU +aaU +aaU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaU aaV aaU aaU @@ -113265,9 +113553,9 @@ aaV ahP ahP ahP -bzp +akj ahP -ahN +aif aiB afK ahU @@ -113306,13 +113594,13 @@ aYF beQ bjw bwu -bAd -aMo -aMG -bVt +bnl bwp -bvb -byv +bwM +bxq +byt +byu +bAz ceQ cgT chc @@ -113503,7 +113791,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -113524,7 +113812,7 @@ akn aJR bEg ahP -aif +aoJ ass afK afK @@ -113760,7 +114048,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -114017,7 +114305,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -114274,7 +114562,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -114531,7 +114819,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -114788,7 +115076,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -115045,7 +115333,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -115302,7 +115590,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -115559,7 +115847,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -115638,10 +115926,10 @@ bra bwW bwW aaU -bdR -cJr -bTJ -aaa +anr +aWj +bUj +bVD aaa cPz aaa @@ -115816,7 +116104,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -115895,8 +116183,8 @@ brr bCr cwv bAQ -bAQ -cJs +bxt +bzp bUV caf bam @@ -115906,7 +116194,7 @@ bYl bam bam bam -bam +cJg bbX bbX bcn @@ -116073,7 +116361,7 @@ aaa aaU aaa aaU -aWj +aaa aaU aaa aaa @@ -116152,8 +116440,8 @@ brP brX bsh bsu -bsx -cJt +bxK +bDb sVC cdp sVC @@ -116163,8 +116451,8 @@ bZp sVC sVC sVC -frb -bvM +cJq +cRt bvW bvX bwd @@ -116330,7 +116618,7 @@ aaa aaU aaa ahv -aWj +aaa aaU aaa aaa @@ -116410,7 +116698,7 @@ bsi bsv bsy bsy -bsD +bTJ bsI bRv bsD @@ -116419,8 +116707,8 @@ bsD cPE cPF cPF -cPF -cPG +cnQ +cJs bBL bBL bCm @@ -116585,7 +116873,7 @@ aaa aaa aaa aaU -aav +cnM abM acj aaU @@ -117958,9 +118246,9 @@ bJv aaU cwJ aaU -cbG -aaU -aaU +bWJ +mIT +cJr aaU bbT bbT @@ -118214,10 +118502,10 @@ bPA wPS aaa cwI -aaa +cwA cbI -mIT -cJr +cwA +anr aaa aaU aaU @@ -118471,9 +118759,9 @@ bgM cwA cwA cwL -cww +cwA cbL -cww +cwA bdR mIT mIT @@ -118487,7 +118775,7 @@ bgk bbT bkd bbT -cea +cpm bVG cgn cje @@ -119537,13 +119825,13 @@ cjb cxV cyb cyc -cyd -bFg -bHR -bHR -bHR -bJU -bHR +bVt +bZo +bZs +bZs +bZs +ciA +clO bHR bLb boK @@ -119693,7 +119981,7 @@ aaa aaa aaa arM -atn +atl arM aaU aaU @@ -119949,9 +120237,9 @@ aaa aaa aaa aaa -aaa -aWj -aaU +arM +akz +arM aaU aaU aaU @@ -120207,9 +120495,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +aWj +aaU +aaU aaa aaa aaU @@ -125155,11 +125443,11 @@ aWj cww cJm cww -aaU -aaa -aaa -aaa -aaa +aWj +aWj +aWj +aWj +aWj aaU aaU aaa @@ -125410,9 +125698,9 @@ bal aaU aWj cww -cJn +cJm cww -aaU +aWj bal bal bal @@ -125666,10 +125954,10 @@ aaa aaa aaU aWj +bFY +cJn +cww aWj -aWj -aaa -aaa aaa aaa aaa @@ -125922,11 +126210,11 @@ aaa aaa aaa aaU -aaa -aaa -aaa -aaa -aaa +aWj +aWj +aWj +aWj +aWj bal bal bal diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 1b7b9c7414..53ca9a72b0 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1464,19 +1464,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "External Solar Access"; - req_access_txt = "10; 13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/solars/starboard/fore) "acQ" = ( @@ -17256,19 +17244,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "External Solar Access"; - req_one_access_txt = "13; 24; 10" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/solars/port/fore) "aIk" = ( @@ -25107,14 +25083,8 @@ /turf/open/floor/plasteel/dark, /area/security/execution/education) "aUK" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 }, /turf/open/floor/plating, /area/security/prison) @@ -43327,21 +43297,16 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "bzd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) +/obj/structure/lattice, +/turf/closed/wall, +/area/construction/mining/aux_base) "bze" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bzf" = ( -/obj/machinery/light/small{ - dir = 4 - }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/gravity_generator) @@ -44447,122 +44412,83 @@ /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bAI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bAJ" = ( -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/gravity_generator) -"bAK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/status_display/evac{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bAL" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/engine/gravity_generator"; - dir = 1; - name = "Gravity Generator APC"; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bAM" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/item/radio/intercom{ - name = "Station Intercom"; - pixel_y = 26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/white{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bAN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, +/obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bAO" = ( -/turf/closed/wall, -/area/engine/gravity_generator) -"bAP" = ( -/obj/machinery/door/firedoor, +/area/construction/mining/aux_base) +"bAJ" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/construction/mining/aux_base) +"bAK" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 + dir = 8 }, /obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" + name = "External Solar Access"; + req_access_txt = "10; 13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/solars/starboard/fore) +"bAL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/space, +/area/solar/port/fore) +"bAM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Solar Access"; + req_one_access_txt = "13; 24; 10" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/solars/port/fore) +"bAN" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "63" }, -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/turf/open/floor/plating, +/area/security/prison) +"bAO" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bAP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bAQ" = ( @@ -45609,7 +45535,7 @@ }, /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai) -"bCw" = ( +"bCx" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -45623,37 +45549,9 @@ }, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) -"bCx" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"bCy" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) "bCz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -45668,26 +45566,91 @@ /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bCA" = ( -/obj/structure/cable/white, /obj/structure/cable/white{ icon_state = "0-2" }, /obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/engine/gravity_generator) "bCB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/status_display/evac{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 9 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bCC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/engine/gravity_generator"; + dir = 1; + name = "Gravity Generator APC"; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/structure/cable{ - icon_state = "1-4" + icon_state = "0-2" }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bCD" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/item/radio/intercom{ + name = "Station Intercom"; + pixel_y = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bCE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bCF" = ( +/obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -45698,80 +45661,26 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bCD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bCE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bCF" = ( -/obj/structure/sign/warning/radiation, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"bCG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Gravity Generator Foyer"; - dir = 4; - name = "engineering camera" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bCH" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bCI" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plasteel, +/turf/closed/wall, /area/engine/gravity_generator) "bCJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -45784,9 +45693,6 @@ icon_state = "0-4" }, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/break_room) "bCL" = ( @@ -45801,13 +45707,13 @@ /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bCM" = ( @@ -47193,11 +47099,8 @@ /turf/open/floor/circuit/green, /area/ai_monitored/turret_protected/ai) "bEn" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/sign/warning/radiation{ - pixel_x = -32 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -47212,112 +47115,124 @@ /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bEo" = ( -/turf/open/floor/circuit/green, -/area/engine/gravity_generator) -"bEp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Gravity Generator Chamber"; - req_access_txt = "19; 61" +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable/white{ - icon_state = "1-4" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bEq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEr" = ( -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /obj/structure/cable/white{ - icon_state = "1-4" + icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEt" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bEu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/highsecurity{ - name = "Gravity Generator Room"; - req_access_txt = "19;23" - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bEv" = ( -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bEw" = ( -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/structure/cable{ + icon_state = "1-8" }, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"bEx" = ( +"bEu" = ( +/obj/structure/sign/warning/radiation, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bEv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering - Gravity Generator Foyer"; + dir = 4; + name = "engineering camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bEw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bEx" = ( +/obj/structure/closet/radiation, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bEy" = ( @@ -47330,9 +47245,6 @@ req_access_txt = "10" }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -47342,18 +47254,21 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bEz" = ( /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/end{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bEA" = ( @@ -47363,27 +47278,26 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bEB" = ( /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bEC" = ( @@ -47393,25 +47307,25 @@ /obj/structure/cable/white{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bED" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, /turf/open/floor/plasteel, /area/engine/break_room) "bEE" = ( @@ -48446,22 +48360,15 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bFW" = ( -/obj/machinery/gravity_generator/main/station, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/circuit/green, /area/engine/gravity_generator) "bFX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/sign/warning/radiation{ + pixel_x = -32 + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -48475,89 +48382,89 @@ /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) "bFY" = ( -/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bFZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/structure/cable/white{ + icon_state = "4-8" }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bGa" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/structure/cable/white{ + icon_state = "1-4" }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bGb" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bGc" = ( -/obj/structure/sign/warning/radiation, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"bGd" = ( /obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"bGe" = ( -/obj/machinery/status_display/evac{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 + icon_state = "4-8" }, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"bGf" = ( -/obj/structure/closet/radiation, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +"bGc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/highsecurity{ + name = "Gravity Generator Room"; + req_access_txt = "19;23" + }, +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/machinery/light/small, /obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bGd" = ( +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bGe" = ( +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"bGf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "bGg" = ( /obj/machinery/firealarm{ dir = 4; @@ -48565,6 +48472,9 @@ }, /obj/item/kirbyplants/random, /obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/break_room) "bGh" = ( @@ -48579,6 +48489,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark/corner, /area/engine/break_room) "bGi" = ( @@ -48586,15 +48499,16 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/dark/corner, /area/engine/break_room) "bGj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, /turf/open/floor/plasteel/dark/corner, /area/engine/break_room) "bGk" = ( @@ -49624,9 +49538,7 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai) "bHN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -49641,68 +49553,50 @@ /area/engine/gravity_generator) "bHO" = ( /obj/structure/cable/white, +/obj/structure/cable/white{ + icon_state = "0-2" + }, /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/gravity_generator) "bHP" = ( -/obj/machinery/light, -/obj/machinery/status_display/evac{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering - Gravity Generator"; - dir = 1; - name = "engineering camera" - }, +/obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 8 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bHQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bHR" = ( -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 4 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bHS" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/port_gen/pacman, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/light_switch{ - pixel_y = -26 - }, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel/twenty, -/obj/item/wrench, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/gravity_generator) @@ -49710,27 +49604,23 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/door/poddoor/preopen{ - id = "transitlock"; - name = "Transit Tube Lockdown Door" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 10 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) "bHU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/poddoor/preopen{ - id = "transitlock"; - name = "Transit Tube Lockdown Door" +/obj/machinery/status_display/evac{ + pixel_x = 32; + pixel_y = -32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/gravity_generator) @@ -51017,27 +50907,30 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Transit Tube Access"; - req_one_access_txt = "32;19" +/obj/machinery/door/poddoor/preopen{ + id = "transitlock"; + name = "Transit Tube Lockdown Door" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/transit_tube) +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "bJP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/preopen{ + id = "transitlock"; + name = "Transit Tube Lockdown Door" + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/transit_tube) +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "bJQ" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral{ @@ -52186,50 +52079,54 @@ /turf/closed/wall/r_wall, /area/engine/transit_tube) "bLG" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Gravity Generator Chamber"; + req_access_txt = "19; 61" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/engine/transit_tube) -"bLH" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall, -/area/engine/transit_tube) -"bLI" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/engine/transit_tube"; - dir = 1; - name = "Transit Tube Access APC"; - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/structure/cable/white{ - icon_state = "0-4" + icon_state = "1-4" + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bLH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/engine/break_room) +"bLI" = ( +/obj/machinery/gravity_generator/main/station, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/engine/transit_tube) +/area/engine/gravity_generator) "bLJ" = ( /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Transit Tube Access"; + req_one_access_txt = "32;19" + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -52241,35 +52138,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable/white{ - icon_state = "1-8" - }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bLK" = ( -/obj/item/kirbyplants/random, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/button/door{ - id = "transitlock"; - name = "Transit Tube Lockdown Control"; - pixel_y = 26; - req_access_txt = "39; 19" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/closed/wall/r_wall, /area/engine/transit_tube) "bLL" = ( /obj/item/kirbyplants/random, @@ -53595,29 +53468,14 @@ /turf/open/space, /area/space/nearstation) "bNH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable/white{ - icon_state = "2-4" +/obj/structure/sign/warning/radiation, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/space, -/area/space/nearstation) +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) "bNI" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Exterior Access"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -53631,12 +53489,6 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bNJ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -53647,39 +53499,21 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/closet/firecloset, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bNK" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Exterior Access"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/machinery/status_display/evac, +/turf/closed/wall, /area/engine/transit_tube) "bNL" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/engine/transit_tube"; + dir = 1; + name = "Transit Tube Access APC"; + pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -53690,15 +53524,16 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "0-4" + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bNM" = ( /obj/structure/cable/white{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -53709,11 +53544,22 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bNN" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/item/kirbyplants/random, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/button/door{ + id = "transitlock"; + name = "Transit Tube Lockdown Control"; + pixel_y = 26; + req_access_txt = "39; 19" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -54901,9 +54747,38 @@ /turf/open/space, /area/space/nearstation) "bPL" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/machinery/light/small, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 +/turf/open/floor/plasteel/dark, +/area/engine/transit_tube) +"bPM" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Exterior Access"; + req_one_access_txt = "32;19" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -54917,20 +54792,11 @@ }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) -"bPM" = ( -/turf/closed/wall, -/area/engine/transit_tube) "bPN" = ( -/obj/item/kirbyplants/random, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -26; - pixel_y = -26 +/obj/structure/cable/white{ + icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -54944,6 +54810,9 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bPO" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -54954,15 +54823,16 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bPP" = ( -/obj/item/kirbyplants/random, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light_switch{ - pixel_x = 22; - pixel_y = -10 +/obj/machinery/light/small{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -56192,13 +56062,15 @@ /turf/open/space, /area/space/nearstation) "bRV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/engine/transit_tube) -"bRW" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Transit Tube Access"; - req_one_access_txt = "32;19" +/obj/item/kirbyplants/random, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -23 + }, +/obj/machinery/flasher{ + id = "AI"; + pixel_x = -26; + pixel_y = -26 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56212,10 +56084,38 @@ }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) +"bRW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/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/engine/transit_tube) "bRX" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/item/kirbyplants/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/machinery/light_switch{ + pixel_x = 22; + pixel_y = -10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bRY" = ( /obj/machinery/keycard_auth{ @@ -57376,22 +57276,9 @@ /turf/open/space, /area/space/nearstation) "bTL" = ( -/obj/structure/window/reinforced{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/obj/structure/table/reinforced, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "AI Satellite - Transit Tube"; - name = "ai camera"; - network = list("minisat"); - start_active = 1 - }, -/obj/item/clipboard, -/obj/item/folder/blue, -/obj/item/pen, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -57403,30 +57290,16 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/engine/transit_tube) +/area/engine/gravity_generator) "bTM" = ( -/obj/structure/chair/office/dark{ - dir = 8 - }, -/obj/machinery/flasher{ - id = "AI"; - pixel_x = -26; - pixel_y = 26 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/engine/transit_tube) "bTN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Transit Tube Access"; + req_one_access_txt = "32;19" + }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -57437,22 +57310,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bTO" = ( -/obj/item/kirbyplants/random, +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/transit_tube) "bTP" = ( /obj/machinery/computer/station_alert{ @@ -59145,9 +59009,6 @@ /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bWc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -59158,10 +59019,15 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bWd" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -59172,6 +59038,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bWe" = ( @@ -60847,6 +60719,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engine/transit_tube) "bYp" = ( @@ -72264,7 +72139,7 @@ pixel_y = 32 }, /turf/open/space, -/area/space/nearstation) +/area/space) "crE" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -83035,22 +82910,16 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "cJI" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/structure/cable/white, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/port) +/turf/open/floor/plating, +/area/engine/gravity_generator) "cJJ" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -108364,19 +108233,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "External Solar Access"; - req_access_txt = "10; 13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/solars/starboard/aft) "dBN" = ( @@ -115581,6 +115438,10 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "dOc" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"dOd" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -115597,11 +115458,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"dOd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) "dOe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral{ @@ -115610,6 +115466,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -122648,19 +122505,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "External Solar Access"; - req_access_txt = "10; 13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/solars/port/aft) "ebE" = ( @@ -124004,14 +123849,16 @@ /turf/open/floor/plasteel/grimy, /area/chapel/office) "edX" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "edY" = ( @@ -124731,16 +124578,6 @@ /turf/open/floor/carpet, /area/chapel/office) "eft" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "efu" = ( @@ -125581,6 +125418,24 @@ /obj/machinery/chem_dispenser/apothecary, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) +"eMb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/flashlight, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/maintenance/port) "eMD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -125733,6 +125588,9 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"fMf" = ( +/turf/closed/wall, +/area/engine/transit_tube) "fRK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -126016,6 +125874,24 @@ /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"ikq" = ( +/obj/machinery/light, +/obj/machinery/status_display/evac{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering - Gravity Generator"; + dir = 1; + name = "engineering camera" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "imI" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -126143,6 +126019,25 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"iUc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Solar Access"; + req_access_txt = "10; 13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/solars/port/aft) "jdx" = ( /obj/structure/lattice, /obj/structure/grille, @@ -126344,6 +126239,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) +"jUu" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) "jYx" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, @@ -126736,6 +126634,20 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"mte" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/obj/machinery/light_switch{ + pixel_y = -26 + }, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/plasteel/twenty, +/obj/item/wrench, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -126877,6 +126789,18 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/fore) +"nYv" = ( +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "odz" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -127171,6 +127095,25 @@ dir = 9 }, /area/science/circuit) +"qhB" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/transit_tube) "qnx" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, /turf/open/floor/engine/vacuum, @@ -127408,6 +127351,25 @@ }, /turf/open/floor/plasteel/grimy, /area/library) +"tML" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "External Solar Access"; + req_access_txt = "10; 13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/solars/starboard/aft) "tNT" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -127653,6 +127615,32 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plasteel/dark, /area/engine/atmos) +"vFT" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Exterior Access"; + req_one_access_txt = "32;19" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/transit_tube) "vHN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -127688,6 +127676,18 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) +"vYo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -127750,6 +127750,16 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/misc_lab) +"wFK" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/space, +/area/space/nearstation) "wZT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -127972,6 +127982,23 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"yja" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/maintenance/port) "yjc" = ( /obj/machinery/power/apc{ areastring = "/area/science/research/abandoned"; @@ -145314,12 +145341,12 @@ aaa aaa aaa aaa +aaa ajr ajr aad ajr ajr -ajr aad ajr ajr @@ -145571,11 +145598,11 @@ aaa aaa aaa aaa +aaa ajr aaa aaa aad -aaa aad aaa aad @@ -145828,11 +145855,11 @@ aaa aaa aaa aaa +aaa ajr aad ajr ajr -aad ajr ajr ajr @@ -146085,6 +146112,7 @@ aaa aaa aaa aaa +aaa ajr aaa ajr @@ -146096,7 +146124,6 @@ aad aad aad aad -aad ajr aaa bNF @@ -146342,6 +146369,7 @@ aaa aaa aaa aaa +aaa aad aaa ajr @@ -146352,12 +146380,11 @@ bxC bxC bxC bxC -bxC -aad +jUu aad aad bNF -aad +qgU bVZ aad aad @@ -146599,20 +146626,20 @@ aaa aaa aaa aaa -ajr -aad -ajr -aad -bxC -bAH -bAH -bEn -bAH -bAH -bxC -aad -ajr aaa +ajr +aad +ajr +aad +bxC +bAH +bAH +bFX +bAH +bAH +jUu +aad +ajr bNF aaa bVZ @@ -146856,20 +146883,20 @@ aaa aaa aaa aaa +aaa ajr aaa aad aad bxC bAH -bCw bCx -bCy +bEo +bCF bAH -bxC +jUu aad ajr -aaa bNF aaa bVZ @@ -146896,8 +146923,8 @@ cdB cdB cdB car -aad -abj +caE +yja caE caE cOj @@ -147090,7 +147117,7 @@ aAP aAP avY ask -ask +bAL aad abj abj @@ -147113,22 +147140,22 @@ aaa aaa aaa aaa +aaa ajr aad ajr aad bxC bAH -bCx bEo bFW +bLI bAH -bxC -aad +jUu aad aad bNF -aad +qgU bVY aad aad @@ -147153,8 +147180,8 @@ car car car car -caE -cJI +eMb +cqI caE cme cOk @@ -147346,9 +147373,9 @@ aad aad aad aad -aad -apK -aad +aFp +bAM +aFp aLb aad aaa @@ -147370,20 +147397,20 @@ aaa aaa aaa aaa +aaa aad aaa ajr aad bxC bAH -bCy +bCF +bEo bCx -bCw bAH -bxC +jUu aad ajr -aaa bNF aaa bVZ @@ -147628,19 +147655,19 @@ ajr ajr aad ajr +ajr aad ajr aad bxC -bAI bCz +bEn bAH -bFX bHN -bxC +bTL +jUu aad aad -aaa bNF aaa bVZ @@ -147888,18 +147915,18 @@ aad aaa aaa aad +aad bxC -bAJ -bCA -bEp bCA bHO -bxC +bLG +bHO +cJI +jUu aad -bNH -bPK +wFK bRU -aad +qgU bVZ aad car @@ -148145,18 +148172,18 @@ ajr ajr aad aad +aad bxC -bAK bCB bEq bFY bHP -bxC -aad -bNF -aad -aad -aad +ikq +bLF +bLF +vFT +bLF +qgU bVZ aad car @@ -148402,18 +148429,18 @@ aad aad aad aad +aad bxC -bAL bCC bEr bFZ bHQ -bxC +vYo bLF bNI +qhB bLF -bLF -aad +qgU bVZ aad car @@ -148659,18 +148686,18 @@ aRF aRF aad aad +aad bxC -bAM bCD bEs bGa bHR -bxC -bLG +nYv +bLF bNJ bPL bLF -bTK +qgU bWa bTK car @@ -148916,18 +148943,18 @@ bpO aRF aad aad +aad bxC -bAN bCE bEt bGb bHS -bxC -bLH +mte +bLF bNK bPM +fMf bLF -bTL bWb bYn car @@ -149172,15 +149199,15 @@ bpO btK aRF aad +qgU +qgU bxC bxC -bxC -bCF bEu bGc +bNH bxC -bxC -bLI +bLF bNL bPN bRV @@ -149430,9 +149457,9 @@ btL aRF abj bxC -bzd -bAO -bCG +bxC +bxC +bCI bEv bGd bHT @@ -150203,9 +150230,9 @@ aMG bxE bzg bzg -bCJ -bEy bzg +bEy +bLH bHV bJQ bLL @@ -154660,7 +154687,7 @@ aaa aad aad aad -ajr +qgU aad ebC aad @@ -154918,9 +154945,9 @@ ajr aad aad aad -aad -ebC -aad +eak +iUc +eak aad aaa aac @@ -169915,8 +169942,8 @@ aaa aaa aaa aad -aad abi +bAI abR abi acp @@ -170172,9 +170199,9 @@ aaa aaa aaa abj -abj abH abS +abS acd acq acH @@ -170428,9 +170455,9 @@ aaa aaa aaa aaa -aaa -aad +qgU abi +bAJ abT abi acr @@ -170684,9 +170711,9 @@ aaa aaa aaa aaa -aaa -aac +jdx aad +bzd abi abi ace @@ -170941,8 +170968,8 @@ aaa aaa aaa aaa -aaa -aac +jdx +aad aad aad aad @@ -171198,7 +171225,7 @@ aaa aaa aaa aaa -aaa +aac aac aac aad @@ -172489,9 +172516,9 @@ aac aaa aad aad -aad -acQ -aad +acf +bAK +acf aad aaa abi @@ -172745,7 +172772,7 @@ aaa aac aac aad -aac +aad aad aaj aad @@ -182646,9 +182673,9 @@ aaA aaa aaa aad -aaa -dBN -aad +dyV +tML +dyV aad aaa aad @@ -182902,9 +182929,9 @@ aci aaA aaa aaa -ajr -aad -dBO +qgU +qgU +dBN aad aaa dFy @@ -184873,7 +184900,7 @@ aaa ajr ajr ajr -aaa +qgU aKZ aKZ aKZ @@ -185130,9 +185157,9 @@ aaa aaa aaa aaa -aaa -aaa +qgU abj +bAN aUK aWs aXT @@ -185388,11 +185415,11 @@ aaa aaa aaa aaa -aaa aad aKV aKV aKV +aKV aZK bbt aNJ diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index e848fd87d1..518fa4e81e 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -2134,14 +2134,11 @@ /turf/open/floor/plasteel/dark, /area/maintenance/port) "adM" = ( -/obj/machinery/door/airlock/external{ - name = "Abandoned External Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, /area/maintenance/fore) "adN" = ( /obj/effect/turf_decal/loading_area{ @@ -2160,11 +2157,16 @@ /turf/open/floor/engine, /area/ai_monitored/storage/satellite) "adO" = ( +/obj/machinery/door/airlock/external{ + name = "Satellite External Airlock"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/atmos) "adP" = ( /obj/machinery/status_display/ai, @@ -2513,6 +2515,9 @@ /turf/open/floor/plating, /area/security/execution/education) "aeD" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -2598,13 +2603,20 @@ }, /obj/machinery/light/small, /turf/open/floor/plating/airless, -/area/maintenance/starboard/fore) +/area/space/nearstation) "aeL" = ( +/obj/machinery/door/airlock/external{ + name = "Abandoned External Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/cable{ - icon_state = "2-8" + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-2" }, /obj/structure/disposalpipe/segment, -/turf/open/floor/plating/airless, +/turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) "aeM" = ( /obj/machinery/photocopier, @@ -5704,13 +5716,6 @@ /turf/open/floor/plasteel/dark, /area/security/courtroom) "ajI" = ( -/obj/machinery/door/airlock/external{ - name = "Abandoned External Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -6935,7 +6940,6 @@ dir = 4 }, /obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small{ dir = 8 }, @@ -9658,12 +9662,19 @@ /turf/open/floor/plasteel/showroomfloor, /area/medical/genetics) "aqp" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/solar/port/fore) +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) "aqq" = ( /obj/machinery/status_display/ai{ pixel_x = -32 @@ -12462,12 +12473,18 @@ /turf/open/floor/plasteel, /area/bridge) "auN" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/solar/starboard/fore) +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/fore) "auO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -64779,11 +64796,15 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) "bZG" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 +/obj/machinery/door/airlock/external{ + name = "Abandoned External Airlock" }, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/fore) "bZH" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -64902,9 +64923,18 @@ /turf/open/floor/plasteel, /area/hallway/primary/starboard) "bZP" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + name = "Prison External Airlock"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "bZQ" = ( /obj/structure/closet/l3closet/janitor, /obj/structure/window/reinforced, @@ -67690,11 +67720,6 @@ }, /area/ai_monitored/turret_protected/ai) "ceA" = ( -/obj/machinery/door/airlock/external{ - name = "Satellite External Airlock"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ icon_state = "1-2" @@ -69610,15 +69635,12 @@ /turf/open/floor/plasteel, /area/engine/atmos) "chO" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/atmos) "chP" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/delivery, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall, /area/ai_monitored/turret_protected/aisat/atmos) "chQ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -69697,12 +69719,19 @@ /turf/open/floor/plasteel, /area/engine/engineering) "chU" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/solar/port/aft) +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) "chW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/hatch{ @@ -71343,16 +71372,9 @@ /turf/open/floor/plating, /area/engine/engineering) "ckJ" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "ckK" = ( @@ -71763,16 +71785,9 @@ /turf/open/space/basic, /area/space/nearstation) "clx" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/solars/port/aft) @@ -74873,6 +74888,9 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -74942,6 +74960,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/dark, /area/maintenance/disposal) "crg" = ( @@ -76410,14 +76431,12 @@ /turf/open/floor/plating/airless, /area/solar/starboard/aft) "ctO" = ( -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, /area/maintenance/disposal) "ctP" = ( /obj/structure/cable{ @@ -76438,16 +76457,9 @@ /turf/open/floor/plating/airless, /area/solar/starboard/aft) "ctS" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/solars/port/fore) @@ -77673,12 +77685,18 @@ /turf/open/floor/plating, /area/maintenance/disposal) "cwb" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/solar/starboard/aft) +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard/aft) "cwc" = ( /obj/machinery/atmospherics/components/binary/pump/on, /obj/machinery/airlock_sensor/incinerator_atmos{ @@ -77774,9 +77792,9 @@ /area/maintenance/starboard/aft) "cwk" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "2-8" }, -/turf/open/floor/plating/asteroid/airless, +/turf/open/floor/plating/airless, /area/space/nearstation) "cwl" = ( /obj/structure/cable{ @@ -77954,13 +77972,6 @@ /turf/open/floor/plating, /area/maintenance/starboard) "cwD" = ( -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "cwE" = ( @@ -78131,6 +78142,9 @@ icon_state = "1-8" }, /obj/effect/decal/cleanable/blood/old, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/disposal) "cwQ" = ( @@ -78244,6 +78258,9 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -78301,6 +78318,9 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/disposal) "cxh" = ( @@ -78340,6 +78360,9 @@ /area/maintenance/disposal) "cxj" = ( /obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -78387,17 +78410,21 @@ }, /area/maintenance/port/fore) "cxp" = ( -/obj/structure/cable{ - icon_state = "1-4" +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" }, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/disposal) "cxq" = ( -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plating/airless, -/area/space/nearstation) +/area/maintenance/fore) "cxr" = ( /obj/structure/sign/poster/contraband/clown, /turf/closed/wall/rust, @@ -83810,16 +83837,9 @@ }, /area/maintenance/starboard) "cMH" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/solars/starboard/fore) "cMI" = ( @@ -84487,13 +84507,6 @@ /turf/open/space/basic, /area/space/nearstation) "cUD" = ( -/obj/machinery/door/airlock/external{ - name = "Prison External Airlock"; - req_access_txt = "2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -84511,6 +84524,10 @@ icon_state = "wood-broken" }, /area/security/vacantoffice) +"dky" = ( +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) "dlg" = ( /obj/machinery/light, /turf/open/floor/wood, @@ -84662,6 +84679,12 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/closed/mineral/random/labormineral, /area/space/nearstation) +"fAn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "fXq" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -85114,6 +85137,16 @@ /obj/structure/sign/poster/ripped, /turf/closed/wall, /area/crew_quarters/fitness/recreation) +"lqz" = ( +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard) "lKu" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko, @@ -85171,6 +85204,9 @@ }, /turf/open/floor/plasteel/dark, /area/science/research) +"mKj" = ( +/turf/closed/wall/rust, +/area/security/execution/education) "mKp" = ( /obj/structure/cable{ icon_state = "1-2" @@ -85537,6 +85573,12 @@ icon_state = "wood-broken4" }, /area/maintenance/port/fore) +"yaV" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "ydo" = ( /obj/structure/cable{ icon_state = "4-8" @@ -99350,9 +99392,9 @@ bTK bVs hNk bXG +abp cZm -bZG -aeU +fAn aeU aeU aeU @@ -99609,7 +99651,7 @@ cTF bXH cUD bZP -aeU +dky coy aeU aeU @@ -99862,19 +99904,19 @@ aaG aez cIj aeB -cZm +mKj +aez aez aez cko cko -cko -aeU aeU aeU aeU aeU +cnS chU -aeU +cnS aUz aeU aeu @@ -100317,9 +100359,9 @@ aeu aeU aeU aeU -aeU +ctH aqp -aeU +ctH aeu aeu aeu @@ -112391,7 +112433,7 @@ aaa aaa aeU aUz -aeu +adH adH adH adH @@ -112648,8 +112690,8 @@ aaa aaa acm aeU -aeU adQ +cxq alN chj aoc @@ -112905,7 +112947,7 @@ aeR aeR aes aes -aes +bZG adM alO amL @@ -113162,7 +113204,7 @@ aaa aaa acm aaa -aaa +adH adH adH adQ @@ -120603,9 +120645,9 @@ aaa aaa aaa aaa -aeU aeK baH +baH afb baH baH @@ -124312,9 +124354,9 @@ cpb crf cnu cnu +cnu cko aeu -aeu aaa aaa aaa @@ -124570,7 +124612,7 @@ cxg cxj ctO cxp -aeU +yaV ciQ aeU aaa @@ -124826,7 +124868,7 @@ cnu cnd cnu cnu -cxq +cnu cwk cxu aeU @@ -126360,9 +126402,9 @@ bzG bzG aeu aeu -aeU +ckz cwb -aeU +ckz aeU aUz aeU @@ -129382,9 +129424,9 @@ aaQ aeo aeo acm -acm -acK -acm +bkd +lqz +bkd aaa aaa aaa @@ -129617,9 +129659,9 @@ aeu aeu aeu aeu -aeU +cLM auN -aeU +cLM aeu aeu aeu diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 16659f3e7a..fdc313c30a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -793,10 +793,16 @@ /turf/open/floor/plating, /area/security/prison) "abN" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" }, -/area/security/prison) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/solars/port/fore) "abO" = ( /obj/structure/cable{ icon_state = "1-4" @@ -954,6 +960,9 @@ /area/security/prison) "acg" = ( /obj/machinery/light/small, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -962,18 +971,22 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating, -/area/security/prison) -"aci" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, /obj/machinery/door/airlock/external{ name = "Security External Airlock"; req_access_txt = "1" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /turf/open/floor/plating, /area/security/prison) +"aci" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/door/airlock/external{ + req_one_access_txt = "13,8" + }, +/turf/open/space, +/area/maintenance/starboard/fore) "acj" = ( /obj/machinery/light/small{ dir = 1 @@ -2047,14 +2060,12 @@ /turf/open/floor/plating, /area/maintenance/solars/port/fore) "aef" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "aeg" = ( @@ -2310,9 +2321,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) "aeH" = ( @@ -7006,15 +7014,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/crew_quarters/fitness/recreation) -"amG" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "amH" = ( /obj/machinery/door/airlock/external{ req_one_access_txt = "13,8" @@ -11553,19 +11552,15 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "avJ" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 }, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/maintenance/starboard/fore) "avK" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /turf/open/floor/plating, /area/maintenance/port/fore) "avL" = ( @@ -37959,12 +37954,8 @@ /turf/open/floor/wood, /area/crew_quarters/heads/hop) "bwl" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plasteel/dark, /area/engine/break_room) @@ -38524,9 +38515,6 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/engine/break_room) "bxn" = ( @@ -44779,7 +44767,7 @@ dir = 8 }, /turf/open/space, -/area/aisat) +/area/space/nearstation) "bKR" = ( /obj/structure/window/reinforced{ dir = 8 @@ -46796,11 +46784,11 @@ /turf/open/floor/plasteel/showroomfloor, /area/crew_quarters/kitchen) "bOY" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 +/obj/machinery/door/airlock/external{ + req_access_txt = "13" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/starboard/fore) @@ -53609,9 +53597,6 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/atmos) "ccY" = ( @@ -54894,17 +54879,12 @@ /turf/open/space, /area/solar/port/aft) "cfA" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, +/obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, /turf/open/floor/plating, -/area/maintenance/port/aft) +/area/maintenance/port/fore) "cfB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -63173,12 +63153,9 @@ /turf/open/space, /area/solar/port/aft) "cvj" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/engine/break_room) "cvk" = ( /obj/structure/closet/crate, /obj/item/crowbar/red, @@ -63664,7 +63641,10 @@ /turf/open/floor/plasteel, /area/science/circuit) "cwc" = ( -/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/external{ + name = "Auxiliary Escape Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/aft) "cwd" = ( @@ -63693,9 +63673,14 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "cwh" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -70269,7 +70254,7 @@ pixel_x = -32 }, /turf/open/space, -/area/space/nearstation) +/area/space) "cIz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -70553,18 +70538,20 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "cJf" = ( /obj/structure/cable/yellow{ - icon_state = "0-8" + icon_state = "4-8" }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "cJg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/item/bedsheet/medical, @@ -71813,6 +71800,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/aft) "cLA" = ( @@ -72157,15 +72145,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cMk" = ( -/obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/maintenance/aft"; - name = "Aft Maintenance APC"; - pixel_y = -24 +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 }, -/obj/structure/cable/yellow, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/maintenance/aft) +/turf/open/space, +/area/space) "cMl" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -72750,10 +72735,6 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cNe" = ( -/obj/machinery/door/airlock/external{ - name = "Auxiliary Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/aft) "cNf" = ( @@ -76631,9 +76612,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "dbR" = ( @@ -81171,10 +81149,6 @@ /obj/machinery/vr_sleeper, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"evy" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/space) "eEe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -81313,6 +81287,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"gsT" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/solar/starboard/aft) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -81350,9 +81337,7 @@ /turf/open/floor/plasteel, /area/science/misc_lab) "gNe" = ( -/obj/machinery/light/small{ - dir = 8 - }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/aft) "gRS" = ( @@ -81526,13 +81511,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) "jAj" = ( @@ -81656,17 +81634,15 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "kDM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/turf/open/floor/plasteel/dark, +/area/engine/break_room) "kJW" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -81775,14 +81751,9 @@ /turf/open/space/basic, /area/space/nearstation) "lNZ" = ( -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/structure/lattice/catwalk, +/turf/closed/wall/r_wall, +/area/engine/atmos) "lOi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -81902,6 +81873,12 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"mSd" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "mWg" = ( /obj/structure/girder, /obj/structure/grille, @@ -82477,8 +82454,9 @@ /turf/open/floor/plasteel, /area/science/circuit) "sdw" = ( -/turf/open/space/basic, -/area/space/nearstation) +/obj/structure/window/reinforced, +/turf/open/space, +/area/space) "siF" = ( /obj/structure/grille, /turf/open/floor/plating/airless, @@ -82576,6 +82554,12 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"sUM" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "sZN" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -82662,6 +82646,13 @@ /obj/machinery/cryopod, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"uim" = ( +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "uku" = ( /obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, @@ -82853,12 +82844,8 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "wxc" = ( -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Airlock"; - req_access_txt = "24" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plating, /area/engine/atmos) @@ -82869,10 +82856,13 @@ /turf/open/floor/plating, /area/crew_quarters/cryopod) "wFH" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/machinery/power/apc/highcap/five_k{ + areastring = "/area/maintenance/aft"; + name = "Aft Maintenance APC"; + pixel_y = -24 }, -/obj/effect/landmark/blobstart, +/obj/structure/cable/yellow, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/starboard/aft) "wKo" = ( @@ -82880,8 +82870,15 @@ /turf/closed/wall, /area/science/circuit) "wOE" = ( +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Airlock"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /turf/open/floor/plating, -/area/maintenance/aft) +/area/engine/atmos) "wOY" = ( /obj/structure/fans/tiny/invisible, /turf/open/space/basic, @@ -82940,15 +82937,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "xse" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) @@ -83056,6 +83049,19 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"yfW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/solars/port/aft) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -95238,9 +95244,9 @@ anS anS aaf aaf -aqB -anS -aaf +dne +cfA +dne aaf aaf aaf @@ -95496,7 +95502,7 @@ aaa aaa aaf dne -avJ +avL dne aaf aaa @@ -96581,7 +96587,7 @@ bXt bYC bYC bYC -aaa +bYC aaa aaf aaa @@ -96838,8 +96844,8 @@ bXu bYD bZN jyQ +yfW cda -cej cfz cED chY @@ -97095,7 +97101,7 @@ bXv bYC bYC bYC -aaa +bYC aaa aaf aaa @@ -99168,7 +99174,7 @@ ckN aaa aaf aaf -aaa +lMJ aaa aaf aaa @@ -99423,7 +99429,7 @@ ckQ cjt ckN aaf -aaf +ack cwf ack aaf @@ -99680,10 +99686,10 @@ cjt diJ dux dux -ack +dux cwg -ack -ack +dux +dux aaf aaa aaa @@ -99937,9 +99943,9 @@ crh dxv ctn dux -dux -cfA -dux +sUM +cwh +dyw dux aaf aaf @@ -100194,8 +100200,8 @@ dvt csf cto dux -cvj -cwh +cfF +mSd cxb dux aaa @@ -101647,7 +101653,7 @@ aaa aaa acT aaa -aaf +aee aee aee aee @@ -101904,7 +101910,7 @@ aaf aaf acU aak -aak +abN aef aeG afE @@ -102161,7 +102167,7 @@ aaa aaa aaf aaa -aaf +aee aee aee aee @@ -108580,7 +108586,7 @@ aaa aaa aaa wOY -abN +abe ach aax acN @@ -108838,7 +108844,7 @@ urv abe abe abe -aci +abL aax acO adh @@ -112806,7 +112812,7 @@ cFh cKH cLz wFH -cMk +bTs bTs bTs bTs @@ -113063,8 +113069,8 @@ cJN cCq cgN cMl -wOE bTs +lMJ aaf aaf aaf @@ -113321,7 +113327,7 @@ cCq cLA bTs bTs -bTs +lMJ aaf aaa aaa @@ -119485,7 +119491,7 @@ aaf aaa aaf dvY -kDM +cJd dvY aaa dbN @@ -119741,13 +119747,13 @@ cEA aaf aaa aaa -ack +dvY cJf -ack -aaa -aaf -dbR +dvY aaa +dbN +gsT +dbN aaa aaa aaa @@ -119893,7 +119899,7 @@ aaf aaa aaa aaa -sdw +aaa aaa acP acP @@ -119998,9 +120004,9 @@ blx aaa aaa aaa -aaa -aaf -aaa +ack +uim +ack aaa aaf dbR @@ -121266,7 +121272,7 @@ ciL cgs csc dvY -evy +dxk krD lsv txj @@ -121523,7 +121529,7 @@ cpK ciL csc dvY -vLD +lMJ krD jyv ohj @@ -121780,7 +121786,7 @@ cpL crb csd dvY -vLD +lMJ krD krD noG @@ -123501,7 +123507,7 @@ aaa aaa aaf dni -amG +asB amH anN dnS @@ -123758,7 +123764,7 @@ aaf aaf aaf dnh -amH +avG dnh apd dnS @@ -124014,8 +124020,8 @@ aaa aaf aaa aaf -aaa -ack +dnh +aci dnh ape dnS @@ -127140,8 +127146,8 @@ aaa aaf bpw aaf -aaf -ack +cvj +kDM bxc bzg bAP @@ -127398,7 +127404,7 @@ aaf bpw aaa aaf -aaf +ack bxc bzh bAQ @@ -128190,9 +128196,9 @@ gJs bFZ bAR aaf -bxc +lNZ wxc -bxc +lNZ aaf aaa aaf @@ -128447,9 +128453,9 @@ bVN bXr bAR aaf -aMr -ccY -bBb +lNZ +wOE +lNZ aaf aaa aaf @@ -128704,7 +128710,7 @@ bVO bUJ bAR aaf -aMq +sdw ccY bgo aTQ @@ -129161,8 +129167,8 @@ aaa ack ack atn -bOY -avG +anN +dnS dqT aaf aaa @@ -129218,7 +129224,7 @@ bAR bAR bAR aaf -aMq +sdw ccY aVk aNC @@ -129418,8 +129424,8 @@ aaf aaf aaf dnh -dnh -lNZ +avJ +avG dqT aaf aaa @@ -129674,9 +129680,9 @@ aaa aaa aaf aaa -aaa -aaf -ack +dnh +dnh +bOY dqT aaf anT @@ -135878,7 +135884,7 @@ blA bnu bpH brU -aOV +cMk aaa aMq bzm @@ -136120,7 +136126,7 @@ aOU aOY aOY aOY -aTT +aNC aaa aaa aaa @@ -136138,7 +136144,7 @@ brV aRy aaa aaa -aTT +aNC aOY aOY aOY @@ -136377,7 +136383,7 @@ aOV aaa aaa aaa -aTU +aaf aaa aRy aRy @@ -136402,7 +136408,7 @@ aaa aaa aaa aaa -aTU +aaf aaa aaa aaa @@ -139461,7 +139467,7 @@ aOV aaa aaa aaa -aTU +aaf aaa aRy aRy @@ -139479,14 +139485,14 @@ bsh aRy bvt aaa -aTU +aaf aaa aaa aaa aaa aaa aaa -aTU +aaf aaa aaa aaa @@ -139718,7 +139724,7 @@ aOX aNw aNw aNw -aTY +bJl aaa aaa aaa @@ -139736,14 +139742,14 @@ bsi aRy aaa aaa -aTY +bJl aNw aNw aNw aNw aNw aNw -aTY +bJl aNw aNw aNw diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index e07873089a..db44dfb92a 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1244,15 +1244,7 @@ /turf/closed/wall, /area/maintenance/starboard/fore) "abM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/starboard/fore) "abN" = ( @@ -23608,22 +23600,9 @@ /turf/open/floor/engine, /area/engine/supermatter) "aKB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/external{ - name = "External Airlock"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aKC" = ( @@ -23645,14 +23624,23 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "aKF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32; - pixel_y = 32 +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" }, -/turf/open/floor/plating, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plasteel, /area/maintenance/port/aft) "aKG" = ( /obj/structure/cable/white{ @@ -39608,9 +39596,17 @@ /turf/open/floor/plasteel, /area/engine/atmos) "edA" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard/fore) "eew" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -42876,9 +42872,6 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/rust, /area/maintenance/starboard) -"sIO" = ( -/turf/open/space/basic, -/area/space/nearstation) "sIP" = ( /obj/machinery/vending/cola/random, /obj/effect/turf_decal/bot, @@ -71461,7 +71454,7 @@ aaa aaa aaa aaa -aaa +sdX uhz uhz oxn @@ -71718,7 +71711,7 @@ aac aac aac aac -aaa +sdX uhz iye mJP @@ -91220,7 +91213,7 @@ aaa aae aaa aaa -aac +bxZ abL bxZ swz @@ -91477,7 +91470,7 @@ aaa aae aad aac -bvg +edA abM acu adt @@ -91734,7 +91727,7 @@ aad aah aad aad -aad +bxZ bxZ adq bxZ @@ -93059,7 +93052,7 @@ aRz sIc sIv sFs -sIO +aaa sIU sJe sIU @@ -98477,9 +98470,9 @@ aac aaa aaa aaa -edA +sdX aaa -edA +sdX aac aac aac @@ -98734,9 +98727,9 @@ aac aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aac aaa @@ -98991,9 +98984,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -99248,9 +99241,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -99505,9 +99498,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -99762,9 +99755,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -100019,9 +100012,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -100276,9 +100269,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -100533,9 +100526,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -100790,9 +100783,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -101047,9 +101040,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -101304,9 +101297,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -101561,9 +101554,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -101818,9 +101811,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -102075,9 +102068,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -102332,9 +102325,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -102589,9 +102582,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -102846,9 +102839,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -103103,9 +103096,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -103360,9 +103353,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -103617,9 +103610,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -103874,9 +103867,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -104131,9 +104124,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -104388,9 +104381,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -104645,9 +104638,9 @@ jFP aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -104902,9 +104895,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -105159,9 +105152,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa @@ -105416,9 +105409,9 @@ aaa aaa aaa aaa -edA +sdX aaa -edA +sdX aaa aaa aaa diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e6f14badd9..263cb44144 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1846,7 +1846,7 @@ network = list("minisat") }, /turf/open/space, -/area/ai_monitored/turret_protected/AIsatextAS) +/area/ai_monitored/turret_protected/AIsatextAP) "aeA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -2622,9 +2622,6 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 }, @@ -2744,12 +2741,8 @@ /turf/open/floor/plating, /area/security/main) "agR" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "MiniSat External Access"; - req_access_txt = "65" +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) @@ -2821,12 +2814,15 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/main) "ahh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + name = "MiniSat External Access"; + req_access_txt = "65" + }, +/turf/open/floor/plating, +/area/ai_monitored/turret_protected/aisat_interior) "ahi" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -2927,13 +2923,15 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/main) "ahr" = ( -/obj/structure/lattice, -/obj/machinery/camera/motion{ - c_tag = "MiniSat Entrance"; - network = list("minisat") +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 }, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "63" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "ahs" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube, @@ -4690,8 +4688,12 @@ /turf/open/space/basic, /area/space/nearstation) "alb" = ( -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/dorms) +/obj/structure/lattice/catwalk, +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/turf/open/space, +/area/space/nearstation) "alc" = ( /obj/structure/table, /obj/item/storage/fancy/cigarettes/cigars, @@ -6634,13 +6636,6 @@ /turf/open/floor/plating, /area/maintenance/fore) "apn" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "63" - }, /turf/open/floor/plating, /area/maintenance/fore) "apo" = ( @@ -8703,13 +8698,18 @@ /turf/closed/wall, /area/bridge) "atZ" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, /obj/machinery/door/airlock/external{ - name = "Bridge External Access"; - req_access_txt = "10;13" + name = "Solar Maintenance"; + req_access_txt = "10; 13" }, /turf/open/floor/plating, -/area/ai_monitored/turret_protected/aisat_interior) +/area/maintenance/solars/starboard) "aua" = ( /obj/structure/closet/secure_closet/freezer/money, /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, @@ -9124,9 +9124,6 @@ /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 }, -/obj/machinery/light/small{ - dir = 1 - }, /turf/open/floor/plating, /area/bridge) "auV" = ( @@ -13689,14 +13686,13 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "aFj" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/structure/lattice, +/obj/machinery/camera/motion{ + c_tag = "MiniSat Entrance"; + network = list("minisat") }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/turf/open/floor/plating, -/area/maintenance/department/cargo) +/turf/open/space, +/area/space/nearstation) "aFk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/lootdrop/minor/bowler_or_that, @@ -22864,11 +22860,13 @@ /turf/closed/wall, /area/maintenance/solars/starboard) "baH" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/multitool, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Bridge External Access"; + req_access_txt = "10;13" + }, /turf/open/floor/plating, -/area/maintenance/solars/starboard) +/area/ai_monitored/turret_protected/aisat_interior) "baI" = ( /obj/structure/cable{ icon_state = "0-8" @@ -23315,13 +23313,6 @@ /turf/open/floor/plasteel, /area/quartermaster/miningdock) "bbL" = ( -/obj/machinery/power/smes, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/solars/starboard) -"bbM" = ( /obj/machinery/power/terminal{ dir = 8 }, @@ -23333,17 +23324,10 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) -"bbO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, +"bbM" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/multitool, /turf/open/floor/plating, /area/maintenance/solars/starboard) "bbP" = ( @@ -23757,16 +23741,6 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "bcJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/engineering{ - name = "Starboard Solar Access"; - req_access_txt = "10" - }, -/turf/open/floor/plating, -/area/maintenance/solars/starboard) -"bcK" = ( /obj/structure/cable{ icon_state = "1-2" }, @@ -23775,27 +23749,35 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) -"bcL" = ( +"bcK" = ( /obj/structure/cable{ icon_state = "1-4" }, /turf/open/floor/plating, /area/maintenance/solars/starboard) -"bcN" = ( -/obj/machinery/power/solar_control{ - dir = 8; - id = "starboardsolar"; - name = "Starboard Solar Control" +"bcL" = ( +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/solars/starboard) -"bcO" = ( /obj/structure/cable{ icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/solars/starboard) +"bcN" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/bridge) +"bcO" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "bcQ" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -24156,17 +24138,17 @@ }, /area/maintenance/department/cargo) "bdR" = ( -/obj/structure/cable, -/obj/machinery/power/apc{ - dir = 8; - name = "Starboard Solar APC"; - pixel_x = -24 - }, +/obj/structure/chair/stool, +/obj/item/cigbutt/cigarbutt, /turf/open/floor/plating, /area/maintenance/solars/starboard) "bdS" = ( -/obj/structure/chair/stool, -/obj/item/cigbutt/cigarbutt, +/obj/machinery/power/solar_control{ + dir = 8; + id = "starboardsolar"; + name = "Starboard Solar Control" + }, +/obj/structure/cable, /turf/open/floor/plating, /area/maintenance/solars/starboard) "bdU" = ( @@ -27986,7 +27968,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/storage/emergency/port) +/area/medical/medbay/zone3) "bny" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ @@ -28005,7 +27987,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/storage/emergency/port) +/area/medical/medbay/zone3) "bnz" = ( /obj/structure/table, /obj/item/folder/white, @@ -39909,12 +39891,6 @@ /area/science/mixing) "bMp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - req_access_txt = "8" - }, /turf/open/floor/plating, /area/science/mixing) "bMq" = ( @@ -40394,11 +40370,10 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bNq" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1 }, -/turf/open/space, +/turf/open/floor/plating/airless, /area/science/mixing) "bNr" = ( /obj/structure/window/reinforced{ @@ -40834,10 +40809,11 @@ /turf/open/floor/engine/vacuum, /area/science/mixing) "bOu" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 }, -/turf/open/floor/plating/airless, +/turf/open/space, /area/science/mixing) "bOv" = ( /obj/structure/window/reinforced{ @@ -41125,12 +41101,15 @@ /turf/open/floor/engine/n2o, /area/engine/atmos) "bPl" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/turf/open/space, -/area/space/nearstation) +/obj/machinery/door/airlock/external{ + req_access_txt = "8" + }, +/turf/open/floor/plating, +/area/science/mixing) "bPn" = ( /obj/machinery/door/airlock/grunge{ name = "Chapel" @@ -43266,7 +43245,7 @@ /obj/structure/closet/firecloset, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/engine/break_room) "bTR" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible{ dir = 4 @@ -43455,7 +43434,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/closet/firecloset, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/engine/break_room) "bUp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel, @@ -43848,7 +43827,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/manifold4w/scrubbers, /turf/open/floor/plasteel, -/area/engine/atmos) +/area/engine/break_room) "bVd" = ( /obj/machinery/door/airlock/atmos{ name = "Atmospherics"; @@ -45016,10 +44995,6 @@ /turf/open/floor/plating, /area/chapel/asteroid/monastery) "bXN" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external, /turf/open/floor/plating, /area/chapel/asteroid/monastery) "bXS" = ( @@ -45926,12 +45901,21 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 8 }, +/obj/machinery/air_sensor/atmos/incinerator_tank{ + pixel_x = 32; + pixel_y = -32 + }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "bZV" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "bZY" = ( /turf/closed/wall, /area/chapel/office) @@ -46149,13 +46133,15 @@ icon_state = "4-8" }, /obj/machinery/igniter/incinerator_atmos, -/obj/machinery/air_sensor/atmos/incinerator_tank{ - pixel_x = 32; - pixel_y = -32 - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) "caP" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/maintenance/disposal/incinerator) +"caQ" = ( /obj/structure/cable/yellow{ icon_state = "0-8" }, @@ -46167,13 +46153,9 @@ dir = 8; luminosity = 2 }, -/obj/machinery/camera{ - c_tag = "Turbine Chamber"; - network = list("turbine") - }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) -"caQ" = ( +"caR" = ( /obj/structure/cable/yellow{ icon_state = "0-8" }, @@ -46183,10 +46165,6 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) -"caR" = ( -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) "caS" = ( /turf/closed/wall, /area/chapel/asteroid/monastery) @@ -46611,9 +46589,9 @@ /turf/open/floor/plasteel/dark, /area/maintenance/disposal/incinerator) "ccs" = ( -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/floor/engine/vacuum, -/area/maintenance/disposal/incinerator) +/obj/structure/lattice, +/turf/closed/wall, +/area/maintenance/department/cargo) "ccu" = ( /obj/structure/flora/ausbushes/leafybush, /turf/open/floor/plating/asteroid, @@ -46786,13 +46764,6 @@ /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cdl" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Access"; - req_access_txt = "24" - }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "cdm" = ( @@ -47328,6 +47299,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "cfu" = ( @@ -47446,14 +47420,12 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "cfQ" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/power/smes, +/obj/structure/cable{ + icon_state = "0-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) +/turf/open/floor/plating, +/area/maintenance/solars/starboard) "cfS" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/emergency_oxygen/engi, @@ -47579,14 +47551,12 @@ /turf/open/floor/plating, /area/engine/engineering) "cgs" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access_txt = "61" - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating, /area/engine/engineering) "cgu" = ( @@ -47678,9 +47648,6 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "cgQ" = ( -/obj/machinery/light/small{ - dir = 8 - }, /obj/structure/sign/warning/vacuum/external{ pixel_x = -32 }, @@ -49453,7 +49420,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/space/basic, -/area/ai_monitored/turret_protected/AIsatextAS) +/area/ai_monitored/turret_protected/AIsatextAP) "cnJ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/vending/wardrobe/sec_wardrobe, @@ -50434,6 +50401,15 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "crB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/engine) +"crC" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -50445,15 +50421,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"crC" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/department/engine) "crD" = ( /obj/structure/table/wood/fancy, /obj/item/storage/box/bodybags, @@ -53580,13 +53547,15 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "dWp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "61" }, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/engine/engineering) "dYe" = ( /obj/structure/cable{ @@ -53959,6 +53928,9 @@ /obj/effect/turf_decal/arrows{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "eWi" = ( @@ -54360,6 +54332,9 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"fRr" = ( +/turf/open/floor/engine/vacuum, +/area/maintenance/disposal/incinerator) "fRs" = ( /turf/closed/wall, /area/crew_quarters/heads/hor) @@ -54572,6 +54547,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"gmZ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Access"; + req_access_txt = "24" + }, +/turf/open/floor/plating, +/area/maintenance/disposal/incinerator) "gna" = ( /turf/open/floor/plasteel/stairs/medium, /area/maintenance/department/crew_quarters/dorms) @@ -54932,6 +54917,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) +"hbl" = ( +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine/vacuum, +/area/space) "heC" = ( /obj/machinery/power/apc/highcap/five_k{ dir = 8; @@ -55279,14 +55268,15 @@ /turf/open/floor/engine, /area/engine/engineering) "hSM" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/machinery/door/airlock/external{ - req_access_txt = "13" +/obj/machinery/door/airlock/engineering{ + name = "Starboard Solar Access"; + req_access_txt = "10" }, /turf/open/floor/plating, -/area/maintenance/department/science) +/area/maintenance/solars/starboard) "hTl" = ( /obj/structure/sink{ dir = 4; @@ -55395,6 +55385,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/engine/engineering) +"igB" = ( +/obj/machinery/camera{ + c_tag = "Turbine Chamber"; + network = list("turbine") + }, +/turf/open/floor/engine, +/area/maintenance/disposal/incinerator) "igE" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -55667,7 +55664,7 @@ dir = 9 }, /turf/open/floor/plasteel/white, -/area/storage/emergency/port) +/area/medical/medbay/zone3) "iJi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -57269,6 +57266,15 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"mvm" = ( +/obj/structure/cable, +/obj/machinery/power/apc{ + dir = 8; + name = "Starboard Solar APC"; + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/maintenance/solars/starboard) "mwg" = ( /obj/structure/closet/crate{ icon_state = "crateopen" @@ -57459,6 +57465,10 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"nbu" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/space) "ncm" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -58035,6 +58045,10 @@ }, /turf/open/floor/plasteel/dark, /area/tcommsat/computer) +"ore" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/engine/engineering) "ost" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -58146,13 +58160,6 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10; 13" - }, /turf/open/floor/plating, /area/maintenance/solars/starboard) "oDP" = ( @@ -58221,6 +58228,12 @@ /obj/item/stack/sheet/mineral/wood, /turf/open/floor/plasteel, /area/maintenance/department/engine) +"oGw" = ( +/obj/item/clothing/mask/gas, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/disposal/incinerator) "oHa" = ( /obj/machinery/power/emitter/anchored{ dir = 8; @@ -59255,6 +59268,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"qVk" = ( +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/space/basic, +/area/maintenance/disposal/incinerator) "qVP" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -59563,6 +59580,13 @@ icon_state = "panelscorched" }, /area/maintenance/department/engine) +"rzF" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/chapel/asteroid/monastery) "rBh" = ( /obj/structure/mopbucket, /obj/item/mop, @@ -60877,12 +60901,16 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "uXH" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10; 13" + }, /turf/open/floor/plating, /area/maintenance/solars/starboard) "uZb" = ( @@ -61180,6 +61208,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"vHf" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/turf/open/floor/plating, +/area/maintenance/department/science) "vIc" = ( /obj/structure/cable{ icon_state = "2-4" @@ -62245,7 +62282,9 @@ /obj/structure/chair{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) @@ -77500,9 +77539,9 @@ rLi tlc aiu aht -aaa -azH -aaa +axB +rKr +axB aaa aaa aaa @@ -77758,9 +77797,9 @@ aiu aiu axC axB -rKr +azN axB -axC +aaa aaa aaa aaa @@ -78017,7 +78056,7 @@ axC ayz azN axB -axC +aaa aaa aaa aaa @@ -81853,7 +81892,7 @@ ahB ahZ aiB ajc -agy +ajM akB alq alZ @@ -82110,7 +82149,7 @@ ahC aia aiC ajc -agy +ajM akC alr ama @@ -82367,7 +82406,7 @@ ahD aib aiD ajc -agy +ajM akD als amb @@ -82458,9 +82497,9 @@ aht aaa aaa abI -aaa -bSZ -ahi +bGI +bNs +rzF bNs bOw bOw @@ -82624,7 +82663,7 @@ ahB aic aiE agy -agy +ajM akE alt amc @@ -82716,7 +82755,7 @@ abI abI abI aaa -aht +bSZ ahi bNs bNs @@ -84536,8 +84575,8 @@ aaa aaa aaa aaa -kSb -kSb +fon +fon aht aht nKo @@ -88120,7 +88159,7 @@ bDi bDi bDi bIZ -mZE +aaa aaa aaa aaa @@ -88377,8 +88416,8 @@ wNq bva gMO bBX -mZE -mZE +aaa +aaa aaa aaa aaa @@ -88635,7 +88674,7 @@ bBX fdS bBX bBX -mZE +aaa aaa aaa aaa @@ -90436,7 +90475,7 @@ gnq bXk ceU eVy -cfP +bXk bXk bXk bXk @@ -90597,9 +90636,9 @@ aaa aaa aaa aaa -aaa -ahi -ahi +aoz +ahr +aoz aqG arD asO @@ -90855,8 +90894,8 @@ aaa aaa aaa aaa -aaa -aaa +cdm +cdm aqG arE arA @@ -90950,8 +90989,8 @@ cdM bXq xmE ymb -cfQ bXk +ore qWG bXk paU @@ -94698,7 +94737,7 @@ ags adX adX adX -aaa +adX aaa aaa aaa @@ -94954,8 +94993,8 @@ cnC adX adX adX -ahh -aaa +adX +alb aaa aaa aaa @@ -94970,9 +95009,9 @@ aaa aaa aaa aaa -aaa ahi atY +bcN auU atY lQQ @@ -95211,6 +95250,7 @@ bIK agt agD agR +ahh ahi aaa aaa @@ -95218,7 +95258,6 @@ aaa aaa aaa aaa -aaa aht amC aht @@ -95227,9 +95266,9 @@ aaa aaa aaa aaa -aaa ahi -atZ +baH +auV auV awc axg @@ -95468,8 +95507,8 @@ agg adX adX adX -ahh -aaa +adX +alb aaa aaa aaa @@ -95484,11 +95523,11 @@ aaa aaa aaa aaa -aaa ahi atY atY atY +atY axh axh axh @@ -95726,8 +95765,8 @@ ags adX adX adX -ahr -aht +adX +aFj aht aht aht @@ -98814,7 +98853,7 @@ iqc ngp cBr cBs -alb +tap gna klV xbJ @@ -99584,7 +99623,7 @@ aju ajt alQ mnG -alb +tap tap aiS anY @@ -99842,7 +99881,7 @@ alc alR amF pzF -alb +tap anm ajv ajv @@ -101740,7 +101779,7 @@ caN bZT bYw cdl -bYw +oGw bYw aaa mau @@ -101995,9 +102034,9 @@ bYw bZU caO cbF -ccs -cdm -cdm +bYw +gmZ +bYw bYw aht fon @@ -102249,13 +102288,13 @@ bVo bJP aht bYw -bYw +igB caP +fRr +qVk +cdm +cdm bYw -bYw -aaa -aaa -aaa aaa aaa aaa @@ -102505,11 +102544,11 @@ bWg bVo bJP aaa -aaa +bYw bYw caQ bYw -aaa +bYw aaa aaa aaa @@ -102762,10 +102801,10 @@ bJP bJP bJP abI -abI -bZV +aaa +bYw caR -bZV +bYw aaa aaa aaa @@ -103019,10 +103058,10 @@ aaa aaa abI aaa -aaa -aaa -aaa -aaa +abI +nbu +hbl +nbu aaa aaa aaa @@ -105574,9 +105613,9 @@ bIN dAF bCV bCV -bNq +bCV bOu -aht +bNq aaa aaa aaa @@ -105832,8 +105871,8 @@ bJT wOS bMp bPl -mZE -aht +bcO +aaa aaa aaa aaa @@ -106088,9 +106127,9 @@ fBz bCV bCV bCV +bCV ahi aht -aht abI abI abI @@ -106822,7 +106861,7 @@ aEl aEj aEj aht -aht +ccs aEj aEl aEl @@ -107079,10 +107118,10 @@ aTu aUB aEl aaa -aaa -aEl +aEj aZv aUC +aUC bcH aUC aZw @@ -107337,8 +107376,8 @@ aGO aEj aEj aEj -aEj aTx +aFi aGO bcI aFi @@ -107574,10 +107613,10 @@ aaa aaa aaa aaa +aEl +aFi aEj -aFj -aEj -aEj +aaa aEj aEl aEj @@ -107594,12 +107633,12 @@ aUC aVE aUC aUC -aUC aZw -aFi -bcI -aFi -aFi +aEj +aEj +hSM +aEj +aEj kIo bfN aEj @@ -107831,9 +107870,9 @@ aaa aaa aaa aaa -ahi -ahi -ahi +aEj +bZV +aEj aaa aaa aaa @@ -107853,9 +107892,9 @@ aEj aEj aYC baG -baG +cfQ bcJ -baG +mvm baG aEj aEj @@ -108088,9 +108127,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +ahi +ahi +ahi aaa aaa aaa @@ -108624,9 +108663,9 @@ aFi aFi aYD baG -baH +rWE uXH -bcN +rWE baG eZA tDn @@ -108882,7 +108921,7 @@ aXC aYE baG rWE -bbO +oCX rWE baG vzT @@ -109139,7 +109178,7 @@ aXC aYF baG sut -bcO +oCX rWE baG dsv @@ -109396,7 +109435,7 @@ aEl aEl baG rWE -oCX +atZ rWE baG aEj @@ -109902,7 +109941,7 @@ aaa aaa aaa aaa -mZE +aaa aaa aaa aaa @@ -112504,7 +112543,7 @@ qcH bnd nNN bwm -hSM +lWy bwm bwm aaa @@ -112760,10 +112799,10 @@ riW jtf bnd aht -ahi -ahi -ahi -aht +bwm +vHf +bwm +aaa aht aby aht @@ -113017,9 +113056,9 @@ cOp lGS bnd aaa -aaa -aaa -aaa +ahi +ahi +ahi aht aaa aed diff --git a/byond-extools.dll b/byond-extools.dll index 4910fad01b..bd6b34c48e 100644 Binary files a/byond-extools.dll and b/byond-extools.dll differ diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index bdee4cdcd5..65994dda5a 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -312,6 +312,7 @@ #define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) #define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag) #define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //called exclusively in plumbing, for now #define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user) #define COMPONENT_STOP_GENERIC_ATTACK 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 6ddd269b4b..9c39446a67 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -64,7 +64,6 @@ #define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi' #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' -#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi' #define MONKEY_BODYPART "monkey" #define ALIEN_BODYPART "alien" @@ -333,4 +332,4 @@ /// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() #define EXAMINE_MORE_TIME 1 SECONDS -#define SILENCE_RANGED_MESSAGE (1<<0) +#define SILENCE_RANGED_MESSAGE (1<<0) diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm new file mode 100644 index 0000000000..5ea7c46b42 --- /dev/null +++ b/code/__DEFINES/plumbing.dm @@ -0,0 +1,9 @@ +#define FIRST_DUCT_LAYER 1 +#define SECOND_DUCT_LAYER 2 +#define THIRD_DUCT_LAYER 4 +#define FOURTH_DUCT_LAYER 8 +#define FIFTH_DUCT_LAYER 16 + +#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER + +#define MACHINE_REAGENT_TRANSFER 10 diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 4296e3c2e9..63259774fa 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -6,10 +6,17 @@ #define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. #define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. -#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. - //if TESTING is enabled, qdel will call this object's find_references() verb. -#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. -//defines for the gc_destroyed var + +#ifdef LEGACY_REFERENCE_TRACKING +/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb. + * + * Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm. +*/ +#define QDEL_HINT_FINDREFERENCE 5 +/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced. +#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 +#endif + #define GC_QUEUE_CHECK 1 #define GC_QUEUE_HARDDELETE 2 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index f4beef7ee8..44e97ef345 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -57,6 +57,10 @@ #define ADD_REAGENT 2 // reagent added #define REM_REAGENT 3 // reagent removed (may still exist) + +#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die (literally, we'll toss a nuke at whever your ip turns up) +#define RANDOM_PILL_STYLE 22 //Dont change this one though + #define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone //reagent bitflags, used for altering how they works diff --git a/code/__DEFINES/rockpaperscissors.dm b/code/__DEFINES/rockpaperscissors.dm new file mode 100644 index 0000000000..77ba81938d --- /dev/null +++ b/code/__DEFINES/rockpaperscissors.dm @@ -0,0 +1,7 @@ +#define ROCKPAPERSCISSORS_RANGE 3 +#define ROCKPAPERSCISSORS_TIME_LIMIT 20 SECONDS + +#define ROCKPAPERSCISSORS_LOSE "lose" +#define ROCKPAPERSCISSORS_WIN "win" +#define ROCKPAPERSCISSORS_TIE "tie" +#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided" \ No newline at end of file diff --git a/code/__DEFINES/storage/volumetrics.dm b/code/__DEFINES/storage/volumetrics.dm index c3f45976ce..e6b732e083 100644 --- a/code/__DEFINES/storage/volumetrics.dm +++ b/code/__DEFINES/storage/volumetrics.dm @@ -24,7 +24,10 @@ GLOBAL_LIST_INIT(default_weight_class_to_volume, list( // Let's keep all of this in one place. given what we put above anyways.. // volume amount for items +/// volume for a data disk #define ITEM_VOLUME_DISK 1 +/// volume for a shotgun stripper clip holding 4 shells +#define ITEM_VOLUME_STRIPPER_CLIP (DEFAULT_VOLUME_NORMAL * 0.5) // #define SAMPLE_VOLUME_AMOUNT 2 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 7a188281d0..81b5c5620f 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -146,11 +146,11 @@ #define SSAIR_EQUALIZE 8 #define SSAIR_ACTIVETURFS 9 +// |= on overlays is not actually guaranteed to not add same appearances but we're optimistically using it anyway. #define COMPILE_OVERLAYS(A)\ if (TRUE) {\ var/list/ad = A.add_overlays;\ var/list/rm = A.remove_overlays;\ - var/list/po = A.priority_overlays;\ if(LAZYLEN(rm)){\ A.overlays -= rm;\ A.remove_overlays = null;\ @@ -159,11 +159,5 @@ A.overlays |= ad;\ A.add_overlays = null;\ }\ - if(LAZYLEN(po)){\ - A.overlays |= po;\ - }\ - else{\ - A.priority_overlays = null;\ - }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 101330cc8b..fe46fdc710 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -75,6 +75,7 @@ #define VV_HK_MARK "mark" #define VV_HK_ADDCOMPONENT "addcomponent" #define VV_HK_MODIFY_TRAITS "modtraits" +#define VV_HK_VIEW_REFERENCES "viewreferences" // /datum/gas_mixture #define VV_HK_SET_MOLES "set_moles" diff --git a/code/__HELPERS/donator_groupings.dm b/code/__HELPERS/donator_groupings.dm index bdff20553a..4305fb1ed5 100644 --- a/code/__HELPERS/donator_groupings.dm +++ b/code/__HELPERS/donator_groupings.dm @@ -17,9 +17,9 @@ For fast lookups, this is generated using regenerate_donator_grouping_list() /proc/regenerate_donator_grouping_list() GLOB.donators_by_group = list() //reinit everything var/list/donator_list = GLOB.donators_by_group //cache - var/list/tier_1 = TIER_1_DONATORS - donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list. - var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy(). + var/list/tier_3 = TIER_3_DONATORS + donator_list[DONATOR_GROUP_TIER_3] = tier_3.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list. + var/list/tier_2 = tier_3 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy(). donator_list[DONATOR_GROUP_TIER_2] = tier_2 - var/list/tier_3 = tier_2 + TIER_3_DONATORS - donator_list[DONATOR_GROUP_TIER_3] = tier_3 + var/list/tier_1 = tier_2 + TIER_1_DONATORS + donator_list[DONATOR_GROUP_TIER_1] = tier_1 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 9a36c626ba..0e0bd4ffaa 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -11,15 +11,28 @@ #ifdef TESTING #define DATUMVAR_DEBUGGING_MODE -//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //implies FIND_REF_NO_CHECK_TICK +/* +* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete. +* +* * Requires TESTING to be defined to work. +*/ +//#define REFERENCE_TRACKING -//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping +///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools. +//#define LEGACY_REFERENCE_TRACKING +#ifdef LEGACY_REFERENCE_TRACKING +///Use the legacy reference on things hard deleting by default. +//#define GC_FAILURE_HARD_LOOKUP +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif //ifdef GC_FAILURE_HARD_LOOKUP + +#endif //ifdef LEGACY_REFERENCE_TRACKING //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green -#endif +#endif //ifdef TESTING //#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER #ifndef PRELOAD_RSC //set to: diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 8225725ffd..71c2b2e13b 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -278,3 +278,8 @@ GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Ta GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) //parts in either of the above two lists that require a second option that allows them to be coloured GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color")) + +//species ids that have greyscale sprites +GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic")) + +//species ids that need snowflake coloring applied diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 4de7c88bf7..fee70ee3d5 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -41,3 +41,6 @@ GLOBAL_LIST_EMPTY(ai_status_displays) GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects GLOBAL_LIST_EMPTY(alert_consoles) // Station alert consoles, /obj/machinery/computer/station_alert + +//list of everyone playing rock paper scissors +GLOBAL_LIST_EMPTY(rockpaperscissors_players) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index ce7bc96c96..72b2d035a3 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -122,13 +122,13 @@ if(pixel_size == pixels) return pixel_size = pixels - cut_overlays(TRUE) + cut_overlays() //our icon size is 32 pixels. transform = matrix((pixels - (VOLUMETRIC_STORAGE_BOX_BORDER_SIZE * 2)) / VOLUMETRIC_STORAGE_BOX_ICON_SIZE, 0, 0, 0, 1, 0) left.pixel_x = -((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) - VOLUMETRIC_STORAGE_BOX_BORDER_SIZE right.pixel_x = ((pixels - VOLUMETRIC_STORAGE_BOX_ICON_SIZE) * 0.5) + VOLUMETRIC_STORAGE_BOX_BORDER_SIZE - add_overlay(left, TRUE) - add_overlay(right, TRUE) + add_overlay(left) + add_overlay(right) /obj/screen/storage/volumetric_edge layer = VOLUMETRIC_STORAGE_BOX_LAYER diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm index 8ace273dd8..419524c871 100644 --- a/code/_onclick/overmind.dm +++ b/code/_onclick/overmind.dm @@ -32,4 +32,4 @@ /mob/camera/blob/AltClickOn(atom/A) //Remove a blob var/turf/T = get_turf(A) if(T) - remove_blob(T) \ No newline at end of file + remove_blob(T) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index cc9c067b5d..2e3cb1ea46 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -534,4 +534,4 @@ config_entry_value = 6 /datum/config_entry/number/max_shuttle_size - config_entry_value = 250 + config_entry_value = 500 diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm index e3c415960b..7c9e7634ab 100644 --- a/code/controllers/subsystem/acid.dm +++ b/code/controllers/subsystem/acid.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(acid) if(O.acid_level && O.acid_processing()) else - O.cut_overlay(GLOB.acid_overlay, TRUE) + O.update_icon() processing -= O if (MC_TICK_CHECK) diff --git a/code/controllers/subsystem/fluid.dm b/code/controllers/subsystem/fluid.dm new file mode 100644 index 0000000000..c4fa13d693 --- /dev/null +++ b/code/controllers/subsystem/fluid.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(fluids) + name = "Fluids" + wait = 20 + stat_tag = "FD" //its actually Fluid Ducts + flags = SS_NO_INIT | SS_TICKER diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 8a1c08bc35..b46e22c1fa 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -25,7 +25,7 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING var/list/reference_find_on_fail = list() var/list/reference_find_on_fail_types = list() #endif @@ -134,7 +134,7 @@ SUBSYSTEM_DEF(garbage) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING + #ifdef LEGACY_REFERENCE_TRACKING reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) @@ -145,7 +145,9 @@ SUBSYSTEM_DEF(garbage) fail_counts[level]++ switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFERENCE_TRACKING + D.find_references() + #elif defined(LEGACY_REFERENCE_TRACKING) if(reference_find_on_fail[refID]) D.find_references() #ifdef GC_FAILURE_HARD_LOOKUP @@ -156,7 +158,19 @@ SUBSYSTEM_DEF(garbage) #endif var/type = D.type var/datum/qdel_item/I = items[type] + #ifdef TESTING + log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage + var/client/admin = c + if(!check_rights_for(admin, R_ADMIN)) + continue + to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --") testing("GC: -- \ref[src] | [type] was unable to be GC'd --") + #endif + #ifdef REFERENCE_TRACKING + GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only. + continue + #endif I.failures++ if (GC_QUEUE_HARDDELETE) HardDelete(D) @@ -181,7 +195,7 @@ SUBSYSTEM_DEF(garbage) var/gctime = world.time var/refid = "\ref[D]" -#ifdef TESTING +#ifdef LEGACY_REFERENCE_TRACKING if(reference_find_on_fail_types[D.type]) reference_find_on_fail["\ref[D]"] = TRUE #endif @@ -193,7 +207,7 @@ SUBSYSTEM_DEF(garbage) queue[refid] = gctime -#ifdef TESTING +#ifdef LEGACY_REFERENCE_TRACKING /datum/controller/subsystem/garbage/proc/add_type_to_findref(type) if(!ispath(type)) return "NOT A VAILD PATH" @@ -260,12 +274,6 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING -/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) - SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE - qdel(D, force) -#endif - // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force=FALSE, ...) @@ -319,16 +327,13 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + #ifdef LEGACY_REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() - #endif if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE - #endif + #endif else #ifdef TESTING if(!I.no_hint) @@ -339,119 +344,6 @@ SUBSYSTEM_DEF(garbage) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -#ifdef TESTING - -/datum/verb/find_refs() - set category = "Debug" - set name = "Find References" - set src in world - - find_references(FALSE) - -/datum/proc/find_references(skip_alert) - running_find_references = type - if(usr && usr.client) - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - running_find_references = null - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - return - - if(!skip_alert) - if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - running_find_references = null - return - - //this keeps the garbage collector from failing to collect objects being searched for in here - SSgarbage.can_fire = 0 - - if(usr && usr.client) - usr.client.running_find_references = type - - testing("Beginning search for references to a [type].") - last_find_references = world.time - - DoSearchVar(GLOB) //globals - for(var/datum/thing in world) //atoms (don't beleive it's lies) - DoSearchVar(thing, "World -> [thing]") - - for (var/datum/thing) //datums - DoSearchVar(thing, "World -> [thing]") - - for (var/client/thing) //clients - DoSearchVar(thing, "World -> [thing]") - - testing("Completed search for references to a [type].") - if(usr && usr.client) - usr.client.running_find_references = null - running_find_references = null - - //restart the garbage collector - SSgarbage.can_fire = 1 - SSgarbage.next_fire = world.time + world.tick_lag - -/datum/verb/qdel_then_find_references() - set category = "Debug" - set name = "qdel() then Find References" - set src in world - - qdel(src, TRUE) //Force. - if(!running_find_references) - find_references(TRUE) - -/datum/verb/qdel_then_if_fail_find_references() - set category = "Debug" - set name = "qdel() then Find References if GC failure" - set src in world - - qdel_and_find_ref_if_fail(src, TRUE) - -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) - if(usr && usr.client && !usr.client.running_find_references) - return - if (!recursive_limit) - return - - if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) - return - - D.last_find_references = last_find_references - var/list/L = D.vars - - for(var/varname in L) - if (varname == "vars") - continue - var/variable = L[varname] - - if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") - - else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> list", recursive_limit-1) - - else if(islist(X)) - var/normal = IS_NORMAL_LIST(X) - for(var/I in X) - if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") - - else if (I && !isnum(I) && normal && X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") - - else if (islist(I)) - DoSearchVar(I, "[Xname] -> list", recursive_limit-1) - -#ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK -#endif - -#endif - #ifdef TESTING /proc/writeDatumCount() var/list/datums = list() diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index 20eb2af001..ea0f82436c 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -114,67 +114,47 @@ SUBSYSTEM_DEF(overlays) #define NOT_QUEUED_ALREADY (!(flags_1 & OVERLAY_QUEUED_1)) #define QUEUE_FOR_COMPILE flags_1 |= OVERLAY_QUEUED_1; SSoverlays.queue += src; -/atom/proc/cut_overlays(priority = FALSE) - LAZYINITLIST(priority_overlays) +/atom/proc/cut_overlays() LAZYINITLIST(remove_overlays) LAZYINITLIST(add_overlays) remove_overlays = overlays.Copy() add_overlays.Cut() - if(priority) - priority_overlays.Cut() - //If not already queued for work and there are overlays to remove if(NOT_QUEUED_ALREADY && remove_overlays.len) QUEUE_FOR_COMPILE -/atom/proc/cut_overlay(list/overlays, priority) +/atom/proc/cut_overlay(list/overlays) if(!overlays) return overlays = build_appearance_list(overlays) LAZYINITLIST(add_overlays) //always initialized after this point - LAZYINITLIST(priority_overlays) LAZYINITLIST(remove_overlays) var/a_len = add_overlays.len var/r_len = remove_overlays.len - var/p_len = priority_overlays.len remove_overlays += overlays add_overlays -= overlays - - if(priority) - var/list/cached_priority = priority_overlays - LAZYREMOVE(cached_priority, overlays) - var/fa_len = add_overlays.len var/fr_len = remove_overlays.len - var/fp_len = priority_overlays.len //If not already queued and there is work to be done - if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len || fp_len != p_len)) + if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len)) QUEUE_FOR_COMPILE -/atom/proc/add_overlay(list/overlays, priority = FALSE) +/atom/proc/add_overlay(list/overlays) if(!overlays) return overlays = build_appearance_list(overlays) LAZYINITLIST(add_overlays) //always initialized after this point - LAZYINITLIST(priority_overlays) var/a_len = add_overlays.len - var/p_len = priority_overlays.len - if(priority) - priority_overlays += overlays //or in the image. Can we use [image] = image? - var/fp_len = priority_overlays.len - if(NOT_QUEUED_ALREADY && fp_len != p_len) - QUEUE_FOR_COMPILE - else - add_overlays += overlays - var/fa_len = add_overlays.len - if(NOT_QUEUED_ALREADY && fa_len != a_len) - QUEUE_FOR_COMPILE + add_overlays += overlays + var/fa_len = add_overlays.len + if(NOT_QUEUED_ALREADY && fa_len != a_len) + QUEUE_FOR_COMPILE /atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom if(!other) diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm index a4e0d7703f..ee0fd1ea00 100644 --- a/code/controllers/subsystem/processing/instruments.dm +++ b/code/controllers/subsystem/processing/instruments.dm @@ -4,16 +4,26 @@ PROCESSING_SUBSYSTEM_DEF(instruments) init_order = INIT_ORDER_INSTRUMENTS flags = SS_KEEP_TIMING priority = FIRE_PRIORITY_INSTRUMENTS - var/static/list/datum/instrument/instrument_data = list() //id = datum + /// List of all instrument data, associative id = datum + var/static/list/datum/instrument/instrument_data = list() + /// List of all song datums. var/static/list/datum/song/songs = list() + /// Max lines in songs var/static/musician_maxlines = 600 + /// Max characters per line in songs var/static/musician_maxlinechars = 300 + /// Deciseconds between hearchecks. Too high and instruments seem to lag when people are moving around in terms of who can hear it. Too low and the server lags from this. var/static/musician_hearcheck_mindelay = 5 + /// Maximum instrument channels total instruments are allowed to use. This is so you don't have instruments deadlocking all sound channels. var/static/max_instrument_channels = MAX_INSTRUMENT_CHANNELS + /// Current number of channels allocated for instruments var/static/current_instrument_channels = 0 + /// Single cached list for synthesizer instrument ids, so you don't have to have a new list with every synthesizer. + var/static/list/synthesizer_instrument_ids /datum/controller/subsystem/processing/instruments/Initialize() initialize_instrument_data() + synthesizer_instrument_ids = get_allowed_instrument_ids() return ..() /datum/controller/subsystem/processing/instruments/proc/on_song_new(datum/song/S) @@ -29,7 +39,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments) continue I = new path I.Initialize() - instrument_data[I.id || "[I.type]"] = I + if(!I.id) + qdel(I) + continue + instrument_data[I.id] = I CHECK_TICK /datum/controller/subsystem/processing/instruments/proc/get_instrument(id_or_path) diff --git a/code/datums/action.dm b/code/datums/action.dm index 0033df09d7..fbf7487e4d 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -157,7 +157,7 @@ /datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) - current_button.cut_overlays(TRUE) + current_button.cut_overlays() current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) current_button.button_icon_state = button_icon_state diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 2a24c0b451..717e99e8b2 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -40,13 +40,23 @@ reqs = list(/obj/item/paper = 20) category = CAT_CLOTHING +/datum/crafting_recipe/balaclavabreath + name = "Breathaclava" + result = /obj/item/clothing/mask/balaclava/breath + time = 10 + reqs = list(/obj/item/clothing/mask/balaclava = 1, + /obj/item/clothing/mask/breath = 1) + category = CAT_CLOTHING + + + /datum/crafting_recipe/armwraps name = "Armwraps" result = /obj/item/clothing/gloves/fingerless/pugilist time = 60 tools = list(TOOL_WIRECUTTER) reqs = list(/obj/item/stack/sheet/cloth = 4, - /obj/item/stack/sheet/durathread = 2, + /obj/item/stack/sticky_tape = 2, /obj/item/stack/sheet/leather = 2) category = CAT_CLOTHING diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 2bfb187018..f113be728d 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -2,6 +2,15 @@ //Large Objects// ///////////////// +/datum/crafting_recipe/plunger + name = "Plunger" + result = /obj/item/plunger + time = 1 + reqs = list(/obj/item/stack/sheet/plastic = 1, + /obj/item/stack/sheet/mineral/wood = 1) + category = CAT_MISC + subcategory = CAT_TOOL + /datum/crafting_recipe/showercurtain name = "Shower Curtains" reqs = list(/obj/item/stack/sheet/cloth = 2, @@ -337,7 +346,7 @@ result = /obj/item/toy/sword/cx subcategory = CAT_MISCELLANEOUS category = CAT_MISC - + /datum/crafting_recipe/catgirlplushie name = "Catgirl Plushie" reqs = list(/obj/item/toy/plush/hairball = 3) diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 51098756d3..8c4e62979b 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -119,7 +119,7 @@ UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) if(overlay) var/atom/A = parent - A.cut_overlay(overlay, TRUE) + UnregisterSignal(A,COMSIG_ATOM_UPDATE_OVERLAYS) qdel(overlay) return ..() @@ -326,7 +326,8 @@ var/matrix/M = matrix() M.Translate(pixelX, pixelY) overlay.transform = M - hit.add_overlay(overlay, TRUE) + RegisterSignal(hit,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/apply_overlay) + hit.update_icon() if(harmful) hit.visible_message("[weapon] embeds itself in [hit]!") @@ -339,6 +340,8 @@ else hit.visible_message("[weapon] sticks itself to [hit]!") +/datum/component/embedded/proc/apply_overlay(atom/source, list/overlay_list) + overlay_list += overlay /datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list) if(harmful) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm new file mode 100644 index 0000000000..6592e41103 --- /dev/null +++ b/code/datums/components/plumbing/_plumbing.dm @@ -0,0 +1,215 @@ +/datum/component/plumbing + ///Index with "1" = /datum/ductnet/theductpointingnorth etc. "1" being the num2text from NORTH define + var/list/datum/ductnet/ducts = list() + ///shortcut to our parents' reagent holder + var/datum/reagents/reagents + ///TRUE if we wanna add proper pipe outless under our parent object. this is pretty good if i may so so myself + var/use_overlays = TRUE + ///We can't just cut all of the parents' overlays, so we'll track them here + var/list/image/ducterlays + ///directions in wich we act as a supplier + var/supply_connects + ///direction in wich we act as a demander + var/demand_connects + ///FALSE to pretty much just not exist in the plumbing world so we can be moved, TRUE to go plumbo mode + var/active = FALSE + ///if TRUE connects will spin with the parent object visually and codually, so you can have it work in any direction. FALSE if you want it to be static + var/turn_connects = TRUE + +/datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes + if(parent && !istype(parent, /atom/movable)) + return COMPONENT_INCOMPATIBLE + var/atom/movable/AM = parent + if(!AM.reagents) + return COMPONENT_INCOMPATIBLE + reagents = AM.reagents + turn_connects = _turn_connects + + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED), .proc/disable) + RegisterSignal(parent, list(COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH), .proc/toggle_active) + + if(start) + enable() + + if(use_overlays) + create_overlays() + +/datum/component/plumbing/process() + if(!demand_connects || !reagents) + STOP_PROCESSING(SSfluids, src) + return + if(reagents.total_volume < reagents.maximum_volume) + for(var/D in GLOB.cardinals) + if(D & demand_connects) + send_request(D) +///Can we be added to the ductnet? +/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir) + if(!active) + return + if(!dir || !D) + return FALSE + if(num2text(dir) in ducts) + return FALSE + + return TRUE +///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour +/datum/component/plumbing/proc/send_request(dir) + process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir) +///check who can give us what we want, and how many each of them will give us +/datum/component/plumbing/proc/process_request(amount, reagent, dir) + var/list/valid_suppliers = list() + var/datum/ductnet/net + if(!ducts.Find(num2text(dir))) + return + net = ducts[num2text(dir)] + for(var/A in net.suppliers) + var/datum/component/plumbing/supplier = A + if(supplier.can_give(amount, reagent, net)) + valid_suppliers += supplier + for(var/A in valid_suppliers) + var/datum/component/plumbing/give = A + give.transfer_to(src, amount / valid_suppliers.len, reagent, net) +///returns TRUE when they can give the specified amount and reagent. called by process request +/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net) + if(amount <= 0) + return + + if(reagent) //only asked for one type of reagent + for(var/A in reagents.reagent_list) + var/datum/reagent/R = A + if(R.type == reagent) + return TRUE + else if(reagents.total_volume > 0) //take whatever + return TRUE +///this is where the reagent is actually transferred and is thus the finish point of our process() +/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + if(!reagents || !target || !target.reagents) + return FALSE + if(reagent) + reagents.trans_id_to(target.parent, reagent, amount) + else + reagents.trans_to(target.parent, amount) +///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() +/datum/component/plumbing/proc/create_overlays() + var/atom/movable/AM = parent + for(var/image/I in ducterlays) + AM.overlays.Remove(I) + qdel(I) + ducterlays = list() + for(var/D in GLOB.cardinals) + var/color + var/direction + if(D & demand_connects) + color = "red" //red because red is mean and it takes + else if(D & supply_connects) + color = "blue" //blue is nice and gives + else + continue + var/image/I + if(turn_connects) + switch(D) + if(NORTH) + direction = "north" + if(SOUTH) + direction = "south" + if(EAST) + direction = "east" + if(WEST) + direction = "west" + I = image('icons/obj/plumbing/plumbers.dmi', "[direction]-[color]", layer = AM.layer - 1) + else + I = image('icons/obj/plumbing/plumbers.dmi', color, layer = AM.layer - 1) //color is not color as in the var, it's just the name + I.dir = D + AM.add_overlay(I) + ducterlays += I +///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff +/datum/component/plumbing/proc/disable() + if(!active) + return + STOP_PROCESSING(SSfluids, src) + for(var/A in ducts) + var/datum/ductnet/D = ducts[A] + D.remove_plumber(src) + active = FALSE + for(var/D in GLOB.cardinals) + if(D & (demand_connects | supply_connects)) + for(var/obj/machinery/duct/duct in get_step(parent, D)) + duct.attempt_connect() + +///settle wherever we are, and start behaving like a piece of plumbing +/datum/component/plumbing/proc/enable() + if(active) + return + update_dir() + active = TRUE + var/atom/movable/AM = parent + for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self destruct if placed under a plumbing machine. machines disable when they get moved + if(D.anchored) //that should cover everything + D.disconnect_duct() + + if(demand_connects) + START_PROCESSING(SSfluids, src) + + for(var/D in GLOB.cardinals) + if(D & (demand_connects | supply_connects)) + for(var/atom/movable/A in get_step(parent, D)) + if(istype(A, /obj/machinery/duct)) + var/obj/machinery/duct/duct = A + duct.attempt_connect() + else + var/datum/component/plumbing/P = A.GetComponent(/datum/component/plumbing) + if(P) + direct_connect(P, D) + +/// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move +/datum/component/plumbing/proc/toggle_active(obj/O, new_state) + if(new_state) + enable() + else + disable() +/** We update our connects only when we settle down by taking our current and original direction to find our new connects +* If someone wants it to fucking spin while connected to something go actually knock yourself out +*/ +/datum/component/plumbing/proc/update_dir() + if(!turn_connects) + return + var/atom/movable/AM = parent + var/new_demand_connects + var/new_supply_connects + var/new_dir = AM.dir + var/angle = 180 - dir2angle(new_dir) + if(new_dir == SOUTH) + demand_connects = initial(demand_connects) + supply_connects = initial(supply_connects) + else + for(var/D in GLOB.cardinals) + if(D & initial(demand_connects)) + new_demand_connects += turn(D, angle) + if(D & initial(supply_connects)) + new_supply_connects += turn(D, angle) + demand_connects = new_demand_connects + supply_connects = new_supply_connects +///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH +/datum/component/plumbing/proc/get_original_direction(dir) + var/atom/movable/AM = parent + return turn(dir, dir2angle(AM.dir) - 180) +//special case in-case we want to connect directly with another machine without a duct +/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir) + if(!P.active) + return + var/opposite_dir = turn(dir, 180) + if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands + var/datum/ductnet/net = new() + net.add_plumber(src, dir) + net.add_plumber(P, opposite_dir) + +///has one pipe input that only takes, example is manual output pipe +/datum/component/plumbing/simple_demand + demand_connects = NORTH +///has one pipe output that only supplies. example is liquid pump and manual input pipe +/datum/component/plumbing/simple_supply + supply_connects = NORTH +///input and output, like a holding tank +/datum/component/plumbing/tank + demand_connects = WEST + supply_connects = EAST diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm new file mode 100644 index 0000000000..1cbe6ff017 --- /dev/null +++ b/code/datums/components/plumbing/chemical_acclimator.dm @@ -0,0 +1,21 @@ +/datum/component/plumbing/acclimator + demand_connects = WEST + supply_connects = EAST + var/obj/machinery/plumbing/acclimator/AC + +/datum/component/plumbing/acclimator/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/acclimator)) + return COMPONENT_INCOMPATIBLE + AC = parent + +/datum/component/plumbing/acclimator/can_give(amount, reagent) + . = ..() + if(. && AC.emptying) + return TRUE + return FALSE +///We're overriding process and not send_request, because all process does is do the requests, so we might aswell cut out the middle man and save some code from running +/datum/component/plumbing/acclimator/process() + if(AC.emptying) + return + . = ..() diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm new file mode 100644 index 0000000000..76b76323c5 --- /dev/null +++ b/code/datums/components/plumbing/filter.dm @@ -0,0 +1,59 @@ +///The magical plumbing component used by the chemical filters. The different supply connects behave differently depending on the filters set on the chemical filter +/datum/component/plumbing/filter + demand_connects = NORTH + supply_connects = SOUTH | EAST | WEST //SOUTH is straight, EAST is left and WEST is right. We look from the perspective of the insert + +/datum/component/plumbing/filter/Initialize() + . = ..() + if(!istype(parent, /obj/machinery/plumbing/filter)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/filter/can_give(amount, reagent, datum/ductnet/net) + . = ..() + if(.) + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) //we need it relative to the direction, so filters don't change when we turn the filter + break + if(!direction) + return FALSE + if(reagent) + if(!can_give_in_direction(direction, reagent)) + return FALSE + +/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + if(!reagents || !target || !target.reagents) + return FALSE + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + if(reagent) + reagents.trans_id_to(target.parent, reagent, amount) + else + for(var/A in reagents.reagent_list) + var/datum/reagent/R = A + if(!can_give_in_direction(direction, R.type)) + continue + var/new_amount + if(R.volume < amount) + new_amount = amount - R.volume + reagents.trans_id_to(target.parent, R.type, amount) + amount = new_amount + if(amount <= 0) + break +///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours +/datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent) + var/obj/machinery/plumbing/filter/F = parent + switch(dir) + if(SOUTH) //straight + if(!F.left.Find(reagent) && !F.right.Find(reagent)) + return TRUE + if(WEST) //right + if(F.right.Find(reagent)) + return TRUE + if(EAST) //left + if(F.left.Find(reagent)) + return TRUE diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm new file mode 100644 index 0000000000..90f4e621da --- /dev/null +++ b/code/datums/components/plumbing/reaction_chamber.dm @@ -0,0 +1,38 @@ +/datum/component/plumbing/reaction_chamber + demand_connects = WEST + supply_connects = EAST + +/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _turn_connects=TRUE) + . = ..() + if(!istype(parent, /obj/machinery/plumbing/reaction_chamber)) + return COMPONENT_INCOMPATIBLE + +/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) + . = ..() + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(!. || !RC.emptying) + return FALSE + +/datum/component/plumbing/reaction_chamber/send_request(dir) + var/obj/machinery/plumbing/reaction_chamber/RC = parent + if(RC.emptying || !LAZYLEN(RC.required_reagents)) + return + for(var/RT in RC.required_reagents) + var/has_reagent = FALSE + for(var/A in reagents.reagent_list) + var/datum/reagent/RD = A + if(RT == RD.type) + has_reagent = TRUE + if(RD.volume < RC.required_reagents[RT]) + process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir) + return + if(!has_reagent) + process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir) + return + + RC.reagent_flags &= ~NO_REACT + reagents.handle_reactions() + + RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update + //everything for every chemical removed, wich isn't a good option either. + RC.on_reagent_change() //We need to check it now, because some reactions leave nothing left. diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm new file mode 100644 index 0000000000..7194e8803b --- /dev/null +++ b/code/datums/components/plumbing/splitter.dm @@ -0,0 +1,45 @@ +/datum/component/plumbing/splitter + demand_connects = NORTH + supply_connects = SOUTH | EAST + +/datum/component/plumbing/splitter/Initialize() + . = ..() + if(. && !istype(parent, /obj/machinery/plumbing/splitter)) + return FALSE + +/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net) + . = ..() + if(!.) + return + . = FALSE + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(S.turn_straight && S.transfer_straight <= amount) + S.turn_straight = FALSE + return TRUE + if(EAST) + if(!S.turn_straight && S.transfer_side <= amount) + S.turn_straight = TRUE + return TRUE + +/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) + var/direction + for(var/A in ducts) + if(ducts[A] == net) + direction = get_original_direction(text2num(A)) + break + var/obj/machinery/plumbing/splitter/S = parent + switch(direction) + if(SOUTH) + if(amount >= S.transfer_straight) + amount = S.transfer_straight + if(EAST) + if(amount >= S.transfer_side) + amount = S.transfer_side + . = ..() diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 2052e57f49..3cf70e80ef 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -14,6 +14,7 @@ var/mob/living/holder //who is currently benefiting from the shield. var/dissipating = FALSE //Is this shield meant to dissipate over time instead of recharging. var/del_on_overload = FALSE //will delete itself once it has no charges left. + var/cached_vis_overlay //text identifier of the visual overlay. /datum/component/shielded/Initialize(current, max = 3, delay = 20 SECONDS, rate = 1, slots, state = "shield-old", broken, \ sound = 'sound/magic/charge.ogg', end_sound = 'sound/machines/ding.ogg', diss = FALSE, del_overload = FALSE) @@ -47,9 +48,8 @@ holder = L var/to_add = charges >= 1 ? shield_state : broken_state if(to_add) - var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) - M.layer = (L.layer > MOB_LAYER ? L.layer : MOB_LAYER) + 0.01 - holder.add_overlay(M, TRUE) + var/layer = (L.layer > MOB_LAYER ? L.layer : MOB_LAYER) + 0.01 + SSvis_overlays.add_vis_overlay(L, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, L.dir) /datum/component/shielded/UnregisterFromParent() . = ..() @@ -57,9 +57,9 @@ UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK,COMSIG_ITEM_CHECK_BLOCK,COMSIG_ITEM_EQUIPPED,COMSIG_ITEM_DROPPED)) if(holder) UnregisterSignal(holder, list(COMSIG_LIVING_RUN_BLOCK, COMSIG_LIVING_GET_BLOCKING_ITEMS)) - var/to_remove = charges >= 1 ? shield_state : broken_state - if(to_remove) - holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + if(cached_vis_overlay) + SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay) + cached_vis_overlay = null holder = null /datum/component/shielded/process() @@ -80,7 +80,7 @@ holder.visible_message("[holder]'s shield overloads!") qdel(src) return - if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)) + if(holder && ((old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1))) update_shield_overlay(charges < 1) /datum/component/shielded/proc/adjust_charges(amount) @@ -93,20 +93,19 @@ holder.visible_message("[holder]'s shield overloads!") qdel(src) return - if(holder && (old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1)) + if(holder && ((old_charges < 1 && charges >= 1) || (!del_on_overload && old_charges >= 1 && charges < 1))) update_shield_overlay(charges < 1) /datum/component/shielded/proc/update_shield_overlay(broken) if(!holder) return - var/to_remove = broken ? shield_state : broken_state var/to_add = broken ? broken_state : shield_state - if(to_remove) - holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + if(cached_vis_overlay) + SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay) + cached_vis_overlay = null if(to_add) - var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) - M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 - holder.add_overlay(M, TRUE) + var/layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 + SSvis_overlays.add_vis_overlay(holder, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, holder.dir) /datum/component/shielded/proc/on_equip(obj/item/source, mob/living/equipper, slot) if(!(accepted_slots & slotdefine2slotbit(slot))) @@ -117,17 +116,16 @@ RegisterSignal(equipper, COMSIG_LIVING_GET_BLOCKING_ITEMS, .proc/include_shield) var/to_add = charges >= 1 ? shield_state : broken_state if(to_add) - var/mutable_appearance/M = mutable_appearance('icons/effects/effects.dmi', to_add) - M.layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 - equipper.add_overlay(M, TRUE) + var/layer = (holder.layer > MOB_LAYER ? holder.layer : MOB_LAYER) + 0.01 + cached_vis_overlay = SSvis_overlays.add_vis_overlay(holder, 'icons/effects/effects.dmi', to_add, layer, GAME_PLANE, holder.dir) /datum/component/shielded/proc/on_drop(obj/item/source, mob/dropper) if(holder == dropper) UnregisterSignal(holder, COMSIG_LIVING_GET_BLOCKING_ITEMS) UnregisterSignal(parent, list(COMSIG_ITEM_RUN_BLOCK, COMSIG_ITEM_CHECK_BLOCK)) - var/to_remove = charges >= 1 ? shield_state : broken_state - if(to_remove) - holder.cut_overlay(mutable_appearance('icons/effects/effects.dmi', to_remove), TRUE) + if(cached_vis_overlay) + SSvis_overlays.remove_vis_overlay(holder, cached_vis_overlay) + cached_vis_overlay = null holder = null /datum/component/shielded/proc/include_shield(mob/source, list/items) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 348f9e6778..a91549ab4c 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -31,6 +31,9 @@ VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player") VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element") VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits") + #ifdef REFERENCE_TRACKING + VV_DROPDOWN_OPTION(VV_HK_VIEW_REFERENCES, "View References") + #endif //This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks! //href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables! diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm new file mode 100644 index 0000000000..14a74a67c4 --- /dev/null +++ b/code/datums/ductnet.dm @@ -0,0 +1,65 @@ +///We handle the unity part of plumbing. We track who is connected to who. +/datum/ductnet + var/list/suppliers = list() + var/list/demanders = list() + var/list/obj/machinery/duct/ducts = list() + + var/capacity +///Add a duct to our network +/datum/ductnet/proc/add_duct(obj/machinery/duct/D) + if(!D || (D in ducts)) + return + ducts += D + D.duct = src +///Remove a duct from our network and commit suicide, because this is probably easier than to check who that duct was connected to and what part of us was lost +/datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting) + destroy_network(FALSE) + for(var/obj/machinery/duct/D in ducting.neighbours) + addtimer(CALLBACK(D, /obj/machinery/duct/proc/reconnect), 0) //all needs to happen after the original duct that was destroyed finishes destroying itself + addtimer(CALLBACK(D, /obj/machinery/duct/proc/generate_connects), 0) + qdel(src) +///add a plumbing object to either demanders or suppliers +/datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir) + if(!P.can_add(src, dir)) + return FALSE + P.ducts[num2text(dir)] = src + if(dir & P.supply_connects) + suppliers += P + else if(dir & P.demand_connects) + demanders += P + return TRUE +///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects +/datum/ductnet/proc/remove_plumber(datum/component/plumbing/P) + suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine + demanders.Remove(P) + + for(var/dir in P.ducts) + if(P.ducts[dir] == src) + P.ducts -= dir + if(!ducts.len) //there were no ducts, so it was a direct connection. we destroy ourselves since a ductnet with only one plumber and no ducts is worthless + destroy_network() +///we combine ductnets. this occurs when someone connects to seperate sets of fluid ducts +/datum/ductnet/proc/assimilate(datum/ductnet/D) + ducts.Add(D.ducts) + suppliers.Add(D.suppliers) + demanders.Add(D.demanders) + for(var/A in D.suppliers + D.demanders) + var/datum/component/plumbing/P = A + for(var/s in P.ducts) + if(P.ducts[s] != D) + continue + P.ducts[s] = src //all your ducts are belong to us + for(var/A in D.ducts) + var/obj/machinery/duct/M = A + M.duct = src //forget your old master + + destroy_network() +///destroy the network and tell all our ducts and plumbers we are gone +/datum/ductnet/proc/destroy_network(delete=TRUE) + for(var/A in suppliers + demanders) + remove_plumber(A) + for(var/A in ducts) + var/obj/machinery/duct/D = A + D.duct = null + if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide + qdel(src) diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm index 4bd482915a..50519b08e7 100644 --- a/code/datums/elements/decal.dm +++ b/code/datums/elements/decal.dm @@ -33,39 +33,34 @@ if(description) RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/examine) - apply(A, TRUE) - num_decals_per_atom[A]++ + apply(A) /datum/element/decal/Detach(datum/target) var/atom/A = target - remove(A, A.dir) - UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE)) - LAZYREMOVE(num_decals_per_atom, A) + num_decals_per_atom[A]-- + apply(A, TRUE) + if(!num_decals_per_atom[A]) + UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS)) + LAZYREMOVE(num_decals_per_atom, A) return ..() -/datum/element/decal/proc/remove(atom/target, old_dir) - pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(old_dir)) - for(var/i in 1 to num_decals_per_atom[target]) - target.cut_overlay(pic, TRUE) +/datum/element/decal/proc/apply(atom/target, removing = FALSE) + if(num_decals_per_atom[target] == 1 && !removing) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlay, TRUE) + target.update_icon() if(isitem(target)) addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) -/datum/element/decal/proc/apply(atom/target, init = FALSE) - pic.dir = first_dir == NORTH ? target.dir : turn(first_dir, dir2angle(target.dir)) - if(init) - target.add_overlay(pic, TRUE) - else - for(var/i in 1 to num_decals_per_atom[target]) - target.add_overlay(pic, TRUE) - if(isitem(target)) - addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) +/datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list) + pic.dir = first_dir == NORTH ? source.dir : turn(first_dir, dir2angle(source.dir)) + for(var/i in 1 to num_decals_per_atom[source]) + overlay_list += pic -/datum/element/decal/proc/rotate_react(datum/source, old_dir, new_dir) +/datum/element/decal/proc/rotate_react(atom/source, old_dir, new_dir) if(old_dir == new_dir) return - remove(source, old_dir) - apply(source) + source.update_icon() /datum/element/decal/proc/clean_react(datum/source, strength) if(strength >= cleanable) diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 978802fd80..ad08b8ebdc 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -90,6 +90,8 @@ to_chat(user, "You catch some drifting memories of their past conversations...") for(var/spoken_memory in recent_speech) to_chat(user, "[recent_speech[spoken_memory]]") + if(usr in GLOB.rockpaperscissors_players) + to_chat(user, "They're planning on playing [GLOB.rockpaperscissors_players[usr][1]]") if(iscarbon(M)) var/mob/living/carbon/human/H = M to_chat(user, "You find that their intent is to [H.a_intent]...") diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 6cef7ac50f..179adf46bd 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -53,8 +53,6 @@ /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder - if(!A.hasSiliconAccessInArea(user) && A.isElectrified() && A.shock(user, 100)) - return FALSE if(A.panel_open) return TRUE @@ -73,6 +71,8 @@ /datum/wires/airlock/on_pulse(wire) set waitfor = FALSE var/obj/machinery/door/airlock/A = holder + if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100)) + return FALSE switch(wire) if(WIRE_POWER1, WIRE_POWER2) // Pulse to loose power. A.loseMainPower() @@ -127,6 +127,8 @@ /datum/wires/airlock/on_cut(wire, mend) var/obj/machinery/door/airlock/A = holder + if(!A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100)) + return FALSE switch(wire) if(WIRE_POWER1, WIRE_POWER2) // Cut to loose power, repair all to gain power. if(mend && !is_cut(WIRE_POWER1) && !is_cut(WIRE_POWER2)) @@ -174,4 +176,4 @@ A.update_icon() if(WIRE_ZAP1, WIRE_ZAP2) // Ouch. if(isliving(usr)) - A.shock(usr, 50) \ No newline at end of file + A.shock(usr, 50) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6e1692c17e..8a66394ecc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -26,7 +26,6 @@ var/list/atom_colours //used to store the different colors on an atom //its inherent color, the colored paint applied on it, special color effect etc... - var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. var/list/remove_overlays // a very temporary list of overlays to remove var/list/add_overlays // a very temporary list of overlays to add @@ -145,7 +144,6 @@ qdel(reagents) LAZYCLEARLIST(overlays) - LAZYCLEARLIST(priority_overlays) for(var/i in targeted_by) var/mob/M = i @@ -1128,4 +1126,4 @@ * Override this if you want custom behaviour in whatever gets hit by the rust */ /atom/proc/rust_heretic_act() - return + return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0238529195..0a6c2b9eca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -646,3 +646,10 @@ animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING) sleep(1) animate(I, alpha = 0, transform = matrix(), time = 1) + +/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran + SHOULD_CALL_PARENT(TRUE) + if(anchored == anchorvalue) + return + . = anchored + anchored = anchorvalue diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm index 561b38fde1..148de9568a 100644 --- a/code/game/gamemodes/dynamic/dynamic_storytellers.dm +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -50,10 +50,6 @@ Property weights are: for(var/r in SSevents.running) var/datum/round_event/R = r threat += R.threat() - for(var/mob/living/simple_animal/hostile/H in GLOB.mob_living_list) - var/turf/T = get_turf(H) - if(H.stat != DEAD && is_station_level(T.z) && !("Station" in H.faction)) - threat += H.threat() for(var/obj/item/phylactery/P in GLOB.poi_list) threat += 25 // can't be giving them too much of a break for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS]) @@ -91,6 +87,8 @@ Property weights are: mean += 2.5 if(CHAOS_MAX) mean += 5 + else + voters += 0.5 if(voters) GLOB.dynamic_curve_centre += (mean/voters) if(flags & USE_PREV_ROUND_WEIGHTS) @@ -128,7 +126,8 @@ Property weights are: for(var/property in property_weights) if(property in rule.property_weights) // just treat it as 0 if it's not in there property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = (rule.get_weight() * property_weight)*rule.weight_mult + if(property_weight > 0) + drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult return drafted_rules /datum/dynamic_storyteller/proc/midround_draft() @@ -140,25 +139,26 @@ Property weights are: if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) continue rule.trim_candidates() - var/threat_weight = 1 - if(!(rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway - var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) - /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to - pick this particular ruleset. - Let's use a toy example: there's 60 threat level and 10 threat spent. - We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets. - Ruleset 1 has 30 cost, ruleset 2 has 5 cost. - When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1 - is 2.26 times as likely to be picked, all other things considered. - Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight. - */ - threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) - if(property in rule.property_weights) + if(property in rule.property_weights) // just treat it as 0 if it's not in there property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1) + if(property_weight > 0) + var/threat_weight = 1 + if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) // makes the traitor rulesets always possible anyway + var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) + /* Basically, the closer the cost is to the current threat-level-away-from-threat, the more likely it is to + pick this particular ruleset. + Let's use a toy example: there's 60 threat level and 10 threat spent. + We want to pick a ruleset that's close to that, so we run the below equation, on two rulesets. + Ruleset 1 has 30 cost, ruleset 2 has 5 cost. + When we do the math, ruleset 1's threat_weight is 0.538, and ruleset 2's is 0.238, meaning ruleset 1 + is 2.26 times as likely to be picked, all other things considered. + Of course, we don't want it to GUARANTEE the closest, that's no fun, so it's just a weight. + */ + threat_weight = abs(1-abs(1-LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) + drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight return drafted_rules /datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer) @@ -175,28 +175,29 @@ Property weights are: rule.candidates = list(newPlayer) rule.trim_candidates() - var/threat_weight = 1 - if(!(rule.flags & MINOR_RULESET)) - var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) - threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) if (rule.ready()) var/property_weight = 0 for(var/property in property_weights) if(property in rule.property_weights) property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = round(((rule.get_weight() * property_weight)*rule.weight_mult*threat_weight)*1000,1) + if(property_weight > 0) + var/threat_weight = 1 + if(!(rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET)) + var/cost_difference = abs(rule.cost-(mode.threat_level-mode.threat)) + threat_weight = 1-abs(1-(LOGISTIC_FUNCTION(2,0.05,cost_difference,0))) + drafted_rules[rule] = rule.get_weight() * property_weight * rule.weight_mult * threat_weight return drafted_rules /datum/dynamic_storyteller/proc/event_draft() var/list/drafted_rules = list() for(var/datum/dynamic_ruleset/event/rule in mode.events) - if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level - mode.threat) >= rule.cost) - if(rule.ready()) - var/property_weight = 0 - for(var/property in property_weights) - if(property in rule.property_weights) - property_weight += rule.property_weights[property] * property_weights[property] - drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && (mode.threat_level + 20 - mode.threat) >= rule.cost && rule.ready()) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) + property_weight += rule.property_weights[property] * property_weights[property] + if(property_weight > 0) + drafted_rules[rule] = rule.get_weight() + property_weight * rule.weight_mult return drafted_rules @@ -313,9 +314,8 @@ Property weights are: /datum/dynamic_storyteller/random/event_draft() var/list/drafted_rules = list() for(var/datum/dynamic_ruleset/event/rule in mode.events) - if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level)) - if(rule.ready()) - drafted_rules[rule] = 1 + if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && rule.ready()) + drafted_rules[rule] = 1 return drafted_rules /datum/dynamic_storyteller/story @@ -330,7 +330,7 @@ Property weights are: /datum/dynamic_storyteller/story/calculate_threat() var/current_time = (world.time / SSautotransfer.targettime)*180 - mode.threat_level = round(mode.initial_threat_level*(sin(current_time)+0.25),0.1) + mode.threat_level = round((mode.initial_threat_level*(sin(current_time)/2)+0.75),0.1) return ..() /datum/dynamic_storyteller/classic diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index bd4ac5f2d1..2b7411d03f 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -117,6 +117,7 @@ Class Procs: var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine. var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + var/wire_compatible = FALSE // For storing and overriding ui id and dimensions var/tgui_id // ID of TGUI interface var/ui_style // ID of custom TGUI style (optional) @@ -433,6 +434,7 @@ Class Procs: to_chat(user, "You [anchored ? "un" : ""]secure [src].") setAnchored(!anchored) playsound(src, 'sound/items/deconstruct.ogg', 50, 1) + SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored) return SUCCESSFUL_UNFASTEN return FAILED_UNFASTEN return CANT_UNFASTEN diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index bf71786a05..ff6f96a29f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -3,13 +3,14 @@ /obj/machinery/iv_drip name = "\improper IV drip" - desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate." + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. Alt-Click to change the transfer rate." icon = 'icons/obj/iv_drip.dmi' icon_state = "iv_drip" anchored = FALSE mouse_drag_pointer = MOUSE_ACTIVE_POINTER var/mob/living/carbon/attached var/mode = IV_INJECTING + var/dripfeed = FALSE var/obj/item/reagent_containers/beaker var/static/list/drip_containers = typecacheof(list(/obj/item/reagent_containers/blood, /obj/item/reagent_containers/food, @@ -132,9 +133,11 @@ if(mode) if(beaker.reagents.total_volume) var/transfer_amount = 5 + if (dripfeed) + transfer_amount = 1 if(istype(beaker, /obj/item/reagent_containers/blood)) // speed up transfer on blood packs - transfer_amount = 10 + transfer_amount *= 2 var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume beaker.reagents.reaction(attached, INJECT, fraction, FALSE) //make reagents reacts, but don't spam messages beaker.reagents.trans_to(attached, transfer_amount) @@ -169,6 +172,16 @@ else toggle_mode() +/obj/machinery/iv_drip/AltClick(mob/living/user) + if(!user.canUseTopic(src, be_close=TRUE)) + return + if(dripfeed) + dripfeed = FALSE + to_chat(usr, "You loosen the valve to speed up the [src].") + else + dripfeed = TRUE + to_chat(usr, "You tighten the valve to slowly drip-feed the contents of [src].") + /obj/machinery/iv_drip/attack_robot(mob/user) if(Adjacent(user)) attack_hand(user) @@ -227,7 +240,7 @@ /obj/machinery/iv_drip/telescopic name = "telescopic IV drip" - desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down." + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down.Alt-Click with a beaker attached to change the transfer rate." icon_state = "iv_drip" /obj/machinery/iv_drip/telescopic/update_icon_state() diff --git a/code/game/objects/effects/effect_system/effects_sparks.dm b/code/game/objects/effects/effect_system/effects_sparks.dm index 19b0dc76dd..a388d3bc67 100644 --- a/code/game/objects/effects/effect_system/effects_sparks.dm +++ b/code/game/objects/effects/effect_system/effects_sparks.dm @@ -63,3 +63,23 @@ /datum/effect_system/lightning_spread effect_type = /obj/effect/particle_effect/sparks/electricity + +//fake sparks, not subtyped because we don't want light/heat, nor checks inside an often used proc for a rare subcase for saving like 10 lines of code +/obj/effect/particle_effect/fake_sparks + name = "lightning" + icon_state = "electricity" + +/obj/effect/particle_effect/fake_sparks/Initialize() + . = ..() + flick(icon_state, src) // replay the animation + playsound(src, "sparks", 100, TRUE) + QDEL_IN(src, 20) + +/datum/effect_system/fake_spark_spread + effect_type = /obj/effect/particle_effect/fake_sparks + +/proc/do_fake_sparks(n, c, source) + var/datum/effect_system/fake_spark_spread/sparks = new + sparks.set_up(n, c, source) + sparks.autocleanup = TRUE + sparks.start() diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 2fbb45173b..c89e318714 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -135,6 +135,14 @@ RLD flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light return . + +/obj/item/construction/proc/check_menu(mob/living/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + /obj/item/construction/proc/range_check(atom/A, mob/user) if(!(A in range(custom_range, get_turf(user)))) to_chat(user, "The \'Out of Range\' light on [src] blinks red.") @@ -276,13 +284,6 @@ RLD //Not scaling these down to button size because they look horrible then, instead just bumping up radius. return MA -/obj/item/construction/rcd/proc/check_menu(mob/living/user) - if(!istype(user)) - return FALSE - if(user.incapacitated() || !user.Adjacent(src)) - return FALSE - return TRUE - /obj/item/construction/rcd/proc/change_computer_dir(mob/user) if(!user) return @@ -856,6 +857,82 @@ RLD desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells." upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS +/obj/item/construction/plumbing + name = "Plumbing Constructor" + desc = "An expertly modified RCD outfitted to construct plumbing machinery. Reload with compressed matter cartridges." + icon = 'icons/obj/tools.dmi' + icon_state = "arcd" + item_state = "oldrcd" + has_ammobar = FALSE + matter = 200 + max_matter = 200 + + ///type of the plumbing machine + var/blueprint = null + ///index, used in the attack self to get the type. stored here since it doesnt change + var/list/choices = list() + ///index, used in the attack self to get the type. stored here since it doesnt change + var/list/name_to_type = list() + /// + var/list/machinery_data = list("cost" = list(), "delay" = list()) + +/obj/item/construction/plumbing/attack_self(mob/user) + ..() + if(!choices.len) + for(var/A in subtypesof(/obj/machinery/plumbing)) + var/obj/machinery/plumbing/M = A + if(initial(M.rcd_constructable)) + choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state))) + name_to_type[initial(M.name)] = M + machinery_data["cost"][A] = initial(M.rcd_cost) + machinery_data["delay"][A] = initial(M.rcd_delay) + + var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + if(!check_menu(user)) + return + + blueprint = name_to_type[choice] + playsound(src, 'sound/effects/pop.ogg', 50, FALSE) + to_chat(user, "You change [name]s blueprint to '[choice]'.") + +///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type +/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user) + if(!machinery_data || !isopenturf(A)) + return FALSE + + if(checkResource(machinery_data["cost"][blueprint], user) && blueprint) + if(do_after(user, machinery_data["delay"][blueprint], target = A)) + if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(A)) + useResource(machinery_data["cost"][blueprint], user) + activate() + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + new blueprint (A, FALSE, FALSE) + return TRUE + +/obj/item/construction/plumbing/proc/canPlace(turf/T) + if(!isopenturf(T)) + return FALSE + . = TRUE + for(var/obj/O in T.contents) + if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion + return FALSE + +/obj/item/construction/plumbing/afterattack(atom/A, mob/user) + . = ..() + if(!range_check(A, user)) + return + if(istype(A, /obj/machinery/plumbing)) + var/obj/machinery/plumbing/P = A + if(P.anchored) + to_chat(user, "The [P.name] needs to be unanchored!") + return + if(do_after(user, 20, target = P)) + P.deconstruct() //Let's not substract matter + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect + else + create_machine(A, user) + + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index b3d5ed431a..70e4441c66 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -6,6 +6,7 @@ RPD #define ATMOS_CATEGORY 0 #define DISPOSALS_CATEGORY 1 #define TRANSIT_CATEGORY 2 +#define PLUMBING_CATEGORY 3 #define BUILD_MODE (1<<0) #define WRENCH_MODE (1<<1) @@ -75,6 +76,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( ) )) +GLOBAL_LIST_INIT(fluid_duct_recipes, list( + "Fluid Ducts" = list( + new /datum/pipe_info/plumbing("Duct", /obj/machinery/duct, PIPE_ONEDIR), + new /datum/pipe_info/plumbing/multilayer("Duct Layer-Manifold",/obj/machinery/duct/multilayered, PIPE_STRAIGHT) + ) +)) + /datum/pipe_info var/name var/icon_state @@ -175,6 +183,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(dt == PIPE_UNARY_FLIPPABLE) icon_state = "[icon_state]_preview" +/datum/pipe_info/plumbing/New(label, obj/path, dt=PIPE_UNARY) + name = label + id = path + icon_state = initial(path.icon_state) + dirtype = dt + +/datum/pipe_info/plumbing/multilayer //exists as identifier so we can see the difference between multi_layer and just ducts properly later on + + /obj/item/pipe_dispenser name = "Rapid Piping Device (RPD)" desc = "A device used to rapidly pipe things." @@ -200,15 +217,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/atmos_build_speed = 5 //deciseconds (500ms) var/disposal_build_speed = 5 var/transit_build_speed = 5 + var/plumbing_build_speed = 5 var/destroy_speed = 5 var/paint_speed = 5 var/category = ATMOS_CATEGORY var/piping_layer = PIPING_LAYER_DEFAULT + var/ducting_layer = DUCT_LAYER_DEFAULT var/datum/pipe_info/recipe var/static/datum/pipe_info/first_atmos var/static/datum/pipe_info/first_disposal var/static/datum/pipe_info/first_transit var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE + var/static/datum/pipe_info/first_plumbing + var/locked = FALSE //wheter we can change categories. Useful for the plumber /obj/item/pipe_dispenser/New() . = ..() @@ -253,12 +274,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( var/list/data = list( "category" = category, "piping_layer" = piping_layer, - // "ducting_layer" = ducting_layer, //uhh is this for chem thing? + + "ducting_layer" = ducting_layer, + "preview_rows" = recipe.get_preview(p_dir), "categories" = list(), "selected_color" = paint_color, "paint_colors" = GLOB.pipe_paint_colors, - "mode" = mode + "mode" = mode, + "locked" = locked ) var/list/recipes @@ -269,6 +293,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( recipes = GLOB.disposal_pipe_recipes if(TRANSIT_CATEGORY) recipes = GLOB.transit_tube_recipes + if(PLUMBING_CATEGORY) + recipes = GLOB.fluid_duct_recipes for(var/c in recipes) var/list/cat = recipes[c] var/list/r = list() @@ -297,6 +323,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( recipe = first_atmos if(TRANSIT_CATEGORY) recipe = first_transit + if(PLUMBING_CATEGORY) + recipe = first_plumbing p_dir = NORTH playeffect = FALSE if("piping_layer") @@ -468,16 +496,56 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(mode & WRENCH_MODE) tube.wrench_act(user, src) return - + if(PLUMBING_CATEGORY) //Plumbing. + if(!can_make_pipe) + return ..() + A = get_turf(A) + if(isclosedturf(A)) + to_chat(user, "[src]'s error light flickers; there's something in the way!") + return + to_chat(user, "You start building a fluid duct...") + playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) + if(do_after(user, plumbing_build_speed, target = A)) + var/obj/machinery/duct/D + if(recipe.type == /datum/pipe_info/plumbing/multilayer) + var/temp_connects = NORTH + SOUTH + if(queued_p_dir == EAST) + temp_connects = EAST + WEST + D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer, temp_connects) + else + D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer) + D.add_fingerprint(usr) + if(mode & WRENCH_MODE) + D.wrench_act(user, src) else return ..() /obj/item/pipe_dispenser/proc/activate() playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1) +/* unneeded, you can craft ducts from plastic +/obj/item/pipe_dispenser/plumbing + name = "Plumberinator" + desc = "A crude device to rapidly plumb things." + icon_state = "plumberer" + category = PLUMBING_CATEGORY + locked = TRUE + +/obj/item/pipe_dispenser/plumbing/Initialize() + . = ..() + spark_system = new + spark_system.set_up(5, 0, src) + spark_system.attach(src) + if(!first_plumbing) + first_plumbing = GLOB.fluid_duct_recipes[GLOB.fluid_duct_recipes[1]][1] + + recipe = first_plumbing + +*/ #undef ATMOS_CATEGORY #undef DISPOSALS_CATEGORY #undef TRANSIT_CATEGORY +#undef PLUMBING_CATEGORY #undef BUILD_MODE #undef DESTROY_MODE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 56eb25f953..37d19783b5 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -48,6 +48,13 @@ /obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/medipen_refiller + name = "Medipen Refiller (Machine Board)" + icon_state = "medical" + build_path = /obj/machinery/medipen_refiller + req_components = list( + /obj/item/stock_parts/matter_bin = 1) + /obj/item/circuitboard/machine/clonepod name = "Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod @@ -512,6 +519,10 @@ /obj/item/stack/sheet/glass = 1) needs_anchored = FALSE +/obj/item/circuitboard/machine/hydroponics/automagic + name = "Automatic Hydroponics Tray (Machine Board)" + build_path = /obj/machinery/hydroponics/constructable/automagic + /obj/item/circuitboard/machine/seed_extractor name = "Seed Extractor (Machine Board)" build_path = /obj/machinery/seed_extractor diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index a2b0e3edd4..014487332c 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -60,7 +60,8 @@ if(target) if(!QDELETED(target)) location = get_turf(target) - target.cut_overlay(plastic_overlay, TRUE) + target.cut_overlay(plastic_overlay) + UnregisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_plastic_overlay) if(!ismob(target) || full_damage_on_mobs) target.ex_act(EXPLODE_HEAVY, target) else @@ -126,13 +127,17 @@ I.embedding["embed_chance"] = 0 I.updateEmbedding() - target.add_overlay(plastic_overlay, TRUE) + RegisterSignal(target, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_plastic_overlay) + target.update_icon() if(!nadeassembly) to_chat(user, "You plant the bomb. Timer counting down from [det_time].") addtimer(CALLBACK(src, .proc/prime), det_time*10) else qdel(src) //How? +/obj/item/grenade/plastic/proc/add_plastic_overlay(atom/source, list/overlay_list) + overlay_list += plastic_overlay + /obj/item/grenade/plastic/proc/shout_syndicate_crap(mob/M) if(!M) return diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index a7f7e3152c..6f1aec287b 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -47,8 +47,11 @@ spawn_option(stored_options[choice],M) qdel(src) -/obj/item/choice_beacon/proc/spawn_option(obj/choice,mob/living/M) - var/obj/new_item = new choice() +/obj/item/choice_beacon/proc/create_choice_atom(atom/choice, mob/owner) + return new choice() + +/obj/item/choice_beacon/proc/spawn_option(atom/choice,mob/living/M) + var/obj/new_item = create_choice_atom(choice, M) var/obj/structure/closet/supplypod/bluespacepod/pod = new() pod.explosionSize = list(0,0,0,0) new_item.forceMove(pod) @@ -152,10 +155,50 @@ augment_list[initial(A.name)] = A return augment_list -/obj/item/choice_beacon/augments/spawn_option(obj/choice,mob/living/M) +/obj/item/choice_beacon/augments/spawn_option(atom/choice,mob/living/M) new choice(get_turf(M)) to_chat(M, "You hear something crackle from the beacon for a moment before a voice speaks. \"Please stand by for a message from S.E.L.F. Message as follows: Item request received. Your package has been transported, use the autosurgeon supplied to apply the upgrade. Message ends.\"") +/obj/item/choice_beacon/pet //donator beacon that summons a small friendly animal + name = "pet beacon" + desc = "Straight from the outerspace pet shop to your feet." + var/static/list/pets = list("Crab" = /mob/living/simple_animal/crab, + "Cat" = /mob/living/simple_animal/pet/cat, + "Space cat" = /mob/living/simple_animal/pet/cat/space, + "Kitten" = /mob/living/simple_animal/pet/cat/kitten, + "Dog" = /mob/living/simple_animal/pet/dog, + "Corgi" = /mob/living/simple_animal/pet/dog/corgi, + "Pug" = /mob/living/simple_animal/pet/dog/pug, + "Exotic Corgi" = /mob/living/simple_animal/pet/dog/corgi/exoticcorgi, + "Fox" = /mob/living/simple_animal/pet/fox, + "Red Panda" = /mob/living/simple_animal/pet/redpanda, + "Possum" = /mob/living/simple_animal/opossum) + var/pet_name + +/obj/item/choice_beacon/pet/generate_display_names() + return pets + +/obj/item/choice_beacon/pet/create_choice_atom(atom/choice, mob/owner) + var/mob/living/simple_animal/new_choice = new choice() + new_choice.butcher_results = null //please don't eat your pet, chef + var/obj/item/pet_carrier/donator/carrier = new() //a donator pet carrier is just a carrier that can't be shoved in an autolathe for metal + carrier.add_occupant(new_choice) + new_choice.mob_size = MOB_SIZE_TINY //yeah we're not letting you use this roundstart pet to hurt people / knock them down + new_choice.pass_flags = PASSTABLE | PASSMOB //your pet is not a bullet/person shield + new_choice.density = FALSE + new_choice.blood_volume = 0 //your pet cannot be used to drain blood from for a bloodsucker + new_choice.desc = "A pet [initial(choice.name)], owned by [owner]!" + new_choice.can_have_ai = FALSE //no it cant be sentient damnit + if(pet_name) + new_choice.name = pet_name + new_choice.unique_name = TRUE + return carrier + +/obj/item/choice_beacon/pet/spawn_option(atom/choice,mob/living/M) + pet_name = input(M, "What would you like to name the pet? (leave blank for default name)", "Pet Name") + ..() + +//choice boxes (they just open in your hand instead of making a pod) /obj/item/choice_beacon/box name = "choice box (default)" desc = "Think really hard about what you want, and then rip it open!" @@ -163,21 +206,17 @@ icon_state = "deliverypackage3" item_state = "deliverypackage3" -/obj/item/choice_beacon/box/spawn_option(obj/choice,mob/living/M) - to_chat(M, "The box opens, revealing the [choice]!") +/obj/item/choice_beacon/box/spawn_option(atom/choice,mob/living/M) + var/choice_text = choice + if(ispath(choice_text)) + choice_text = initial(choice.name) + to_chat(M, "The box opens, revealing the [choice_text]!") playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1) M.temporarilyRemoveItemFromInventory(src, TRUE) M.put_in_hands(new choice) qdel(src) -/obj/item/choice_beacon/box/plushie - name = "choice box (plushie)" - desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!" - icon = 'icons/obj/plushes.dmi' - icon_state = "box" - item_state = "box" - -/obj/item/choice_beacon/box/spawn_option(choice,mob/living/M) +/obj/item/choice_beacon/box/plushie/spawn_option(choice,mob/living/M) if(ispath(choice, /obj/item/toy/plush)) ..() //regular plush, spawn it naturally else @@ -188,6 +227,31 @@ M.put_in_hands(new choice) qdel(src) +/obj/item/choice_beacon/box/carpet //donator carpet beacon + name = "choice box (carpet)" + desc = "Contains 50 of a selected carpet inside!" + var/static/list/carpet_list = list(/obj/item/stack/tile/carpet/black/fifty = "Black Carpet", + "Black & Red Carpet" = /obj/item/stack/tile/carpet/blackred/fifty, + "Monochrome Carpet" = /obj/item/stack/tile/carpet/monochrome/fifty, + "Blue Carpet" = /obj/item/stack/tile/carpet/blue/fifty, + "Cyan Carpet" = /obj/item/stack/tile/carpet/cyan/fifty, + "Green Carpet" = /obj/item/stack/tile/carpet/green/fifty, + "Orange Carpet" = /obj/item/stack/tile/carpet/orange/fifty, + "Purple Carpet" = /obj/item/stack/tile/carpet/purple/fifty, + "Red Carpet" = /obj/item/stack/tile/carpet/red/fifty, + "Royal Black Carpet" = /obj/item/stack/tile/carpet/royalblack/fifty, + "Royal Blue Carpet" = /obj/item/stack/tile/carpet/royalblue/fifty) + +/obj/item/choice_beacon/box/carpet/generate_display_names() + return carpet_list + +/obj/item/choice_beacon/box/plushie + name = "choice box (plushie)" + desc = "Using the power of quantum entanglement, this box contains every plush, until the moment it is opened!" + icon = 'icons/obj/plushes.dmi' + icon_state = "box" + item_state = "box" + /obj/item/choice_beacon/box/plushie/generate_display_names() var/list/plushie_list = list() //plushie set 1: just subtypes of /obj/item/toy/plush diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index a4b12dd629..ef2fb44d3d 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -29,6 +29,9 @@ var/has_lock_sprites = TRUE //whether to load the lock overlays or not var/allows_hostiles = FALSE //does the pet carrier allow hostile entities to be held within it? +/obj/item/pet_carrier/donator + custom_materials = null //you cant just use the loadout item to get free metal! + /obj/item/pet_carrier/Destroy() if(occupants.len) for(var/V in occupants) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 9ea8c9c689..7ba2196184 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -128,6 +128,7 @@ absorption_capacity = 5 splint_factor = 0.35 custom_price = PRICE_REALLY_CHEAP + grind_results = list(/datum/reagent/cellulose = 2) // gauze is only relevant for wounds, which are handled in the wounds themselves /obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 305c2ab276..645051b7c2 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -412,6 +412,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cloth + grind_results = list(/datum/reagent/cellulose = 2) /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() @@ -773,6 +774,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \ + new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \ new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \ new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2))) @@ -841,6 +843,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton var/pull_effort = 30 var/loom_result = /obj/item/stack/sheet/cloth + grind_results = list(/datum/reagent/cellulose = 5) /obj/item/stack/sheet/cotton/ten amount = 10 @@ -856,6 +859,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread + grind_results = list(/datum/reagent/cellulose = 10) /obj/item/stack/sheet/meat name = "meat sheets" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3c554aa58e..0001494fdd 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -478,7 +478,7 @@ /obj/item/assembly/signaler, /obj/item/lightreplacer, /obj/item/rcd_ammo, - /obj/item/construction/rcd, + /obj/item/construction, /obj/item/pipe_dispenser, /obj/item/stack/rods, /obj/item/stack/tile/plasteel, @@ -492,7 +492,7 @@ icon_state = "grenadebeltnew" item_state = "security" rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE - + /obj/item/storage/belt/grenade/ComponentInitialize() . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index a6b34c59e3..73246276c2 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -281,6 +281,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/clothing/suit/armor/vest/infiltrator, /obj/item/clothing/under/syndicate/bloodred, /obj/item/clothing/gloves/color/latex/nitrile/infiltrator, + /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator, /obj/item/clothing/mask/infiltrator, /obj/item/clothing/shoes/combat/sneakboots, /obj/item/gun/ballistic/automatic/pistol, @@ -292,7 +293,7 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) new /obj/item/clothing/head/helmet/infiltrator(src) new /obj/item/clothing/suit/armor/vest/infiltrator(src) new /obj/item/clothing/under/syndicate/bloodred(src) - new /obj/item/clothing/gloves/color/latex/nitrile/infiltrator(src) + new /obj/item/clothing/gloves/tackler/combat/insulated/infiltrator(src) new /obj/item/clothing/mask/infiltrator(src) new /obj/item/clothing/shoes/combat/sneakboots(src) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index b5f8612244..653e95c21e 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -252,6 +252,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/timestop name = "temporal katana" desc = "Delicately balanced, this finely-crafted blade hums with barely-restrained potential." + icon_state = "temporalkatana" + item_state = "temporalkatana" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' block_chance = 0 // oops force = 27.5 // oops item_flags = ITEM_CAN_PARRY @@ -263,6 +267,21 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 flynn.emote("smirk") new /obj/effect/timestop/magic(get_turf(owner), 1, 50, list(owner)) // null roddies counter +/obj/item/katana/timestop/suicide_act(mob/living/user) // stolen from hierophant staff + new /obj/effect/timestop/magic(get_turf(user), 1, 50, list(user)) // free usage for dying + user.visible_message("[user] poses menacingly with the [src]! It looks like [user.p_theyre()] trying to teleport behind someone!") + user.say("Heh.. Nothing personnel, kid..", forced = "temporal katana suicide") + sleep(20) + if(!user) + return + user.visible_message("[user] vanishes into a cloud of falling dust and burning embers, likely off to style on some poor sod in the distance!") + playsound(user,'sound/magic/blink.ogg', 75, TRUE) + for(var/obj/item/I in user) + if(I != src) + user.dropItemToGround(I) + user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff + qdel(user) + /obj/item/melee/bokken // parrying stick name = "bokken" desc = "A space-Japanese training sword made of wood and shaped like a katana." @@ -272,7 +291,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK w_class = WEIGHT_CLASS_BULKY - force = 9 + force = 7 //how much harm mode damage we do + var/stamina_damage_increment = 4 //how much extra damage do we do when in non-harm mode throwforce = 10 damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") @@ -323,17 +343,19 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/melee/bokken/Initialize() . = ..() AddElement(/datum/element/sword_point) + if(!harm) //if initialised in non-harm mode, setup force accordingly + force = force + stamina_damage_increment /obj/item/melee/bokken/attack_self(mob/user) harm = !harm if(harm) - force -= 2 + force -= stamina_damage_increment damtype = BRUTE attack_verb = list("bashed", "smashed", "attacked") bare_wound_bonus = 15 // having your leg smacked by a wooden stick is probably not great for it if it's naked wound_bonus = 0 else - force += 2 + force += stamina_damage_increment damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") bare_wound_bonus = 0 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 14017ffb2d..f5003e035b 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -186,7 +186,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(!acid_level) SSacid.processing[src] = src - add_overlay(GLOB.acid_overlay, TRUE) + update_icon() var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids. if(acid_level < acid_cap) acid_level = min(acid_level + acidpwr * acid_volume, acid_cap) @@ -224,7 +224,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE)) resistance_flags |= ON_FIRE SSfire_burning.processing[src] = src - add_overlay(GLOB.fire_overlay, TRUE) + update_icon() return 1 //called when the obj is destroyed by fire @@ -236,7 +236,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /obj/proc/extinguish() if(resistance_flags & ON_FIRE) resistance_flags &= ~ON_FIRE - cut_overlay(GLOB.fire_overlay, TRUE) + update_icon() SSfire_burning.processing -= src /obj/zap_act(power, zap_flags, shocked_targets) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 79dd13b0ae..99b302e9ce 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -317,6 +317,13 @@ icon_state = unique_reskin[choice] to_chat(M, "[src] is now skinned as '[choice]'.") +/obj/update_overlays() + . = ..() + if(acid_level) + . += GLOB.acid_overlay + if(resistance_flags & ON_FIRE) + . += GLOB.fire_overlay + //Called when the object is constructed by an autolathe //Has a reference to the autolathe so you can do !!FUN!! things with hacked lathes /obj/proc/autolathe_crafted(obj/machinery/autolathe/A) @@ -329,3 +336,6 @@ . = ..() if(. && ricochet_damage_mod) take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet + +/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 45cac650b8..c36fba96cb 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -243,10 +243,24 @@ LINEN BINS /obj/item/bedsheet/random/Initialize() ..() - var/type = pick(typesof(/obj/item/bedsheet) - /obj/item/bedsheet/random) + var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon)) new type(loc) return INITIALIZE_HINT_QDEL +/obj/item/bedsheet/chameleon //donator chameleon bedsheet + name = "chameleon bedsheet" + desc = "Bedsheet technology has truly gone too far." + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/bedsheet/chameleon/New() + ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/bedsheet + chameleon_action.chameleon_name = "Bedsheet" + chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random), only_root_path = TRUE) + chameleon_action.initialize_disguises() + +//bedsheet bin /obj/structure/bedsheetbin name = "linen bin" desc = "It looks rather cosy." diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 36e4f825da..7853b9619c 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -86,6 +86,10 @@ /obj/structure/grille/attack_animal(mob/user) . = ..() + if(!user.CheckActionCooldown(CLICK_CD_MELEE)) + return + user.DelayNextAction(flush = TRUE) + user.do_attack_animation(src) if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille) take_damage(rand(5,10), BRUTE, "melee", 1) @@ -114,12 +118,12 @@ /obj/structure/grille/attack_alien(mob/living/user) if(!user.CheckActionCooldown(CLICK_CD_MELEE)) return + user.DelayNextAction(flush = TRUE) user.do_attack_animation(src) user.visible_message("[user] mangles [src].", null, null, COMBAT_MESSAGE_RANGE) if(!shock(user, 70)) take_damage(20, BRUTE, "melee", 1) - /obj/structure/grille/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSGRILLE)) return TRUE diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 4f6256e9c4..263b47aab2 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -9,7 +9,7 @@ var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob var/activated = FALSE //whether we are active and generating chems - var/reagent_id = /datum/reagent/fuel/oil + var/reagent_id = /datum/reagent/oil var/potency = 2 //how much reagents we add every process (2 seconds) var/max_volume = 500 var/start_volume = 50 @@ -77,10 +77,10 @@ /obj/item/plunger/reinforced name = "reinforced plunger" - desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging." + desc = "It's an M. 7 Reinforced Plunger� for heavy duty plunging." icon_state = "reinforced_plunger" reinforced = TRUE plunge_mod = 0.8 - custom_premium_price = 1200 + custom_premium_price = 600 diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 1fbeee7523..6e7dbaf904 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -149,6 +149,8 @@ var/list/megafauna_spawn_list /// Flora that can spawn in the tunnel, weighted list var/list/flora_spawn_list + //terrain to spawn weighted list + var/list/terrain_spawn_list /// Turf type to choose when spawning in tunnel at 1% chance, weighted list var/list/choose_turf_type /// if the tunnel should keep being created @@ -230,7 +232,8 @@ megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM) if (!flora_spawn_list) flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2) - + if(!terrain_spawn_list) + terrain_spawn_list = list(/obj/structure/geyser/random = 1) . = ..() if(!has_data) produce_tunnel_from_data() @@ -334,8 +337,19 @@ spawned_flora = SpawnFlora(T) if(!spawned_flora) // no rocks beneath mob spawners / mobs. SpawnMonster(T) + SpawnTerrain(T) T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) +/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T) + if(prob(1)) + if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) + return + var/randumb = pickweight(terrain_spawn_list) + for(var/obj/structure/geyser/F in range(7, T)) + if(istype(F, randumb)) + return + new randumb(T) + /// Spawns a random mob or megafauna in the tunnel /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T) if(!isarea(loc)) diff --git a/code/game/world.dm b/code/game/world.dm index 55333fb3e6..a342200b3d 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -12,6 +12,9 @@ GLOBAL_LIST(topic_status_cache) if (fexists(EXTOOLS)) call(EXTOOLS, "maptick_initialize")() enable_debugger() +#ifdef REFERENCE_TRACKING + enable_reference_tracking() +#endif world.Profile(PROFILE_START) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 718f9d4246..e9abb7db87 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -171,7 +171,11 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /client/proc/cmd_display_overlay_log, /client/proc/reload_configuration, /datum/admins/proc/create_or_modify_area, - /client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG +#ifdef REFERENCE_TRACKING + /datum/admins/proc/view_refs, + /datum/admins/proc/view_del_failures, +#endif + /client/proc/generate_wikichem_list, //DO NOT PRESS UNLESS YOU WANT SUPERLAG ) GLOBAL_PROTECT(admin_verbs_debug) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm new file mode 100644 index 0000000000..70aac2f107 --- /dev/null +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -0,0 +1,225 @@ +#ifdef REFERENCE_TRACKING + +GLOBAL_LIST_EMPTY(deletion_failures) + +/world/proc/enable_reference_tracking() + if (fexists(EXTOOLS)) + call(EXTOOLS, "ref_tracking_initialize")() + +/proc/get_back_references(datum/D) + CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!") + +/proc/get_forward_references(datum/D) + CRASH("/proc/get_forward_references not hooked by extools, reference tracking will not function!") + +/proc/clear_references(datum/D) + return + +/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey + set category = "Debug" + set name = "View References" + + if(!check_rights(R_DEBUG) || !D) + return + + var/list/backrefs = get_back_references(D) + if(isnull(backrefs)) + var/datum/browser/popup = new(usr, "ref_view", "
Error
") + popup.set_content("Reference tracking not enabled") + popup.open(FALSE) + return + + var/list/frontrefs = get_forward_references(D) + var/list/dat = list() + dat += "

References of \ref[D] - [D]


\[Refresh\]
" + dat += "

Back references - these things hold references to this object.

" + dat += "" + dat += "" + for(var/ref in backrefs) + var/datum/backreference = ref + if(isnull(backreference)) + dat += "" + if(istype(backreference)) + dat += "" + else if(islist(backreference)) + dat += "" + else + dat += "" + dat += "
RefTypeVariable NameFollow
GC'd Reference
[REF(backreference)][backreference.type][backrefs[backreference]]\[Follow\]
[REF(backreference)]list[backrefs[backreference]]\[Follow\]
Weird reference type. Add more debugging checks.

" + dat += "

Forward references - this object is referencing those things.

" + dat += "" + dat += "" + for(var/ref in frontrefs) + var/datum/backreference = frontrefs[ref] + dat += "" + dat += "
Variable nameRefTypeFollow
[ref][REF(backreference)][backreference.type]\[Follow\]

" + dat = dat.Join() + + var/datum/browser/popup = new(usr, "ref_view", "
References of \ref[D]
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/admins/proc/view_del_failures() + set category = "Debug" + set name = "View Deletion Failures" + + if(!check_rights(R_DEBUG)) + return + + var/list/dat = list("") + for(var/t in GLOB.deletion_failures) + if(isnull(t)) + dat += "" + continue + var/datum/thing = t + dat += "" + dat += "
GC'd Reference | Clear Nulls
\ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]

" + dat = dat.Join() + + var/datum/browser/popup = new(usr, "del_failures", "
Deletion Failures
") + popup.set_content(dat) + popup.open(FALSE) + + +/datum/proc/find_references() + testing("Beginning search for references to a [type].") + var/list/backrefs = get_back_references(src) + for(var/ref in backrefs) + if(isnull(ref)) + log_world("## TESTING: Datum reference found, but gone now.") + continue + if(islist(ref)) + log_world("## TESTING: Found [type] \ref[src] in list.") + continue + var/datum/datum_ref = ref + if(!istype(datum_ref)) + log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].") + return + log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]") + message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]") + testing("Completed search for references to a [type].") + +#endif + +#ifdef LEGACY_REFERENCE_TRACKING + +/datum/verb/legacy_find_refs() + set category = "Debug" + set name = "Find References" + set src in world + + find_references(FALSE) + + +/datum/proc/find_references_legacy(skip_alert) + running_find_references = type + if(usr?.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = FALSE + + if(usr?.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + + DoSearchVar(GLOB) //globals + for(var/datum/thing in world) //atoms (don't beleive its lies) + DoSearchVar(thing, "World -> [thing]") + + for(var/datum/thing) //datums + DoSearchVar(thing, "World -> [thing]") + + for(var/client/thing) //clients + DoSearchVar(thing, "World -> [thing]") + + testing("Completed search for references to a [type].") + if(usr?.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.next_fire = world.time + world.tick_lag + + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set src in world + + qdel(src, TRUE) //force a qdel + if(!running_find_references) + find_references(TRUE) + + +/datum/verb/qdel_then_if_fail_find_references() + set category = "Debug" + set name = "qdel() then Find References if GC failure" + set src in world + + qdel_and_find_ref_if_fail(src, TRUE) + + +/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64) + if(usr?.client && !usr.client.running_find_references) + return + + if(!recursive_limit) + return + + if(istype(potential_container, /datum)) + var/datum/datum_container = potential_container + if(datum_container.last_find_references == last_find_references) + return + + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars + + for(var/varname in vars_list) + if (varname == "vars") + continue + var/variable = vars_list[varname] + + if(variable == src) + testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + + else if(islist(variable)) + DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1) + + else if(islist(potential_container)) + var/normal = IS_NORMAL_LIST(potential_container) + for(var/element_in_list in potential_container) + if(element_in_list == src) + testing("Found [type] \ref[src] in list [container_name].") + + else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src) + testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") + + else if(islist(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1) + + #ifndef FIND_REF_NO_CHECK_TICK + CHECK_TICK + #endif + + +/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) + SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE + qdel(thing_to_del, force) + +#endif diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index d6e4c2b944..9ee7103562 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -45,6 +45,16 @@ usr.client.admin_delete(target) if (isturf(src)) // show the turf that took its place usr.client.debug_variables(src) + return + #ifdef REFERENCE_TRACKING + if(href_list[VV_HK_VIEW_REFERENCES]) + var/datum/D = locate(href_list[VV_HK_TARGET]) + if(!D) + to_chat(usr, "Unable to locate item.") + return + usr.client.holder.view_refs(target) + return + #endif if(href_list[VV_HK_MARK]) usr.client.mark_datum(target) if(href_list[VV_HK_ADDCOMPONENT]) diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index abe445589f..a4dff725f7 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -61,6 +61,7 @@ "Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH), "Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE), "Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE), + "View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES), "---" ) for(var/i in 1 to length(dropdownoptions)) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index c5f880c955..14f7b34309 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -281,7 +281,6 @@ GLOBAL_LIST_EMPTY(antagonists) . = CONFIG_GET(keyed_list/antag_threat)[lowertext(name)] if(. == null) return threat - return threat //This one is created by admin tools for custom objectives /datum/antagonist/custom diff --git a/code/modules/antagonists/blob/blob.dm b/code/modules/antagonists/blob/blob.dm index 9a82bb546b..c449bd3012 100644 --- a/code/modules/antagonists/blob/blob.dm +++ b/code/modules/antagonists/blob/blob.dm @@ -4,11 +4,17 @@ antagpanel_category = "Blob" show_to_ghosts = TRUE job_rank = ROLE_BLOB - threat = 20 + threat = 50 var/datum/action/innate/blobpop/pop_action var/starting_points_human_blob = 60 var/point_rate_human_blob = 2 +/datum/antagonist/blob/threat() + . = ..() + if(isovermind(owner.current)) + var/mob/camera/blob/overmind = owner.current + . *= (overmind.blobs_legit.len / overmind.max_count) + /datum/antagonist/blob/roundend_report() var/basic_report = ..() //Display max blobpoints for blebs that lost diff --git a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm index ba2363ecc0..f9763b92fd 100644 --- a/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob/blobs/blob_mobs.dm @@ -75,7 +75,6 @@ desc = "A floating, fragile spore." icon_state = "blobpod" icon_living = "blobpod" - threat = 0.2 health = 30 maxHealth = 30 verb_say = "psychically pulses" diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index 24cad2a188..740ec81782 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -54,7 +54,7 @@ REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude") REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") - REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") + REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude") if(!ishuman(owner)) return var/mob/living/carbon/human/H = owner diff --git a/code/modules/antagonists/clockcult/clock_mobs.dm b/code/modules/antagonists/clockcult/clock_mobs.dm index 87466d65f2..2f00fd4e4a 100644 --- a/code/modules/antagonists/clockcult/clock_mobs.dm +++ b/code/modules/antagonists/clockcult/clock_mobs.dm @@ -6,7 +6,6 @@ unique_name = 1 minbodytemp = 0 unsuitable_atmos_damage = 0 - threat = 1 atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) healable = FALSE diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm index 79b919b1e9..76c9db7231 100644 --- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm +++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm @@ -9,7 +9,6 @@ desc = "The stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield." icon_state = "clockwork_marauder" mob_biotypes = MOB_HUMANOID - threat = 3 health = 120 maxHealth = 120 force_threshold = 8 diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index b7503f4b22..305c4fadb7 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -70,7 +70,6 @@ icon_living = "swarmer" icon_dead = "swarmer_unactivated" icon_gib = null - threat = 0.5 wander = 0 harm_intent_damage = 5 minbodytemp = 0 diff --git a/code/modules/antagonists/xeno/xeno.dm b/code/modules/antagonists/xeno/xeno.dm index 2cc8e34b99..f10506a0d9 100644 --- a/code/modules/antagonists/xeno/xeno.dm +++ b/code/modules/antagonists/xeno/xeno.dm @@ -16,6 +16,18 @@ var/datum/team/xeno/xeno_team threat = 3 +/datum/antagonist/xeno/threat() + . = 1 + if(isalienhunter(owner)) + . = 2 + else if(isaliensentinel(owner)) + . = 4 + else if(isalienroyal(owner)) + if(isalienqueen(owner)) + . = 8 + else + . = 6 + /datum/antagonist/xeno/create_team(datum/team/xeno/new_team) if(!new_team) for(var/datum/antagonist/xeno/X in GLOB.antagonists) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index a8b4c93764..18e3281e4b 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -264,7 +264,7 @@ name = "pipes" /datum/asset/spritesheet/pipes/register() - for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi')) + for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) InsertAll("", each, GLOB.alldirs) ..() @@ -388,9 +388,11 @@ Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal") ..() + /datum/asset/spritesheet/mafia name = "mafia" /datum/asset/spritesheet/mafia/register() InsertAll("", 'icons/obj/mafia.dmi') ..() + diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 480ebda4f8..2fe674e59e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -246,6 +246,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) /// Which of the 5 persistent scar slots we randomly roll to load for this round, if enabled. Actually rolled in [/datum/preferences/proc/load_character(slot)] var/scars_index = 1 + var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded + /datum/preferences/New(client/C) parent = C @@ -521,6 +523,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + if(length(pref_species.allowed_limb_ids)) + if(!chosen_limb_id || !(chosen_limb_id in pref_species.allowed_limb_ids)) + chosen_limb_id = pref_species.id + dat += "

Body sprite

" + dat += "[chosen_limb_id]" + if(mutant_category) dat += "" mutant_category = 0 @@ -801,7 +809,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!subcategories.Find(gear_subcategory)) gear_subcategory = subcategories[1] - var/firstsubcat = FALSE + var/firstsubcat = TRUE for(var/subcategory in subcategories) if(firstsubcat) firstsubcat = FALSE @@ -2092,8 +2100,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) else features["body_model"] = chosengender gender = chosengender - facial_hair_style = random_facial_hair_style(gender) - hair_style = random_hair_style(gender) if("body_size") var/min = CONFIG_GET(number/body_size_min) @@ -2119,6 +2125,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs if(selected_custom_speech_verb) custom_speech_verb = selected_custom_speech_verb + + if("bodysprite") + var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids + if(selected_body_sprite) + chosen_limb_id = selected_body_sprite //this gets sanitized before loading else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2510,6 +2521,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.features = features.Copy() character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) + if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids)) + character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id character.dna.real_name = character.real_name character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 64c5e775b0..55a594cf21 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 34 +#define SAVEFILE_VERSION_MAX 35 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -200,6 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"]) features["ooc_notes"] = html_encode(features["ooc_notes"]) + if(current_version < 35) + if(S["species"] == "lizard") + features["mam_snouts"] = features["snout"] + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -510,6 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] + S["chosen_limb_id"] >> chosen_limb_id //Custom names @@ -840,6 +845,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) + WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d540336b86..2fbe738acb 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -118,8 +118,7 @@ // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up /obj/item/clothing/proc/repair(mob/user, params) - damaged_clothes = CLOTHING_PRISTINE - update_clothes_damaged_state(FALSE) + update_clothes_damaged_state(CLOTHING_PRISTINE) obj_integrity = max_integrity name = initial(name) // remove "tattered" or "shredded" if there's a prefix body_parts_covered = initial(body_parts_covered) @@ -196,7 +195,7 @@ if(3 to INFINITY) // take better care of your shit, dude name = "tattered [initial(name)]" - update_clothes_damaged_state() + update_clothes_damaged_state(CLOTHING_DAMAGED) /obj/item/clothing/Destroy() user_vars_remembered = null //Oh god somebody put REFERENCES in here? not to worry, we'll clean it up @@ -257,7 +256,7 @@ how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n" how_cool_are_your_threads += "" . += how_cool_are_your_threads.Join() - + if(LAZYLEN(armor_list)) armor_list.Cut() if(armor.bio) @@ -346,10 +345,16 @@ var/mob/M = loc to_chat(M, "Your [name] starts to fall apart!") -/obj/item/clothing/proc/update_clothes_damaged_state(damaging = TRUE) - var/index = "[REF(initial(icon))]-[initial(icon_state)]" - var/static/list/damaged_clothes_icons = list() - if(damaging) +//This mostly exists so subtypes can call appriopriate update icon calls on the wearer. +/obj/item/clothing/proc/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) + damaged_clothes = damaged_state + update_icon() + +/obj/item/clothing/update_overlays() + . = ..() + if(damaged_clothes) + var/index = "[REF(initial(icon))]-[initial(icon_state)]" + var/static/list/damaged_clothes_icons = list() var/icon/damaged_clothes_icon = damaged_clothes_icons[index] if(!damaged_clothes_icon) damaged_clothes_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply damaged effect to the initial icon_state for each object @@ -357,9 +362,7 @@ damaged_clothes_icon.Blend(icon('icons/effects/item_damage.dmi', "itemdamaged"), ICON_MULTIPLY) //adds damage effect and the remaining white areas become transparant damaged_clothes_icon = fcopy_rsc(damaged_clothes_icon) damaged_clothes_icons[index] = damaged_clothes_icon - add_overlay(damaged_clothes_icon, TRUE) - else - cut_overlay(damaged_clothes_icons[index], TRUE) + . += damaged_clothes_icon /* SEE_SELF // can see self, no matter what diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 1c3ac0f340..b5d92fb780 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -199,12 +199,16 @@ /obj/item/clothing/gloves/evening name = "evening gloves" - desc = "Thin, pretty gloves intended for use in regal feminine attire, but knowing Space China these are just for some maid fetish." + desc = "Thin, pretty gloves intended for use in regal feminine attire. A tag on the hem claims they were 'maid' in Space China, these were probably intended for use in some maid fetish." icon_state = "evening" item_state = "evening" - strip_delay = 40 - equip_delay_other = 20 + transfer_prints = TRUE cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT strip_mod = 0.9 - custom_price = PRICE_ALMOST_CHEAP + +/obj/item/clothing/gloves/evening/black + name = "midnight gloves" + desc = "Thin, pretty gloves intended for use in sexy feminine attire. A tag on the hem claims they pair great with black stockings." + icon_state = "eveningblack" + item_state = "eveningblack" diff --git a/code/modules/clothing/gloves/tacklers.dm b/code/modules/clothing/gloves/tacklers.dm index a5a0e4ad28..eda36ea12f 100644 --- a/code/modules/clothing/gloves/tacklers.dm +++ b/code/modules/clothing/gloves/tacklers.dm @@ -74,6 +74,25 @@ permeability_coefficient = 0.05 strip_mod = 1.5 // and combat gloves had this?? +/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator + name = "insidious guerrilla gloves" + desc = "Specialized combat gloves for carrying people around. Transfers tactical kidnapping and tackling knowledge to the user via the use of nanochips." + icon_state = "infiltrator" + item_state = "infiltrator" + siemens_coefficient = 0 + permeability_coefficient = 0.05 + resistance_flags = FIRE_PROOF | ACID_PROOF + var/carrytrait = TRAIT_QUICKER_CARRY + +/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/equipped(mob/user, slot) + . = ..() + if(slot == SLOT_GLOVES) + ADD_TRAIT(user, carrytrait, GLOVE_TRAIT) + +/obj/item/clothing/gloves/tackler/combat/insulated/infiltrator/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT) + /obj/item/clothing/gloves/tackler/rocket name = "rocket gloves" desc = "The ultimate in high risk, high reward, perfect for when you need to stop a criminal from fifty feet away or die trying. Banned in most Spinward gridiron football and rugby leagues." diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index f11c89d00c..6701b53c10 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -12,6 +12,10 @@ /obj/item/clothing/mask/balaclava/attack_self(mob/user) adjustmask(user) +/obj/item/clothing/mask/balaclava/breath + name = "breathaclava" + clothing_flags = ALLOWINTERNALS + /obj/item/clothing/mask/infiltrator name = "insidious balaclava" desc = "An incredibly suspicious balaclava made with Syndicate nanofibers to absorb impacts slightly while obfuscating the voice and face using a garbled vocoder." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6364a9a1c1..d6853f52ca 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -625,7 +625,7 @@ desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy." icon_state = "coatmedical" item_state = "coatmedical" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical @@ -638,7 +638,7 @@ desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur." icon_state = "coatcmo" item_state = "coatcmo" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo @@ -651,7 +651,7 @@ desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go." icon_state = "coatchemistry" item_state = "coatchemistry" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 30, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry @@ -664,7 +664,7 @@ desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage." icon_state = "coatviro" item_state = "coatviro" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 30, "rad" = 0, "fire" = 0, "acid" = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/viro @@ -677,7 +677,7 @@ desc = "A winter coat with blue markings. Warm, but probably won't protect from biological agents. For the cozy doctor on the go." icon_state = "coatparamed" item_state = "coatparamed" - allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) + allowed = list(/obj/item/analyzer, /obj/item/sensor_device, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 50, "rad" = 0, "fire" = 0, "acid" = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/paramedic diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm index 69e9a974eb..993577cb30 100644 --- a/code/modules/events/alien_infestation.dm +++ b/code/modules/events/alien_infestation.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/ghost_role/alien_infestation weight = 5 gamemode_blacklist = list("dynamic") - min_players = 10 + min_players = 25 max_occurrences = 1 /datum/round_event/ghost_role/alien_infestation diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index da5b4c0cb2..1c88e68377 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -27,7 +27,6 @@ "How do I vore people?", "ERP?", "Not epic bros...") - threat = 5 /datum/round_event/brand_intelligence/announce(fake) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index af44b54ed0..9ab5e8d517 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -25,7 +25,7 @@ ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names")) /datum/round_event/pirates/announce(fake) - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak + priority_announce("A business proposition has been downloaded and printed out at all communication consoles.", "Incoming Business Proposition", "commandreport") if(fake) return threat_message = new @@ -49,6 +49,7 @@ else priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name) if(!shuttle_spawned) + priority_announce("You won't listen to reason? Then we'll take what's yours or die trying!",sender_override = ship_name) spawn_shuttle() /datum/round_event/pirates/start() @@ -83,8 +84,7 @@ announce_to_ghosts(M) else announce_to_ghosts(spawner) - - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too + priority_announce("Unidentified ship detected near the station.") //Shuttle equipment diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm index 4d2e8e624c..57e2a2a051 100644 --- a/code/modules/events/wizard/magicarp.dm +++ b/code/modules/events/wizard/magicarp.dm @@ -30,7 +30,6 @@ icon_dead = "magicarp_dead" icon_gib = "magicarp_gib" ranged = 1 - threat = 4 retreat_distance = 2 minimum_distance = 0 //Between shots they can and will close in to nash projectiletype = /obj/item/projectile/magic @@ -52,7 +51,6 @@ color = "#00FFFF" maxHealth = 75 health = 75 - threat = 7 /mob/living/simple_animal/hostile/carp/ranged/chaos/Shoot() projectiletype = pick(allowed_projectile_types) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 895699434a..4d5f4e2dd0 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -97,9 +97,12 @@ All foods are distributed among various categories. Use common sense. return -/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(user.a_intent == INTENT_HARM) return ..() + INVOKE_ASYNC(src, .proc/attempt_forcefeed, M, user) + +/obj/item/reagent_containers/food/snacks/proc/attempt_forcefeed(mob/living/M, mob/living/user) if(!eatverb) eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp") if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 6c9e527f38..d3b9b92b4f 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -190,7 +190,6 @@ icon_dead = "scary_clown" icon_gib = "scary_clown" speak = list("...", ". . .") - threat = 3 maxHealth = 120 health = 120 emote_see = list("silently stares") diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index abf6632939..f6be9db9a2 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -103,6 +103,7 @@ throwforce = 5 throw_speed = 2 throw_range = 3 + attack_speed = CLICK_CD_MELEE w_class = WEIGHT_CLASS_BULKY flags_1 = CONDUCT_1 armour_penetration = 20 @@ -125,9 +126,12 @@ playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) return (BRUTELOSS) -/obj/item/scythe/pre_attack(atom/A, mob/living/user, params) +/obj/item/scythe/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier) + . = ..() + if(. & STOP_ATTACK_PROC_CHAIN) + return if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user)) - return ..() + return else var/turf/user_turf = get_turf(user) var/dir_to_target = get_dir(user_turf, get_turf(A)) @@ -138,11 +142,12 @@ var/turf/T = get_step(user_turf, turn(dir_to_target, i)) for(var/obj/structure/spacevine/V in T) if(user.Adjacent(V)) - melee_attack_chain(user, V) + melee_attack_chain(user, V, attackchain_flags = ATTACK_IGNORE_CLICKDELAY) stam_gain += 5 //should be hitcost swiping = FALSE stam_gain += 2 //Initial hitcost user.adjustStaminaLoss(-stam_gain) + user.DelayNextAction() // ************************************* // Nutrient defines for hydroponics @@ -192,4 +197,4 @@ /obj/item/reagent_containers/glass/bottle/killer/pestkiller name = "bottle of pest spray" desc = "Contains a pesticide." - list_reagents = list(/datum/reagent/toxin/pestkiller = 50) \ No newline at end of file + list_reagents = list(/datum/reagent/toxin/pestkiller = 50) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 06179d1087..a208f2de3c 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -30,7 +30,7 @@ var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood. var/self_sufficiency_progress = 0 var/self_sustaining = FALSE //If the tray generates nutrients and water on its own - + var/canirrigate = TRUE //tin /obj/machinery/hydroponics/constructable name = "hydroponics tray" @@ -847,12 +847,13 @@ if (!anchored) to_chat(user, "Anchor the tray first!") return - using_irrigation = !using_irrigation - O.play_tool_sound(src) - user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ - "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") - for(var/obj/machinery/hydroponics/h in range(1,src)) - h.update_icon() + if(canirrigate) + using_irrigation = !using_irrigation + O.play_tool_sound(src) + user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ + "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") + for(var/obj/machinery/hydroponics/h in range(1,src)) + h.update_icon() else if(istype(O, /obj/item/shovel/spade)) if(!myseed && !weedlevel) @@ -910,11 +911,14 @@ harvest = 0 lastproduce = age if(istype(myseed, /obj/item/seeds/replicapod)) - to_chat(user, "You harvest from the [myseed.plantname].") + if(user)//runtimes + to_chat(user, "You harvest from the [myseed.plantname].") else if(myseed.getYield() <= 0) - to_chat(user, "You fail to harvest anything useful!") + if(user) + to_chat(user, "You fail to harvest anything useful!") else - to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") + if(user) + to_chat(user, "You harvest [myseed.getYield()] items from the [myseed.plantname].") if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) qdel(myseed) myseed = null diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 5e49a32a23..c7314bf180 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -190,6 +190,31 @@ obj/item/seeds/proc/is_gene_forbidden(typepath) parent.update_tray(user) return result +/obj/item/seeds/proc/harvest_userless() + var/obj/machinery/hydroponics/parent = loc //for ease of access + var/t_amount = 0 + var/list/result = list() + var/output_loc = parent.loc + var/product_name + while(t_amount < getYield()) + var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) + if(parent.myseed.plantname != initial(parent.myseed.plantname)) + t_prod.name = lowertext(parent.myseed.plantname) + if(productdesc) + t_prod.desc = productdesc + t_prod.seed.name = parent.myseed.name + t_prod.seed.desc = parent.myseed.desc + t_prod.seed.plantname = parent.myseed.plantname + result.Add(t_prod) // User gets a consumable + if(!t_prod) + return + t_amount++ + product_name = parent.myseed.plantname + if(getYield() >= 1) + SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) + parent.investigate_log("autmoatic harvest of [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY) + parent.update_tray() + return result /obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T) if(!T.reagents) diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm index d842dbc003..a0d96658e6 100644 --- a/code/modules/instruments/songs/_song.dm +++ b/code/modules/instruments/songs/_song.dm @@ -2,6 +2,12 @@ #define MUSIC_MAXLINES 1000 #define MUSIC_MAXLINECHARS 300 +/** + * # Song datum + * + * These are the actual backend behind instruments. + * They attach to an atom and provide the editor + playback functionality. + */ /datum/song /// Name of the song var/name = "Untitled" @@ -15,6 +21,9 @@ /// delay between notes in deciseconds var/tempo = 5 + /// How far we can be heard + var/instrument_range = 15 + /// Are we currently playing? var/playing = FALSE @@ -53,17 +62,24 @@ /////////////////// Playing variables //////////////// /** - * Only used in synthesized playback - The chords we compiled. Non assoc list of lists: - * list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...) - * tempo_divisor always exists - * if key1 (and so if there's no keys) doesn't exist it's a rest + * Build by compile_chords() + * Must be rebuilt on instrument switch. * Compilation happens when we start playing and is cleared after we finish playing. + * Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv) */ var/list/compiled_chords + /// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag. + var/elapsed_delay + /// Amount of delay to wait before playing the next chord + var/delay_by + /// Current chord we're on. + var/current_chord /// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1. var/list/channels_playing = list() /// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments. var/list/channels_idle = list() + /// Person playing us + var/mob/user_playing ////////////////////////////////////////////////////// /// Last world.time we checked for who can hear us @@ -72,8 +88,6 @@ var/list/hearing_mobs /// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop) var/debug_mode = FALSE - /// Last time we processed decay - var/last_process_decay /// Max sound channels to occupy var/max_sound_channels = CHANNELS_PER_INSTRUMENT /// Current channels, so we can save a length() call. @@ -113,7 +127,7 @@ var/cached_exponential_dropoff = 1.045 ///////////////////////////////////////////////////////////////////////// -/datum/song/New(atom/parent, list/instrument_ids) +/datum/song/New(atom/parent, list/instrument_ids, new_range) SSinstruments.on_song_new(src) lines = list() tempo = sanitize_tempo(tempo) @@ -125,6 +139,8 @@ hearing_mobs = list() volume = clamp(volume, min_volume, max_volume) update_sustain() + if(new_range) + instrument_range = new_range /datum/song/Destroy() stop_playing() @@ -135,12 +151,15 @@ parent = null return ..() +/** + * Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range. + */ /datum/song/proc/do_hearcheck() last_hearcheck = world.time var/list/old = hearing_mobs.Copy() hearing_mobs.len = 0 var/turf/source = get_turf(parent) - for(var/mob/M in get_hearers_in_view(15, source)) + for(var/mob/M in get_hearers_in_view(instrument_range, source)) if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS)) continue hearing_mobs[M] = get_dist(M, source) @@ -148,10 +167,15 @@ for(var/i in exited) terminate_sound_mob(i) -/// I can either be a datum, id, or path (if the instrument has no id). +/** + * Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum. + */ /datum/song/proc/set_instrument(datum/instrument/I) + terminate_all_sounds() + var/old_legacy if(using_instrument) using_instrument.songs_using -= src + old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY) using_instrument = null cached_samples = null cached_legacy_ext = null @@ -162,7 +186,7 @@ if(istype(I)) using_instrument = I I.songs_using += src - var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY) + var/instrument_legacy = (I.instrument_flags & INSTRUMENT_LEGACY) if(instrument_legacy) cached_legacy_ext = I.legacy_instrument_ext cached_legacy_dir = I.legacy_instrument_path @@ -170,23 +194,37 @@ else cached_samples = I.samples legacy = FALSE + if(isnull(old_legacy) || (old_legacy != instrument_legacy)) + if(playing) + compile_chords() -/// THIS IS A BLOCKING CALL. +/** + * Attempts to start playing our song. + */ /datum/song/proc/start_playing(mob/user) if(playing) return if(!using_instrument?.ready()) to_chat(user, "An error has occured with [src]. Please reset the instrument.") return + compile_chords() + if(!length(compiled_chords)) + to_chat(user, "Song is empty.") + return playing = TRUE - updateDialog() + updateDialog(user_playing) //we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak. //wrap the rest of the stuff to ensure stop_playing() is called. - last_process_decay = world.time + do_hearcheck() + elapsed_delay = 0 + delay_by = 0 + current_chord = 1 + user_playing = user START_PROCESSING(SSinstruments, src) - . = do_play_lines(user) - stop_playing() +/** + * Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs. + */ /datum/song/proc/stop_playing() if(!playing) return @@ -196,42 +234,93 @@ STOP_PROCESSING(SSinstruments, src) terminate_all_sounds(TRUE) hearing_mobs.len = 0 - updateDialog() + user_playing = null -/// THIS IS A BLOCKING CALL. -/datum/song/proc/do_play_lines(user) - if(!playing) +/** + * Processes our song. + */ +/datum/song/proc/process_song(wait) + if(!length(compiled_chords) || should_stop_playing(user_playing)) + stop_playing() return - do_hearcheck() - if(legacy) - do_play_lines_legacy(user) - else - do_play_lines_synthesized(user) + var/list/chord = compiled_chords[current_chord] + if(++elapsed_delay >= delay_by) + play_chord(chord) + elapsed_delay = 0 + delay_by = tempodiv_to_delay(chord[length(chord)]) + current_chord++ + if(current_chord > length(compiled_chords)) + if(repeat) + repeat-- + current_chord = 1 + return + else + stop_playing() + return +/** + * Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo. + */ +/datum/song/proc/tempodiv_to_delay(tempodiv) + if(!tempodiv) + tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason. + return max(1, round((tempo/tempodiv) / world.tick_lag, 1)) + +/** + * Compiles chords. + */ +/datum/song/proc/compile_chords() + legacy? compile_legacy() : compile_synthesized() + +/** + * Plays a chord. + */ +/datum/song/proc/play_chord(list/chord) + // last value is timing information + for(var/i in 1 to (length(chord) - 1)) + legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing) + +/** + * Checks if we should halt playback. + */ /datum/song/proc/should_stop_playing(mob/user) return QDELETED(parent) || !using_instrument || !playing +/** + * Sanitizes tempo to a value that makes sense and fits the current world.tick_lag. + */ /datum/song/proc/sanitize_tempo(new_tempo) new_tempo = abs(new_tempo) return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS) +/** + * Gets our beats per minute based on our tempo. + */ /datum/song/proc/get_bpm() return 600 / tempo +/** + * Sets our tempo from a beats-per-minute, sanitizing it to a valid number first. + */ /datum/song/proc/set_bpm(bpm) tempo = sanitize_tempo(600 / bpm) -/// Updates the window for our user. Override in subtypes. -/datum/song/proc/updateDialog(mob/user = usr) +/** + * Updates the window for our users. Override down the line. + */ +/datum/song/proc/updateDialog(mob/user) ui_interact(user) /datum/song/process(wait) if(!playing) return PROCESS_KILL - var/delay = world.time - last_process_decay - process_decay(delay) - last_process_decay = world.time + // it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up. + process_song(world.tick_lag) + process_decay(world.tick_lag) +/** + * Updates our cached linear/exponential falloff stuff, saving calculations down the line. + */ /datum/song/proc/update_sustain() // Exponential is easy cached_exponential_dropoff = sustain_exponential_dropoff @@ -241,21 +330,33 @@ var/volume_decrease_per_decisecond = volume_diff / target_duration cached_linear_dropoff = volume_decrease_per_decisecond +/** + * Setter for setting output volume. + */ /datum/song/proc/set_volume(volume) src.volume = clamp(volume, max(0, min_volume), min(100, max_volume)) update_sustain() updateDialog() +/** + * Setter for setting how low the volume has to get before a note is considered "dead" and dropped + */ /datum/song/proc/set_dropoff_volume(volume) sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) update_sustain() updateDialog() +/** + * Setter for setting exponential falloff factor. + */ /datum/song/proc/set_exponential_drop_rate(drop) sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) update_sustain() updateDialog() +/** + * Setter for setting linear falloff duration. + */ /datum/song/proc/set_linear_falloff_duration(duration) sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN) update_sustain() @@ -277,10 +378,8 @@ // subtype for handheld instruments, like violin /datum/song/handheld -/datum/song/handheld/updateDialog(mob/user = usr) - if(user.machine != src) - return - parent.ui_interact(user) +/datum/song/handheld/updateDialog(mob/user) + parent.ui_interact(user || usr) /datum/song/handheld/should_stop_playing(mob/user) . = ..() @@ -292,10 +391,8 @@ // subtype for stationary structures, like pianos /datum/song/stationary -/datum/song/stationary/updateDialog(mob/user = usr) - if(user.machine != src) - return - parent.ui_interact(user) +/datum/song/stationary/updateDialog(mob/user) + parent.ui_interact(user || usr) /datum/song/stationary/should_stop_playing(mob/user) . = ..() diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm index fa64656ebc..eee9be3cc7 100644 --- a/code/modules/instruments/songs/play_legacy.dm +++ b/code/modules/instruments/songs/play_legacy.dm @@ -1,48 +1,52 @@ -/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked. -/datum/song/proc/do_play_lines_legacy(mob/user) - while(repeat >= 0) - var/cur_oct[7] - var/cur_acc[7] - for(var/i = 1 to 7) - cur_oct[i] = 3 - cur_acc[i] = "n" +/** + * Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag. + */ +/datum/song/proc/compile_legacy() + if(!length(src.lines)) + return + var/list/lines = src.lines //cache for hyepr speed! + compiled_chords = list() + var/list/octaves = list(3, 3, 3, 3, 3, 3, 3) + var/list/accents = list("n", "n", "n", "n", "n", "n", "n") + for(var/line in lines) + var/list/chords = splittext(lowertext(line), ",") + for(var/chord in chords) + var/list/compiled_chord = list() + var/tempodiv = 1 + var/list/notes_tempodiv = splittext(chord, "/") + var/len = length(notes_tempodiv) + if(len >= 2) + tempodiv = text2num(notes_tempodiv[2]) + if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that. + var/list/notes = splittext(notes_tempodiv[1], "-") + for(var/note in notes) + if(length(note) == 0) + continue + // 1-7, A-G + var/key = text2ascii(note) - 96 + if((key < 1) || (key > 7)) + continue + for(var/i in 2 to length(note)) + var/oct_acc = copytext(note, i, i + 1) + var/num = text2num(oct_acc) + if(!num) //it's an accidental + accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks. + else //octave + octaves[key] = clamp(num, octave_min, octave_max) + compiled_chord[++compiled_chord.len] = list(key, accents[key], octaves[key]) + compiled_chord += tempodiv //this goes last + if(length(compiled_chord)) + compiled_chords[++compiled_chords.len] = compiled_chord - for(var/line in lines) - for(var/beat in splittext(lowertext(line), ",")) - if(should_stop_playing(user)) - return - var/list/notes = splittext(beat, "/") - if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1. - for(var/note in splittext(notes[1], "-")) - if(length(note) == 0) - continue - var/cur_note = text2ascii(note) - 96 - if(cur_note < 1 || cur_note > 7) - continue - for(var/i=2 to length(note)) - var/ni = copytext(note,i,i+1) - if(!text2num(ni)) - if(ni == "#" || ni == "b" || ni == "n") - cur_acc[cur_note] = ni - else if(ni == "s") - cur_acc[cur_note] = "#" // so shift is never required - else - cur_oct[cur_note] = text2num(ni) - playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note]) - if(notes.len >= 2 && text2num(notes[2])) - sleep(sanitize_tempo(tempo / text2num(notes[2]))) - else - sleep(tempo) - if(should_stop_playing(user)) - return - repeat-- - updateDialog() - repeat = 0 - -// note is a number from 1-7 for A-G -// acc is either "b", "n", or "#" -// oct is 1-8 (or 9 for C) -/datum/song/proc/playnote_legacy(note, acc as text, oct) +/** + * Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management. + * + * Arguments: + * * note is a number from 1-7 for A-G + * * acc is either "b", "n", or "#" + * * oct is 1-8 (or 9 for C) + */ +/datum/song/proc/playkey_legacy(note, acc as text, oct, mob/user) // handle accidental -> B<>C of E<>F if(acc == "b" && (note == 3 || note == 6)) // C or F if(note == 3) diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm index 5e7c5652a0..4df54f5e6b 100644 --- a/code/modules/instruments/songs/play_synthesized.dm +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -1,27 +1,7 @@ -/datum/song/proc/do_play_lines_synthesized(mob/user) - compile_lines() - while(repeat >= 0) - if(should_stop_playing(user)) - return - var/warned = FALSE - for(var/_chord in compiled_chords) - if(should_stop_playing(user)) - return - var/list/chord = _chord - var/tempodiv = chord[chord.len] - for(var/i in 1 to chord.len - 1) - var/key = chord[i] - if(!playkey_synth(key)) - if(!warned) - warned = TRUE - to_chat(user, "Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.") - sleep(sanitize_tempo(tempo / (tempodiv || 1))) - repeat-- - updateDialog() - repeat = 0 - -/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example -/datum/song/proc/compile_lines() +/** + * Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag. + */ +/datum/song/proc/compile_synthesized() if(!length(src.lines)) return var/list/lines = src.lines //cache for hyepr speed! @@ -57,10 +37,12 @@ compiled_chord += tempodiv //this goes last if(length(compiled_chord)) compiled_chords[++compiled_chords.len] = compiled_chord - CHECK_TICK - return compiled_chords -/datum/song/proc/playkey_synth(key) +/** + * Plays a specific numerical key from our instrument to anyone who can hear us. + * Does a hearing check if enough time has passed. + */ +/datum/song/proc/playkey_synth(key, mob/user) if(can_noteshift) key = clamp(key + note_shift, key_min, key_max) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) @@ -83,6 +65,9 @@ M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF) // Could do environment and echo later but not for now +/** + * Stops all sounds we are "responsible" for. Only works in synthesized mode. + */ /datum/song/proc/terminate_all_sounds(clear_channels = TRUE) for(var/i in hearing_mobs) terminate_sound_mob(i) @@ -93,10 +78,16 @@ using_sound_channels = 0 SSsounds.free_datum_channels(src) +/** + * Stops all sounds we are responsible for in a given person. Only works in synthesized mode. + */ /datum/song/proc/terminate_sound_mob(mob/M) for(var/channel in channels_playing) M.stop_sound_channel(text2num(channel)) +/** + * Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster. + */ /datum/song/proc/pop_channel() if(length(channels_idle)) //just pop one off of here if we have one available . = text2num(channels_idle[1]) @@ -108,6 +99,12 @@ if(!isnull(.)) using_sound_channels++ +/** + * Decays our channels and updates their volumes to mobs who can hear us. + * + * Arguments: + * * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation. + */ /datum/song/proc/process_decay(wait_ds) var/linear_dropoff = cached_linear_dropoff * wait_ds var/exponential_dropoff = cached_exponential_dropoff ** wait_ds diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index c31008fa62..c17b62ba6c 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -35,18 +35,20 @@ return destinations -/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent) +/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent, force_entry = FALSE) if(!turf_check(user)) return var/list/L = get_destinations(user) if(!L.len) - to_chat(user, "The [src.name] found no beacons in the world to anchor a wormhole to.") + to_chat(user, "The [name] found no beacons in the world to anchor a wormhole to.") return var/chosen_beacon = pick(L) - var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon)) + var/obj/effect/portal/jaunt_tunnel/J = new (get_turf(src), 100, null, FALSE, get_turf(chosen_beacon)) if(adjacent) try_move_adjacent(J) + if(force_entry) + J.teleport(user, force = TRUE) playsound(src,'sound/effects/sparks4.ogg',50,1) qdel(src) @@ -73,7 +75,7 @@ if(user.get_item_by_slot(SLOT_BELT) == src) to_chat(user, "Your [name] activates, saving you from the chasm!") SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation - activate(user, FALSE) + activate(user, FALSE, TRUE) else to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") @@ -84,9 +86,10 @@ icon_state = "bhole3" desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon." mech_sized = TRUE //save your ripley + teleport_channel = TELEPORT_CHANNEL_WORMHOLE innate_accuracy_penalty = 6 -/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M) +/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M, force = FALSE) . = ..() if(.) // KERPLUNK diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index 899bf91081..d1f7f15ac9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -14,14 +14,14 @@ name = "Standard" icon_state = "standard" -/datum/sprite_accessory/xeno_dorsal/royal - name = "Royal" - icon_state = "royal" - /datum/sprite_accessory/xeno_dorsal/down name = "Dorsal Down" icon_state = "down" +/datum/sprite_accessory/xeno_dorsal/royal + name = "Royal" + icon_state = "royal" + /****************************************** ************* Xeno Tails ****************** *******************************************/ @@ -57,14 +57,14 @@ name = "Standard" icon_state = "standard" -/datum/sprite_accessory/xeno_head/royal - name = "royal" - icon_state = "royal" - /datum/sprite_accessory/xeno_head/hollywood name = "hollywood" icon_state = "hollywood" +/datum/sprite_accessory/xeno_head/royal + name = "royal" + icon_state = "royal" + /datum/sprite_accessory/xeno_head/warrior name = "warrior" icon_state = "warrior" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index a04838a360..5286acb33a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -16,6 +16,12 @@ icon_state = "dtiger" gender_specific = 1 +/datum/sprite_accessory/body_markings/guilmon + name = "Guilmon" + icon_state = "guilmon" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + /datum/sprite_accessory/body_markings/ltiger name = "Light Tiger Body" icon_state = "ltiger" @@ -49,11 +55,6 @@ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' relevant_layers = null -/datum/sprite_accessory/mam_body_markings/plain - name = "Plain" - icon_state = "plain" - icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' - /datum/sprite_accessory/mam_body_markings/redpanda name = "Redpanda" icon_state = "redpanda" @@ -77,14 +78,14 @@ icon_state = "bellyslim" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' -/datum/sprite_accessory/mam_body_markings/corgi - name = "Corgi" - icon_state = "corgi" - /datum/sprite_accessory/mam_body_markings/cow name = "Bovine" icon_state = "bovine" +/datum/sprite_accessory/mam_body_markings/corgi + name = "Corgi" + icon_state = "corgi" + /datum/sprite_accessory/mam_body_markings/corvid name = "Corvid" icon_state = "corvid" @@ -139,15 +140,19 @@ name = "Hyena" icon_state = "hyena" -/datum/sprite_accessory/mam_body_markings/lab - name = "Lab" - icon_state = "lab" - /datum/sprite_accessory/mam_body_markings/insect name = "Insect" icon_state = "insect" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' +/datum/sprite_accessory/mam_body_markings/lab + name = "Lab" + icon_state = "lab" + +/datum/sprite_accessory/mam_body_markings/orca + name = "Orca" + icon_state = "orca" + /datum/sprite_accessory/mam_body_markings/otie name = "Otie" icon_state = "otie" @@ -156,14 +161,15 @@ name = "Otter" icon_state = "otter" -/datum/sprite_accessory/mam_body_markings/orca - name = "Orca" - icon_state = "orca" - /datum/sprite_accessory/mam_body_markings/panther name = "Panther" icon_state = "panther" +/datum/sprite_accessory/mam_body_markings/plain + name = "Plain" + icon_state = "plain" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + /datum/sprite_accessory/mam_body_markings/possum name = "Possum" icon_state = "possum" @@ -172,6 +178,10 @@ name = "Raccoon" icon_state = "raccoon" +/datum/sprite_accessory/mam_body_markings/sergal + name = "Sergal" + icon_state = "sergal" + /datum/sprite_accessory/mam_body_markings/pede name = "Scolipede" icon_state = "scolipede" @@ -181,18 +191,14 @@ name = "Shark" icon_state = "shark" -/datum/sprite_accessory/mam_body_markings/skunk - name = "Skunk" - icon_state = "skunk" - -/datum/sprite_accessory/mam_body_markings/sergal - name = "Sergal" - icon_state = "sergal" - /datum/sprite_accessory/mam_body_markings/shepherd name = "Shepherd" icon_state = "shepherd" +/datum/sprite_accessory/mam_body_markings/skunk + name = "Skunk" + icon_state = "skunk" + /datum/sprite_accessory/mam_body_markings/tajaran name = "Tajaran" icon_state = "tajaran" @@ -232,75 +238,10 @@ icon_state = "none" relevant_layers = null -/datum/sprite_accessory/insect_fluff/plain - name = "Plain" - icon_state = "plain" - -/datum/sprite_accessory/insect_fluff/reddish - name = "Reddish" - icon_state = "redish" - -/datum/sprite_accessory/insect_fluff/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/insect_fluff/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/insect_fluff/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/insect_fluff/whitefly - name = "White Fly" - icon_state = "whitefly" - /datum/sprite_accessory/insect_fluff/punished name = "Burnt Off" icon_state = "punished" -/datum/sprite_accessory/insect_fluff/firewatch - name = "Firewatch" - icon_state = "firewatch" - -/datum/sprite_accessory/insect_fluff/deathhead - name = "Deathshead" - icon_state = "deathhead" - -/datum/sprite_accessory/insect_fluff/poison - name = "Poison" - icon_state = "poison" - -/datum/sprite_accessory/insect_fluff/ragged - name = "Ragged" - icon_state = "ragged" - -/datum/sprite_accessory/insect_fluff/moonfly - name = "Moon Fly" - icon_state = "moonfly" - -/datum/sprite_accessory/insect_fluff/snow - name = "Snow" - icon_state = "snow" - -/datum/sprite_accessory/insect_fluff/oakworm - name = "Oak Worm" - icon_state = "oakworm" - -/datum/sprite_accessory/insect_fluff/jungle - name = "Jungle" - icon_state = "jungle" - -/datum/sprite_accessory/insect_fluff/witchwing - name = "Witch Wing" - icon_state = "witchwing" - -/datum/sprite_accessory/insect_fluff/colored - name = "Colored (Hair)" - icon_state = "snow" - color_src = HAIR - /datum/sprite_accessory/insect_fluff/colored1 name = "Colored (Primary)" icon_state = "snow" @@ -314,4 +255,69 @@ /datum/sprite_accessory/insect_fluff/colored3 name = "Colored (Tertiary)" icon_state = "snow" - color_src = MUTCOLORS3 \ No newline at end of file + color_src = MUTCOLORS3 + +/datum/sprite_accessory/insect_fluff/colored + name = "Colored (Hair)" + icon_state = "snow" + color_src = HAIR + +/datum/sprite_accessory/insect_fluff/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/insect_fluff/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/insect_fluff/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/insect_fluff/jungle + name = "Jungle" + icon_state = "jungle" + +/datum/sprite_accessory/insect_fluff/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/insect_fluff/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/insect_fluff/oakworm + name = "Oak Worm" + icon_state = "oakworm" + +/datum/sprite_accessory/insect_fluff/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/insect_fluff/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/insect_fluff/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/insect_fluff/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/insect_fluff/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/insect_fluff/snow + name = "Snow" + icon_state = "snow" + +/datum/sprite_accessory/insect_fluff/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/insect_fluff/witchwing + name = "Witch Wing" + icon_state = "witchwing" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index 1e6c797364..7515ce560a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -41,7 +41,7 @@ extra = TRUE extra_color_src = NONE -/datum/sprite_accessory/ears/human/bigwolfdark +/datum/sprite_accessory/ears/human/bigwolfdark //ignore alphabetical sort here for ease-of-use name = "Dark Big Wolf" icon_state = "bigwolfdark" icon = 'modular_citadel/icons/mob/mam_ears.dmi' @@ -55,6 +55,12 @@ extra = TRUE extra_color_src = NONE +/datum/sprite_accessory/ears/bunny + name = "Bunny" + icon_state = "bunny" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" @@ -74,6 +80,12 @@ icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MUTCOLORS3 +/datum/sprite_accessory/ears/lab + name = "Dog, Floppy" + icon_state = "lab" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/human/eevee name = "Eevee" icon_state = "eevee" @@ -115,12 +127,6 @@ icon_state = "jellyfish" color_src = HAIR -/datum/sprite_accessory/ears/lab - name = "Dog, Floppy" - icon_state = "lab" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_ears.dmi' - /datum/sprite_accessory/ears/murid name = "Murid" icon_state = "murid" @@ -133,18 +139,18 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_ears.dmi' -/datum/sprite_accessory/ears/human/pede - name = "Scolipede" - icon_state = "pede" - icon = 'modular_citadel/icons/mob/mam_ears.dmi' - color_src = MATRIXED - /datum/sprite_accessory/ears/human/rabbit name = "Rabbit" icon_state = "rabbit" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_ears.dmi' +/datum/sprite_accessory/ears/human/pede + name = "Scolipede" + icon_state = "pede" + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + color_src = MATRIXED + /datum/sprite_accessory/ears/human/sergal name = "Sergal" icon_state = "sergal" @@ -169,12 +175,6 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_ears.dmi' -/datum/sprite_accessory/ears/bunny - name = "Bunny" - icon_state = "bunny" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_ears.dmi' - /****************************************** *************** Furry Ears **************** *******************************************/ @@ -216,7 +216,7 @@ extra = TRUE extra_color_src = NONE -/datum/sprite_accessory/ears/mam_ears/bigwolfdark +/datum/sprite_accessory/ears/mam_ears/bigwolfdark //alphabetical sort ignored here for ease-of-use name = "Dark Big Wolf" icon_state = "bigwolfdark" @@ -226,6 +226,10 @@ extra = TRUE extra_color_src = NONE +/datum/sprite_accessory/ears/mam_ears/bunny + name = "Bunny" + icon_state = "bunny" + /datum/sprite_accessory/ears/mam_ears/cat name = "Cat" icon_state = "cat" @@ -256,13 +260,11 @@ name = "Eevee" icon_state = "eevee" - /datum/sprite_accessory/ears/mam_ears/elf name = "Elf" icon_state = "elf" color_src = MUTCOLORS3 - /datum/sprite_accessory/ears/mam_ears/elephant name = "Elephant" icon_state = "elephant" @@ -283,15 +285,15 @@ name = "Husky" icon_state = "wolf" -/datum/sprite_accessory/ears/mam_ears/kangaroo - name = "kangaroo" - icon_state = "kangaroo" - /datum/sprite_accessory/ears/mam_ears/jellyfish name = "Jellyfish" icon_state = "jellyfish" color_src = HAIR +/datum/sprite_accessory/ears/mam_ears/kangaroo + name = "kangaroo" + icon_state = "kangaroo" + /datum/sprite_accessory/ears/mam_ears/lab name = "Dog, Long" icon_state = "lab" @@ -304,18 +306,14 @@ name = "Otusian" icon_state = "otie" -/datum/sprite_accessory/ears/mam_ears/squirrel - name = "Squirrel" - icon_state = "squirrel" +/datum/sprite_accessory/ears/mam_ears/rabbit + name = "Rabbit" + icon_state = "rabbit" /datum/sprite_accessory/ears/mam_ears/pede name = "Scolipede" icon_state = "pede" -/datum/sprite_accessory/ears/mam_ears/rabbit - name = "Rabbit" - icon_state = "rabbit" - /datum/sprite_accessory/ears/mam_ears/sergal name = "Sergal" icon_state = "sergal" @@ -324,10 +322,10 @@ name = "skunk" icon_state = "skunk" +/datum/sprite_accessory/ears/mam_ears/squirrel + name = "Squirrel" + icon_state = "squirrel" + /datum/sprite_accessory/ears/mam_ears/wolf name = "Wolf" icon_state = "wolf" - -/datum/sprite_accessory/ears/mam_ears/bunny - name = "Bunny" - icon_state = "bunny" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index 18a76df116..49013161a9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -11,6 +11,10 @@ icon_state = "none" relevant_layers = null +/datum/sprite_accessory/frills/aquatic + name = "Aquatic" + icon_state = "aqua" + /datum/sprite_accessory/frills/simple name = "Simple" icon_state = "simple" @@ -18,7 +22,3 @@ /datum/sprite_accessory/frills/short name = "Short" icon_state = "short" - -/datum/sprite_accessory/frills/aquatic - name = "Aquatic" - icon_state = "aqua" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm index 34988f5656..a07fdaa5d3 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm @@ -6,6 +6,10 @@ gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P) // please make sure they're sorted alphabetically and categorized +/datum/sprite_accessory/facial_hair/shaved //this is exempt from the alphabetical sort + name = "Shaved" + icon_state = null + gender = NEUTER /datum/sprite_accessory/facial_hair/threeoclock name = "Beard (3 o\'Clock)" @@ -135,11 +139,6 @@ name = "Mutton Chops with Moustache" icon_state = "facial_muttonmus" -/datum/sprite_accessory/facial_hair/shaved - name = "Shaved" - icon_state = null - gender = NEUTER - /datum/sprite_accessory/facial_hair/sideburn name = "Sideburns" icon_state = "facial_sideburns" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 138704067d..8e4e6ad617 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -9,6 +9,10 @@ // try to spell // you do not need to define _s or _l sub-states, game automatically does this for you +/datum/sprite_accessory/hair/bald //this is exempt from the alphabetical sort + name = "Bald" + icon_state = "bald" + /datum/sprite_accessory/hair/afro name = "Afro" icon_state = "hair_afro" @@ -25,10 +29,6 @@ name = "Ahoge" icon_state = "hair_antenna" -/datum/sprite_accessory/hair/bald - name = "Bald" - icon_state = "bald" - /datum/sprite_accessory/hair/balding name = "Balding Hair" icon_state = "hair_e" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index 3a65eaebfa..aff342c7a6 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -12,22 +12,10 @@ icon_state = "none" relevant_layers = null -/datum/sprite_accessory/horns/simple - name = "Simple" - icon_state = "simple" - -/datum/sprite_accessory/horns/short - name = "Short" - icon_state = "short" - /datum/sprite_accessory/horns/curled name = "Curled" icon_state = "curled" -/datum/sprite_accessory/horns/ram - name = "Ram" - icon_state = "ram" - /datum/sprite_accessory/horns/angler name = "Angeler" icon_state = "angler" @@ -40,3 +28,15 @@ /datum/sprite_accessory/horns/guilmon name = "Guilmon" icon_state = "guilmon" + +/datum/sprite_accessory/horns/ram + name = "Ram" + icon_state = "ram" + +/datum/sprite_accessory/horns/simple + name = "Simple" + icon_state = "simple" + +/datum/sprite_accessory/horns/short + name = "Short" + icon_state = "short" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index 110ac69201..6019245b80 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -11,96 +11,90 @@ name = "Blank" icon_state = "blank" -/datum/sprite_accessory/screen/pink - name = "Pink" - icon_state = "pink" - -/datum/sprite_accessory/screen/green - name = "Green" - icon_state = "green" - -/datum/sprite_accessory/screen/red - name = "Red" - icon_state = "red" - /datum/sprite_accessory/screen/blue name = "Blue" icon_state = "blue" -/datum/sprite_accessory/screen/yellow - name = "Yellow" - icon_state = "yellow" - -/datum/sprite_accessory/screen/shower - name = "Shower" - icon_state = "shower" - -/datum/sprite_accessory/screen/nature - name = "Nature" - icon_state = "nature" - -/datum/sprite_accessory/screen/eight - name = "Eight" - icon_state = "eight" - -/datum/sprite_accessory/screen/goggles - name = "Goggles" - icon_state = "goggles" - -/datum/sprite_accessory/screen/heart - name = "Heart" - icon_state = "heart" - -/datum/sprite_accessory/screen/monoeye - name = "Mono eye" - icon_state = "monoeye" - /datum/sprite_accessory/screen/breakout name = "Breakout" icon_state = "breakout" -/datum/sprite_accessory/screen/purple - name = "Purple" - icon_state = "purple" - -/datum/sprite_accessory/screen/scroll - name = "Scroll" - icon_state = "scroll" +/datum/sprite_accessory/screen/bsod + name = "BSOD" + icon_state = "bsod" /datum/sprite_accessory/screen/console name = "Console" icon_state = "console" -/datum/sprite_accessory/screen/rgb - name = "RGB" - icon_state = "rgb" +/datum/sprite_accessory/screen/eight + name = "Eight" + icon_state = "eight" + +/datum/sprite_accessory/screen/eyes + name = "Eyes" + icon_state = "eyes" + +/datum/sprite_accessory/screen/ecgwave + name = "ECG wave" + icon_state = "ecgwave" + +/datum/sprite_accessory/screen/green + name = "Green" + icon_state = "green" + +/datum/sprite_accessory/screen/goggles + name = "Goggles" + icon_state = "goggles" /datum/sprite_accessory/screen/golglider name = "Gol Glider" icon_state = "golglider" +/datum/sprite_accessory/screen/heart + name = "Heart" + icon_state = "heart" + +/datum/sprite_accessory/screen/pink + name = "Pink" + icon_state = "pink" + +/datum/sprite_accessory/screen/red + name = "Red" + icon_state = "red" + +/datum/sprite_accessory/screen/monoeye + name = "Mono eye" + icon_state = "monoeye" + +/datum/sprite_accessory/screen/nature + name = "Nature" + icon_state = "nature" + +/datum/sprite_accessory/screen/purple + name = "Purple" + icon_state = "purple" + /datum/sprite_accessory/screen/rainbow name = "Rainbow" icon_state = "rainbow" -/datum/sprite_accessory/screen/sunburst - name = "Sunburst" - icon_state = "sunburst" - -/datum/sprite_accessory/screen/static - name = "Static" - icon_state = "static" - -//Oracle Station sprites - -/datum/sprite_accessory/screen/bsod - name = "BSOD" - icon_state = "bsod" - /datum/sprite_accessory/screen/redtext name = "Red Text" icon_state = "retext" +/datum/sprite_accessory/screen/rgb + name = "RGB" + icon_state = "rgb" + +/datum/sprite_accessory/screen/scroll + name = "Scroll" + icon_state = "scroll" + +/datum/sprite_accessory/screen/shower + name = "Shower" + icon_state = "shower" + /datum/sprite_accessory/screen/sinewave name = "Sine wave" icon_state = "sinewave" @@ -109,22 +103,25 @@ name = "Square wave" icon_state = "squarwave" -/datum/sprite_accessory/screen/ecgwave - name = "ECG wave" - icon_state = "ecgwave" +/datum/sprite_accessory/screen/stars + name = "Stars" + icon_state = "stars" -/datum/sprite_accessory/screen/eyes - name = "Eyes" - icon_state = "eyes" +/datum/sprite_accessory/screen/static + name = "Static" + icon_state = "static" + +/datum/sprite_accessory/screen/sunburst + name = "Sunburst" + icon_state = "sunburst" /datum/sprite_accessory/screen/textdrop name = "Text drop" icon_state = "textdrop" -/datum/sprite_accessory/screen/stars - name = "Stars" - icon_state = "stars" - +/datum/sprite_accessory/screen/yellow + name = "Yellow" + icon_state = "yellow" /****************************************** ************** IPC Antennas *************** @@ -145,14 +142,6 @@ name = "Angled Antennae" icon_state = "antennae" -/datum/sprite_accessory/antenna/tvantennae - name = "TV Antennae" - icon_state = "tvantennae" - -/datum/sprite_accessory/antenna/cyberhead - name = "Cyberhead" - icon_state = "cyberhead" - /datum/sprite_accessory/antenna/antlers name = "Antlers" icon_state = "antlers" @@ -160,3 +149,11 @@ /datum/sprite_accessory/antenna/crowned name = "Crowned" icon_state = "crowned" + +/datum/sprite_accessory/antenna/cyberhead + name = "Cyberhead" + icon_state = "cyberhead" + +/datum/sprite_accessory/antenna/tvantennae + name = "TV Antennae" + icon_state = "tvantennae" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm index d41f5ace22..6f7b955d8f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm @@ -49,6 +49,13 @@ relevant_layers = null hide_legs = FALSE +/datum/sprite_accessory/taur/canine + name = "Canine" + icon_state = "canine" + taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE + /datum/sprite_accessory/taur/cow name = "Cow" icon_state = "cow" @@ -95,6 +102,13 @@ color_src = MUTCOLORS extra = TRUE +/datum/sprite_accessory/taur/feline + name = "Feline" + icon_state = "feline" + taur_mode = STYLE_PAW_TAURIC + color_src = MUTCOLORS + extra = TRUE + /datum/sprite_accessory/taur/horse name = "Horse" icon_state = "horse" @@ -126,17 +140,3 @@ taur_mode = STYLE_SNEK_TAURIC color_src = MUTCOLORS hide_legs = USE_SNEK_CLIP_MASK - -/datum/sprite_accessory/taur/canine - name = "Canine" - icon_state = "canine" - taur_mode = STYLE_PAW_TAURIC - color_src = MUTCOLORS - extra = TRUE - -/datum/sprite_accessory/taur/feline - name = "Feline" - icon_state = "feline" - taur_mode = STYLE_PAW_TAURIC - color_src = MUTCOLORS - extra = TRUE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 2e14a88f29..99d2c67cc9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -7,14 +7,19 @@ var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC) -/datum/sprite_accessory/snouts/sharp - name = "Sharp" - icon_state = "sharp" +/datum/sprite_accessory/snout/guilmon + name = "Guilmon" + icon_state = "guilmon" + color_src = MATRIXED /datum/sprite_accessory/snouts/round name = "Round" icon_state = "round" +/datum/sprite_accessory/snouts/sharp + name = "Sharp" + icon_state = "sharp" + /datum/sprite_accessory/snouts/sharplight name = "Sharp + Light" icon_state = "sharplight" @@ -23,11 +28,6 @@ name = "Round + Light" icon_state = "roundlight" -/datum/sprite_accessory/snout/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - //christ this was a mistake, but it's here just in case someone wants to selectively fix -- Pooj /************* Lizard compatable snoots *********** /datum/sprite_accessory/snouts/bird @@ -157,7 +157,7 @@ /datum/sprite_accessory/snouts/mam_snouts color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' - recommended_species = list("mammal", "slimeperson", "insect", "podweak") + recommended_species = list("mammal", "slimeperson", "insect", "podweak", "lizard") mutant_part_string = "snout" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) @@ -192,13 +192,21 @@ extra = TRUE extra_color_src = MUTCOLORS3 -/datum/sprite_accessory/mam_snouts/skulldog - name = "Skulldog" - icon_state = "skulldog" - extra = TRUE - extra_color_src = MATRIXED +/datum/sprite_accessory/snouts/mam_snouts/husky + name = "Husky" + icon_state = "husky" -/datum/sprite_accessory/mam_snouts/lcanid +/datum/sprite_accessory/snouts/mam_snouts/rhino + name = "Horn" + icon_state = "rhino" + extra = TRUE + extra = MUTCOLORS3 + +/datum/sprite_accessory/snouts/mam_snouts/rodent + name = "Rodent" + icon_state = "rodent" + +/datum/sprite_accessory/snouts/mam_snouts/lcanid name = "Mammal, Long" icon_state = "lcanid" @@ -226,32 +234,20 @@ name = "Mammal, Thick ALT" icon_state = "wolfalt" -/datum/sprite_accessory/snouts/mam_snouts/redpanda - name = "WahCoon" - icon_state = "wah" - -/datum/sprite_accessory/snouts/mam_snouts/redpandaalt - name = "WahCoon ALT" - icon_state = "wahalt" - -/datum/sprite_accessory/snouts/mam_snouts/rhino - name = "Horn" - icon_state = "rhino" - extra = TRUE - extra = MUTCOLORS3 - -/datum/sprite_accessory/snouts/mam_snouts/rodent - name = "Rodent" - icon_state = "rodent" - -/datum/sprite_accessory/snouts/mam_snouts/husky - name = "Husky" - icon_state = "husky" - /datum/sprite_accessory/snouts/mam_snouts/otie name = "Otie" icon_state = "otie" +/datum/sprite_accessory/snouts/mam_snouts/round + name = "Round" + icon_state = "round" + color_src = MUTCOLORS + +/datum/sprite_accessory/snouts/mam_snouts/roundlight + name = "Round + Light" + icon_state = "roundlight" + color_src = MUTCOLORS + /datum/sprite_accessory/snouts/mam_snouts/pede name = "Scolipede" icon_state = "pede" @@ -268,30 +264,33 @@ name = "hShark" icon_state = "hshark" -/datum/sprite_accessory/snouts/mam_snouts/toucan - name = "Toucan" - icon_state = "toucan" - /datum/sprite_accessory/snouts/mam_snouts/sharp name = "Sharp" icon_state = "sharp" color_src = MUTCOLORS -/datum/sprite_accessory/snouts/mam_snouts/round - name = "Round" - icon_state = "round" - color_src = MUTCOLORS - /datum/sprite_accessory/snouts/mam_snouts/sharplight name = "Sharp + Light" icon_state = "sharplight" color_src = MUTCOLORS -/datum/sprite_accessory/snouts/mam_snouts/roundlight - name = "Round + Light" - icon_state = "roundlight" - color_src = MUTCOLORS +/datum/sprite_accessory/snouts/mam_snouts/skulldog + name = "Skulldog" + icon_state = "skulldog" + extra = TRUE + extra_color_src = MATRIXED +/datum/sprite_accessory/snouts/mam_snouts/toucan + name = "Toucan" + icon_state = "toucan" + +/datum/sprite_accessory/snouts/mam_snouts/redpanda + name = "WahCoon" + icon_state = "wah" + +/datum/sprite_accessory/snouts/mam_snouts/redpandaalt + name = "WahCoon ALT" + icon_state = "wahalt" /****************************************** **************** Snouts ******************* @@ -318,6 +317,16 @@ extra = TRUE extra_color_src = MUTCOLORS3 +/datum/sprite_accessory/snouts/mam_snouts/frhino + name = "Horn (Top)" + icon_state = "frhino" + extra = TRUE + extra = MUTCOLORS3 + +/datum/sprite_accessory/snouts/mam_snouts/fhusky + name = "Husky (Top)" + icon_state = "fhusky" + /datum/sprite_accessory/snouts/mam_snouts/flcanid name = "Mammal, Long (Top)" icon_state = "flcanid" @@ -346,27 +355,23 @@ name = "Mammal, Thick ALT (Top)" icon_state = "fwolfalt" -/datum/sprite_accessory/snouts/mam_snouts/fredpanda - name = "WahCoon (Top)" - icon_state = "fwah" - -/datum/sprite_accessory/snouts/mam_snouts/frhino - name = "Horn (Top)" - icon_state = "frhino" - extra = TRUE - extra = MUTCOLORS3 +/datum/sprite_accessory/snouts/mam_snouts/fotie + name = "Otie (Top)" + icon_state = "fotie" /datum/sprite_accessory/snouts/mam_snouts/frodent name = "Rodent (Top)" icon_state = "frodent" -/datum/sprite_accessory/snouts/mam_snouts/fhusky - name = "Husky (Top)" - icon_state = "fhusky" +/datum/sprite_accessory/snouts/mam_snouts/fround + name = "Round (Top)" + icon_state = "fround" + color_src = MUTCOLORS -/datum/sprite_accessory/snouts/mam_snouts/fotie - name = "Otie (Top)" - icon_state = "fotie" +/datum/sprite_accessory/snouts/mam_snouts/froundlight + name = "Round + Light (Top)" + icon_state = "froundlight" + color_src = MUTCOLORS /datum/sprite_accessory/snouts/mam_snouts/fpede name = "Scolipede (Top)" @@ -380,26 +385,20 @@ name = "Shark (Top)" icon_state = "fshark" -/datum/sprite_accessory/snouts/mam_snouts/ftoucan - name = "Toucan (Top)" - icon_state = "ftoucan" - /datum/sprite_accessory/snouts/mam_snouts/fsharp name = "Sharp (Top)" icon_state = "fsharp" color_src = MUTCOLORS -/datum/sprite_accessory/snouts/mam_snouts/fround - name = "Round (Top)" - icon_state = "fround" - color_src = MUTCOLORS - /datum/sprite_accessory/snouts/mam_snouts/fsharplight name = "Sharp + Light (Top)" icon_state = "fsharplight" color_src = MUTCOLORS -/datum/sprite_accessory/snouts/mam_snouts/froundlight - name = "Round + Light (Top)" - icon_state = "froundlight" - color_src = MUTCOLORS +/datum/sprite_accessory/snouts/mam_snouts/ftoucan + name = "Toucan (Top)" + icon_state = "ftoucan" + +/datum/sprite_accessory/snouts/mam_snouts/fredpanda + name = "WahCoon (Top)" + icon_state = "fwah" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm index 19ec677a72..ffb808eede 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm @@ -20,6 +20,10 @@ name = "Knee-high - Bee" icon_state = "bee_knee" +/datum/sprite_accessory/underwear/socks/christmas_knee + name = "Knee-High - Christmas" + icon_state = "christmas_knee" + /datum/sprite_accessory/underwear/socks/commie_knee name = "Knee-High - Commie" icon_state = "commie_knee" @@ -32,6 +36,14 @@ name = "Knee-high - Rainbow" icon_state = "rainbow_knee" +/datum/sprite_accessory/underwear/socks/candycaner_knee + name = "Knee-High - Red Candy Cane" + icon_state = "candycaner_knee" + +/datum/sprite_accessory/underwear/socks/candycaneg_knee //ignore alphabetisation for ease of use in scenarios like this + name = "Knee-High - Green Candy Cane" + icon_state = "candycaneg_knee" + /datum/sprite_accessory/underwear/socks/striped_knee name = "Knee-high - Striped" icon_state = "striped_knee" @@ -46,18 +58,6 @@ name = "Knee-High - UK" icon_state = "uk_knee" -/datum/sprite_accessory/underwear/socks/christmas_knee - name = "Knee-High - Christmas" - icon_state = "christmas_knee" - -/datum/sprite_accessory/underwear/socks/candycaner_knee - name = "Knee-High - Red Candy Cane" - icon_state = "candycaner_knee" - -/datum/sprite_accessory/underwear/socks/candycaneg_knee - name = "Knee-High - Green Candy Cane" - icon_state = "candycaneg_knee" - /datum/sprite_accessory/underwear/socks/socks_norm name = "Normal" icon_state = "socks_norm" @@ -129,22 +129,34 @@ name = "Thigh-high - Bee" icon_state = "bee_thigh" +/datum/sprite_accessory/underwear/socks/christmas_thigh + name = "Thigh-high - Christmas" + icon_state = "christmas_thigh" + /datum/sprite_accessory/underwear/socks/commie_thigh name = "Thigh-high - Commie" icon_state = "commie_thigh" -/datum/sprite_accessory/underwear/socks/usa_thigh - name = "Thigh-high - Freedom" - icon_state = "assblastusa_thigh" - /datum/sprite_accessory/underwear/socks/fishnet name = "Thigh-high - Fishnet" icon_state = "fishnet" +/datum/sprite_accessory/underwear/socks/usa_thigh + name = "Thigh-high - Freedom" + icon_state = "assblastusa_thigh" + /datum/sprite_accessory/underwear/socks/rainbow_thigh name = "Thigh-high - Rainbow" icon_state = "rainbow_thigh" +/datum/sprite_accessory/underwear/socks/candycaner_thigh + name = "Thigh-high - Red Candy Cane" + icon_state = "candycaner_thigh" + +/datum/sprite_accessory/underwear/socks/candycaneg_thigh + name = "Thigh-high - Green Candy Cane" + icon_state = "candycaneg_thigh" + /datum/sprite_accessory/underwear/socks/striped_thigh name = "Thigh-high - Striped" icon_state = "striped_thigh" @@ -157,16 +169,4 @@ /datum/sprite_accessory/underwear/socks/uk_thigh name = "Thigh-high - UK" - icon_state = "uk_thigh" - -/datum/sprite_accessory/underwear/socks/christmas_thigh - name = "Thigh-high - Christmas" - icon_state = "christmas_thigh" - -/datum/sprite_accessory/underwear/socks/candycaner_thigh - name = "Thigh-high - Red Candy Cane" - icon_state = "candycaner_thigh" - -/datum/sprite_accessory/underwear/socks/candycaneg_thigh - name = "Thigh-high - Green Candy Cane" - icon_state = "candycaneg_thigh" \ No newline at end of file + icon_state = "uk_thigh" \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm index 83415ed375..5d7207c934 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -21,21 +21,13 @@ name = "None" icon_state = "none" -/datum/sprite_accessory/spines/short - name = "Short" - icon_state = "short" +/datum/sprite_accessory/spines/aqautic + name = "Aquatic" + icon_state = "aqua" -/datum/sprite_accessory/spines_animated/short - name = "Short" - icon_state = "short" - -/datum/sprite_accessory/spines/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - -/datum/sprite_accessory/spines_animated/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" +/datum/sprite_accessory/spines_animated/aqautic + name = "Aquatic" + icon_state = "aqua" /datum/sprite_accessory/spines/long name = "Long" @@ -53,10 +45,18 @@ name = "Long + Membrane" icon_state = "longmeme" -/datum/sprite_accessory/spines/aqautic - name = "Aquatic" - icon_state = "aqua" +/datum/sprite_accessory/spines/short + name = "Short" + icon_state = "short" -/datum/sprite_accessory/spines_animated/aqautic - name = "Aquatic" - icon_state = "aqua" +/datum/sprite_accessory/spines_animated/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/spines/shortmeme + name = "Short + Membrane" + icon_state = "shortmeme" + +/datum/sprite_accessory/spines_animated/shortmeme + name = "Short + Membrane" + icon_state = "shortmeme" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index 16531d8f06..9addd15dca 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -25,12 +25,6 @@ icon_state = "synthliz_tertunder" //Synth body markings -/datum/sprite_accessory/mam_body_markings/synthliz - recommended_species = list("synthliz") - icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' - name = "Synthetic Lizard - Plates" - icon_state = "synthlizscutes" - /datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs" @@ -41,6 +35,12 @@ name = "Synthetic Lizard - Pecs Light" icon_state = "synthlizpecslight" +/datum/sprite_accessory/mam_body_markings/synthliz + recommended_species = list("synthliz") + icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' + name = "Synthetic Lizard - Plates" + icon_state = "synthlizscutes" + //Synth tails /datum/sprite_accessory/tails/mam_tails/synthliz recommended_species = list("synthliz") @@ -70,17 +70,17 @@ name = "Synthetic Lizard - Curled" icon_state = "synth_curled" -/datum/sprite_accessory/antenna/synthliz/synthliz_thick +/datum/sprite_accessory/antenna/synthliz/synth_horns icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' color_src = MUTCOLORS - name = "Synthetic Lizard - Thick" - icon_state = "synth_thick" + name = "Synthetic Lizard - Horns" + icon_state = "synth_horns" -/datum/sprite_accessory/antenna/synthliz/synth_thicklight +/datum/sprite_accessory/antenna/synthliz/synth_hornslight icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' color_src = MATRIXED - name = "Synthetic Lizard - Thick Light" - icon_state = "synth_thicklight" + name = "Synthetic Lizard - Horns Light" + icon_state = "synth_hornslight" /datum/sprite_accessory/antenna/synthliz/synth_short icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' @@ -100,17 +100,17 @@ name = "Synthetic Lizard - Sharp Light" icon_state = "synth_sharplight" -/datum/sprite_accessory/antenna/synthliz/synth_horns +/datum/sprite_accessory/antenna/synthliz/synthliz_thick icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' color_src = MUTCOLORS - name = "Synthetic Lizard - Horns" - icon_state = "synth_horns" + name = "Synthetic Lizard - Thick" + icon_state = "synth_thick" -/datum/sprite_accessory/antenna/synthliz/synth_hornslight +/datum/sprite_accessory/antenna/synthliz/synth_thicklight icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' color_src = MATRIXED - name = "Synthetic Lizard - Horns Light" - icon_state = "synth_hornslight" + name = "Synthetic Lizard - Thick Light" + icon_state = "synth_thicklight" //Synth Taurs (Ported from Virgo) /datum/sprite_accessory/taur/synthliz diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 812e0c052c..d9e2de1525 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -18,38 +18,7 @@ /datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric) return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"]) -/datum/sprite_accessory/tails/lizard/smooth - name = "Smooth" - icon_state = "smooth" - -/datum/sprite_accessory/tails_animated/lizard/smooth - name = "Smooth" - icon_state = "smooth" - -/datum/sprite_accessory/tails/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails_animated/lizard/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails_animated/lizard/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails/lizard/spikes - name = "Spikes" - icon_state = "spikes" - -/datum/sprite_accessory/tails_animated/lizard/spikes - name = "Spikes" - icon_state = "spikes" - +//this goes first regardless of alphabetical order /datum/sprite_accessory/tails/lizard/none name = "None" icon_state = "None" @@ -72,11 +41,13 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/datum/sprite_accessory/body_markings/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' +/datum/sprite_accessory/tails/lizard/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + +/datum/sprite_accessory/tails_animated/lizard/dtiger + name = "Dark Tiger" + icon_state = "dtiger" /datum/sprite_accessory/tails/lizard/guilmon name = "Guilmon" @@ -90,6 +61,30 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/tails/lizard/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails_animated/lizard/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails/lizard/smooth + name = "Smooth" + icon_state = "smooth" + +/datum/sprite_accessory/tails_animated/lizard/smooth + name = "Smooth" + icon_state = "smooth" + +/datum/sprite_accessory/tails/lizard/spikes + name = "Spikes" + icon_state = "spikes" + +/datum/sprite_accessory/tails_animated/lizard/spikes + name = "Spikes" + icon_state = "spikes" + /****************************************** ************** Human Tails **************** *******************************************/ @@ -107,18 +102,6 @@ /datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric) return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"]) -/datum/sprite_accessory/tails/human/ailurus - name = "Red Panda" - icon_state = "wah" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - color_src = MATRIXED - -/datum/sprite_accessory/tails_animated/human/ailurus - name = "Red Panda" - icon_state = "wah" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - color_src = MATRIXED - /datum/sprite_accessory/tails/human/axolotl name = "Axolotl" icon_state = "axolotl" @@ -199,6 +182,14 @@ icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED +/datum/sprite_accessory/tails/human/corvid + name = "Corvid" + icon_state = "crow" + +/datum/sprite_accessory/tails_animated/human/corvid + name = "Corvid" + icon_state = "crow" + /datum/sprite_accessory/tails/human/cow name = "Cow" icon_state = "cow" @@ -211,13 +202,25 @@ icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED -/datum/sprite_accessory/tails/human/corvid - name = "Corvid" - icon_state = "crow" +/datum/sprite_accessory/tails/human/dtiger + name = "Dark Tiger" + icon_state = "dtiger" -/datum/sprite_accessory/tails_animated/human/corvid - name = "Corvid" - icon_state = "crow" +/datum/sprite_accessory/tails_animated/human/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + +/datum/sprite_accessory/tails/human/datashark + name = "datashark" + icon_state = "datashark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + +/datum/sprite_accessory/tails_animated/human/datashark + name = "datashark" + icon_state = "datashark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' /datum/sprite_accessory/tails/human/eevee name = "Eevee" @@ -298,7 +301,7 @@ color_src = MATRIXED /datum/sprite_accessory/tails_animated/human/insect - name = "insect" + name = "Insect" icon_state = "insect" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED @@ -315,6 +318,14 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/tails/human/ltiger + name = "Light Tiger" + icon_state = "ltiger" + +/datum/sprite_accessory/tails_animated/human/ltiger + name = "Light Tiger" + icon_state = "ltiger" + /datum/sprite_accessory/tails/human/murid name = "Murid" icon_state = "murid" @@ -327,18 +338,6 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/datum/sprite_accessory/tails/human/otie - name = "Otusian" - icon_state = "otie" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - -/datum/sprite_accessory/tails_animated/human/otie - name = "Otusian" - icon_state = "otie" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - /datum/sprite_accessory/tails/orca name = "Orca" icon_state = "orca" @@ -351,15 +350,15 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/datum/sprite_accessory/tails/human/pede - name = "Scolipede" - icon_state = "pede" +/datum/sprite_accessory/tails/human/otie + name = "Otusian" + icon_state = "otie" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/datum/sprite_accessory/tails_animated/human/pede - name = "Scolipede" - icon_state = "pede" +/datum/sprite_accessory/tails_animated/human/otie + name = "Otusian" + icon_state = "otie" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' @@ -375,6 +374,30 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/tails/human/ailurus + name = "Red Panda" + icon_state = "wah" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + color_src = MATRIXED + +/datum/sprite_accessory/tails_animated/human/ailurus + name = "Red Panda" + icon_state = "wah" + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + color_src = MATRIXED + +/datum/sprite_accessory/tails/human/pede + name = "Scolipede" + icon_state = "pede" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + +/datum/sprite_accessory/tails_animated/human/pede + name = "Scolipede" + icon_state = "pede" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + /datum/sprite_accessory/tails/human/sergal name = "Sergal" icon_state = "sergal" @@ -387,6 +410,18 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' +/datum/sprite_accessory/tails/human/shark + name = "Shark" + icon_state = "shark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + +/datum/sprite_accessory/tails_animated/human/shark + name = "Shark" + icon_state = "shark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + /datum/sprite_accessory/tails/human/skunk name = "skunk" icon_state = "skunk" @@ -415,30 +450,6 @@ name = "Spikes" icon_state = "spikes" -/datum/sprite_accessory/tails/human/shark - name = "Shark" - icon_state = "shark" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - -/datum/sprite_accessory/tails_animated/human/shark - name = "Shark" - icon_state = "shark" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - -/datum/sprite_accessory/tails/human/datashark - name = "datashark" - icon_state = "datashark" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - -/datum/sprite_accessory/tails_animated/human/datashark - name = "datashark" - icon_state = "datashark" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - /datum/sprite_accessory/tails/human/straighttail name = "Straight Tail" icon_state = "straighttail" @@ -495,22 +506,6 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' -/datum/sprite_accessory/tails/human/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails_animated/human/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - -/datum/sprite_accessory/tails/human/ltiger - name = "Light Tiger" - icon_state = "ltiger" - -/datum/sprite_accessory/tails_animated/human/ltiger - name = "Light Tiger" - icon_state = "ltiger" - /datum/sprite_accessory/tails/human/wolf name = "Wolf" icon_state = "wolf" @@ -554,16 +549,6 @@ icon_state = "none" relevant_layers = null -/datum/sprite_accessory/tails/mam_tails/ailurus - name = "Red Panda" - icon_state = "wah" - extra = TRUE - -/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus - name = "Red Panda" - icon_state = "wah" - extra = TRUE - /datum/sprite_accessory/tails/mam_tails/axolotl name = "Axolotl" icon_state = "axolotl" @@ -638,6 +623,18 @@ name = "Cow" icon_state = "cow" +/datum/sprite_accessory/tails/mam_tails/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + color_src = MUTCOLORS + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger + name = "Dark Tiger" + icon_state = "dtiger" + color_src = MUTCOLORS + icon = 'icons/mob/mutant_bodyparts.dmi' + /datum/sprite_accessory/tails/mam_tails/eevee name = "Eevee" icon_state = "eevee" @@ -728,6 +725,18 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Lab" icon_state = "lab" +/datum/sprite_accessory/tails/mam_tails/ltiger + name = "Light Tiger" + icon_state = "ltiger" + color_src = MUTCOLORS + icon = 'icons/mob/mutant_bodyparts.dmi' + +/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger + name = "Light Tiger" + icon_state = "ltiger" + color_src = MUTCOLORS + icon = 'icons/mob/mutant_bodyparts.dmi' + /datum/sprite_accessory/tails/mam_tails/murid name = "Murid" icon_state = "murid" @@ -736,14 +745,6 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Murid" icon_state = "murid" -/datum/sprite_accessory/tails/mam_tails/otie - name = "Otusian" - icon_state = "otie" - -/datum/sprite_accessory/tails_animated/mam_tails_animated/otie - name = "Otusian" - icon_state = "otie" - /datum/sprite_accessory/tails/mam_tails/orca name = "Orca" icon_state = "orca" @@ -752,13 +753,13 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Orca" icon_state = "orca" -/datum/sprite_accessory/tails/mam_tails/pede - name = "Scolipede" - icon_state = "pede" +/datum/sprite_accessory/tails/mam_tails/otie + name = "Otusian" + icon_state = "otie" -/datum/sprite_accessory/tails_animated/mam_tails_animated/pede - name = "Scolipede" - icon_state = "pede" +/datum/sprite_accessory/tails_animated/mam_tails_animated/otie + name = "Otusian" + icon_state = "otie" /datum/sprite_accessory/tails/mam_tails/rabbit name = "Rabbit" @@ -768,6 +769,24 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Rabbit" icon_state = "rabbit" +/datum/sprite_accessory/tails/mam_tails/ailurus + name = "Red Panda" + icon_state = "wah" + extra = TRUE + +/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus + name = "Red Panda" + icon_state = "wah" + extra = TRUE + +/datum/sprite_accessory/tails/mam_tails/pede + name = "Scolipede" + icon_state = "pede" + +/datum/sprite_accessory/tails_animated/mam_tails_animated/pede + name = "Scolipede" + icon_state = "pede" + /datum/sprite_accessory/tails/mam_tails/sergal name = "Sergal" icon_state = "sergal" @@ -776,6 +795,22 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Sergal" icon_state = "sergal" +/datum/sprite_accessory/tails/mam_tails/shark + name = "Shark" + icon_state = "shark" + +/datum/sprite_accessory/tails_animated/mam_tails_animated/shark + name = "Shark" + icon_state = "shark" + +/datum/sprite_accessory/tails/mam_tails/shepherd + name = "Shepherd" + icon_state = "shepherd" + +/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd + name = "Shepherd" + icon_state = "shepherd" + /datum/sprite_accessory/tails/mam_tails/skunk name = "Skunk" icon_state = "skunk" @@ -808,22 +843,6 @@ datum/sprite_accessory/tails/mam_tails/insect color_src = MUTCOLORS icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/tails/mam_tails/shark - name = "Shark" - icon_state = "shark" - -/datum/sprite_accessory/tails_animated/mam_tails_animated/shark - name = "Shark" - icon_state = "shark" - -/datum/sprite_accessory/tails/mam_tails/shepherd - name = "Shepherd" - icon_state = "shepherd" - -/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd - name = "Shepherd" - icon_state = "shepherd" - /datum/sprite_accessory/tails/mam_tails/straighttail name = "Straight Tail" icon_state = "straighttail" @@ -864,30 +883,6 @@ datum/sprite_accessory/tails/mam_tails/insect name = "Tiger" icon_state = "tiger" -/datum/sprite_accessory/tails/mam_tails/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - color_src = MUTCOLORS - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger - name = "Dark Tiger" - icon_state = "dtiger" - color_src = MUTCOLORS - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/tails/mam_tails/ltiger - name = "Light Tiger" - icon_state = "ltiger" - color_src = MUTCOLORS - icon = 'icons/mob/mutant_bodyparts.dmi' - -/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger - name = "Light Tiger" - icon_state = "ltiger" - color_src = MUTCOLORS - icon = 'icons/mob/mutant_bodyparts.dmi' - /datum/sprite_accessory/tails/mam_tails/wolf name = "Wolf" icon_state = "wolf" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm index b8282931d2..1be02c207e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/undershirt.dm @@ -12,6 +12,38 @@ // please make sure they're sorted alphabetically and categorized +/datum/sprite_accessory/underwear/top/cowboyshirt + name = "Cowboy Shirt Black" + icon_state = "cowboyshirt" + +/datum/sprite_accessory/underwear/top/cowboyshirt/red + name = "Cowboy Shirt Red" + icon_state = "cowboyshirt_red" + +/datum/sprite_accessory/underwear/top/cowboyshirt/navy + name = "Cowboy Shirt Navy" + icon_state = "cowboyshirt_navy" + +/datum/sprite_accessory/underwear/top/cowboyshirt/white + name = "Cowboy Shirt White" + icon_state = "cowboyshirt_white" + +/datum/sprite_accessory/underwear/top/cowboyshirt/s + name = "Cowboy Shirt Shortsleeved Black" + icon_state = "cowboyshirt_s" + +/datum/sprite_accessory/underwear/top/cowboyshirt/red/s + name = "Cowboy Shirt Shortsleeved Red" + icon_state = "cowboyshirt_reds" + +/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s + name = "Cowboy Shirt Shortsleeved Navy" + icon_state = "cowboyshirt_navys" + +/datum/sprite_accessory/underwear/top/cowboyshirt/white/s + name = "Cowboy Shirt Shortsleeved White" + icon_state = "cowboyshirt_whites" + /datum/sprite_accessory/underwear/top/longjon name = "Long John Shirt" icon_state = "ljont" @@ -30,36 +62,6 @@ icon_state = "undershirt" has_color = TRUE -/datum/sprite_accessory/underwear/top/bowlingw - name = "Shirt - Bowling" - icon_state = "bowlingw" - has_color = TRUE - -/datum/sprite_accessory/underwear/top/bowling - name = "Shirt, Bowling - Red" - icon_state = "bowling" - -/datum/sprite_accessory/underwear/top/bowlingp - name = "Shirt, Bowling - Pink" - icon_state = "bowlingp" - -/datum/sprite_accessory/underwear/top/bowlinga - name = "Shirt, Bowling - Aqua" - icon_state = "bowlinga" - -/datum/sprite_accessory/underwear/top/bluejersey - name = "Shirt, Jersey - Blue" - icon_state = "shirt_bluejersey" - -/datum/sprite_accessory/underwear/top/redjersey - name = "Shirt, Jersey - Red" - icon_state = "shirt_redjersey" - -/datum/sprite_accessory/underwear/top/polo - name = "Shirt - Polo" - icon_state = "polo" - has_color = TRUE - /datum/sprite_accessory/underwear/top/alienshirt name = "Shirt - Alien" icon_state = "shirt_alien" @@ -72,6 +74,23 @@ name = "Shirt - Bee" icon_state = "bee_shirt" +/datum/sprite_accessory/underwear/top/bowlingw + name = "Shirt - Bowling" + icon_state = "bowlingw" + has_color = TRUE + +/datum/sprite_accessory/underwear/top/bowlinga + name = "Shirt, Bowling - Aqua" + icon_state = "bowlinga" + +/datum/sprite_accessory/underwear/top/bowling + name = "Shirt, Bowling - Red" + icon_state = "bowling" + +/datum/sprite_accessory/underwear/top/bowlingp + name = "Shirt, Bowling - Pink" + icon_state = "bowlingp" + /datum/sprite_accessory/underwear/top/clownshirt name = "Shirt - Clown" icon_state = "shirt_clown" @@ -88,6 +107,14 @@ name = "Shirt - I Love NT" icon_state = "ilovent" +/datum/sprite_accessory/underwear/top/bluejersey + name = "Shirt, Jersey - Blue" + icon_state = "shirt_bluejersey" + +/datum/sprite_accessory/underwear/top/redjersey + name = "Shirt, Jersey - Red" + icon_state = "shirt_redjersey" + /datum/sprite_accessory/underwear/top/lover name = "Shirt - Lover" icon_state = "lover" @@ -112,6 +139,11 @@ name = "Shirt - Pogoman" icon_state = "pogoman" +/datum/sprite_accessory/underwear/top/polo + name = "Shirt - Polo" + icon_state = "polo" + has_color = TRUE + /datum/sprite_accessory/underwear/top/question name = "Shirt - Question" icon_state = "shirt_question" @@ -120,6 +152,23 @@ name = "Shirt - Skull" icon_state = "shirt_skull" +/datum/sprite_accessory/underwear/top/shortsleeve + name = "Shirt - Short Sleeved" + icon_state = "shortsleeve" + has_color = TRUE + +/datum/sprite_accessory/underwear/top/blueshirtsport + name = "Shirt, Sports - Blue" + icon_state = "blueshirtsport" + +/datum/sprite_accessory/underwear/top/greenshirtsport + name = "Shirt, Sports - Green" + icon_state = "greenshirtsport" + +/datum/sprite_accessory/underwear/top/redshirtsport + name = "Shirt, Sports - Red" + icon_state = "redshirtsport" + /datum/sprite_accessory/underwear/top/ss13 name = "Shirt - SS13" icon_state = "shirt_ss13" @@ -141,27 +190,6 @@ name = "Shirt - USA" icon_state = "shirt_assblastusa" -/datum/sprite_accessory/underwear/top/shortsleeve - name = "Shirt - Short Sleeved" - icon_state = "shortsleeve" - has_color = TRUE - -/datum/sprite_accessory/underwear/top/blueshirtsport - name = "Shirt, Sports - Blue" - icon_state = "blueshirtsport" - -/datum/sprite_accessory/underwear/top/greenshirtsport - name = "Shirt, Sports - Green" - icon_state = "greenshirtsport" - -/datum/sprite_accessory/underwear/top/redshirtsport - name = "Shirt, Sports - Red" - icon_state = "redshirtsport" - -/datum/sprite_accessory/underwear/top/tankfire - name = "Tank Top - Fire" - icon_state = "tank_fire" - /datum/sprite_accessory/underwear/top/tanktop name = "Tank Top" icon_state = "tanktop" @@ -172,6 +200,10 @@ icon_state = "tanktop_alt" has_color = TRUE +/datum/sprite_accessory/underwear/top/tankfire + name = "Tank Top - Fire" + icon_state = "tank_fire" + /datum/sprite_accessory/underwear/top/tanktop_midriff name = "Tank Top - Midriff" icon_state = "tank_midriff" @@ -192,6 +224,8 @@ name = "Tank top - Sun" icon_state = "tank_sun" +//feminine accessories from here on + /datum/sprite_accessory/underwear/top/babydoll name = "Baby-Doll" icon_state = "babydoll" @@ -210,15 +244,25 @@ has_color = TRUE gender = FEMALE -/datum/sprite_accessory/underwear/top/bra_thin - name = "Bra - Thin" - icon_state = "bra_thin" - has_color = TRUE +/datum/sprite_accessory/underwear/top/bra_beekini + name = "Bra - Bee-kini" + icon_state = "bra_bee-kini" gender = FEMALE -/datum/sprite_accessory/underwear/top/bra_kinky - name = "Bra - Kinky Black" - icon_state = "bra_kinky" +/datum/sprite_accessory/underwear/top/bra_binder + name = "Bra (binder)" + icon_state = "bra_binder" + has_color = TRUE + +/datum/sprite_accessory/underwear/top/bra_binder_strapless + name = "Bra (binder, strapless)" + icon_state = "bra_binder_strapless" + has_color = TRUE + + +/datum/sprite_accessory/underwear/top/bra_commie + name = "Bra - Commie" + icon_state = "bra_commie" gender = FEMALE /datum/sprite_accessory/underwear/top/bra_freedom @@ -226,33 +270,17 @@ icon_state = "bra_assblastusa" gender = FEMALE -/datum/sprite_accessory/underwear/top/bra_commie - name = "Bra - Commie" - icon_state = "bra_commie" - gender = FEMALE - -/datum/sprite_accessory/underwear/top/bra_beekini - name = "Bra - Bee-kini" - icon_state = "bra_bee-kini" - gender = FEMALE - -/datum/sprite_accessory/underwear/top/bra_uk - name = "Bra - UK" - icon_state = "bra_uk" - gender = FEMALE - -/datum/sprite_accessory/underwear/top/bra_neko - name = "Bra - Neko" - icon_state = "bra_neko" - has_color = TRUE - gender = FEMALE - /datum/sprite_accessory/underwear/top/halterneck_bra name = "Bra - Halterneck" icon_state = "halterneck_bra" has_color = TRUE gender = FEMALE +/datum/sprite_accessory/underwear/top/bra_kinky + name = "Bra - Kinky Black" + icon_state = "bra_kinky" + gender = FEMALE + /datum/sprite_accessory/underwear/top/sports_bra name = "Bra, Sports" icon_state = "sports_bra" @@ -283,9 +311,21 @@ has_color = TRUE gender = FEMALE -/datum/sprite_accessory/underwear/top/fishnet_sleeves - name = "Fishnet - sleeves" - icon_state = "fishnet_sleeves" +/datum/sprite_accessory/underwear/top/bra_thin + name = "Bra - Thin" + icon_state = "bra_thin" + has_color = TRUE + gender = FEMALE + +/datum/sprite_accessory/underwear/top/bra_neko + name = "Bra - Neko" + icon_state = "bra_neko" + has_color = TRUE + gender = FEMALE + +/datum/sprite_accessory/underwear/top/bra_uk + name = "Bra - UK" + icon_state = "bra_uk" gender = FEMALE /datum/sprite_accessory/underwear/top/fishnet_gloves @@ -293,6 +333,11 @@ icon_state = "fishnet_gloves" gender = FEMALE +/datum/sprite_accessory/underwear/top/fishnet_sleeves + name = "Fishnet - sleeves" + icon_state = "fishnet_sleeves" + gender = FEMALE + /datum/sprite_accessory/underwear/top/fishnet_base name = "Fishnet - top" icon_state = "fishnet_body" @@ -315,45 +360,3 @@ icon_state = "tubetop" has_color = TRUE gender = FEMALE - -/datum/sprite_accessory/underwear/top/cowboyshirt - name = "Cowboy Shirt Black" - icon_state = "cowboyshirt" - -/datum/sprite_accessory/underwear/top/cowboyshirt/s - name = "Cowboy Shirt Shortsleeved Black" - icon_state = "cowboyshirt_s" - -/datum/sprite_accessory/underwear/top/cowboyshirt/white - name = "Cowboy Shirt White" - icon_state = "cowboyshirt_white" - -/datum/sprite_accessory/underwear/top/cowboyshirt/white/s - name = "Cowboy Shirt Shortsleeved White" - icon_state = "cowboyshirt_whites" - -/datum/sprite_accessory/underwear/top/cowboyshirt/navy - name = "Cowboy Shirt Navy" - icon_state = "cowboyshirt_navy" - -/datum/sprite_accessory/underwear/top/cowboyshirt/navy/s - name = "Cowboy Shirt Shortsleeved Navy" - icon_state = "cowboyshirt_navys" - -/datum/sprite_accessory/underwear/top/cowboyshirt/red - name = "Cowboy Shirt Red" - icon_state = "cowboyshirt_red" - -/datum/sprite_accessory/underwear/top/cowboyshirt/red/s - name = "Cowboy Shirt Shortsleeved Red" - icon_state = "cowboyshirt_reds" - -/datum/sprite_accessory/underwear/top/bra_binder - name = "Bra (binder)" - icon_state = "bra_binder" - has_color = TRUE - -/datum/sprite_accessory/underwear/top/bra_binder_strapless - name = "Bra (binder, strapless)" - icon_state = "bra_binder_strapless" - has_color = TRUE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm index 58d5e1ba88..edfeba79f1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm @@ -10,18 +10,6 @@ icon_state = null covers_groin = FALSE -/datum/sprite_accessory/underwear/bottom/mankini - name = "Mankini" - icon_state = "mankini" - has_color = TRUE - gender = MALE - -/datum/sprite_accessory/underwear/bottom/male_kinky - name = "Jockstrap" - icon_state = "jockstrap" - has_color = TRUE - gender = MALE - /datum/sprite_accessory/underwear/bottom/briefs name = "Briefs" icon_state = "briefs" @@ -77,6 +65,26 @@ has_digitigrade = TRUE has_color = TRUE +/datum/sprite_accessory/underwear/bottom/male_kinky + name = "Jockstrap" + icon_state = "jockstrap" + has_color = TRUE + gender = MALE + +/datum/sprite_accessory/underwear/bottom/longjon + name = "Long John Bottoms" + icon_state = "ljonb" + has_digitigrade = TRUE + has_color = TRUE + +/datum/sprite_accessory/underwear/bottom/mankini + name = "Mankini" + icon_state = "mankini" + has_color = TRUE + gender = MALE + +//feminine underwear from here on + /datum/sprite_accessory/underwear/bottom/panties name = "Panties" icon_state = "panties" @@ -89,11 +97,6 @@ has_color = TRUE gender = FEMALE -/datum/sprite_accessory/underwear/bottom/fishnet_lower - name = "Panties - Fishnet" - icon_state = "fishnet_lower" - gender = FEMALE - /datum/sprite_accessory/underwear/bottom/female_beekini name = "Panties - Bee-kini" icon_state = "panties_bee-kini" @@ -104,6 +107,11 @@ icon_state = "panties_commie" gender = FEMALE +/datum/sprite_accessory/underwear/bottom/fishnet_lower + name = "Panties - Fishnet" + icon_state = "fishnet_lower" + gender = FEMALE + /datum/sprite_accessory/underwear/bottom/female_usastripe name = "Panties - Freedom" icon_state = "panties_assblastusa" @@ -114,11 +122,6 @@ icon_state = "panties_kinky" gender = FEMALE -/datum/sprite_accessory/underwear/bottom/panties_uk - name = "Panties - UK" - icon_state = "panties_uk" - gender = FEMALE - /datum/sprite_accessory/underwear/bottom/panties_neko name = "Panties - Neko" icon_state = "panties_neko" @@ -149,17 +152,10 @@ has_color = TRUE gender = FEMALE -/datum/sprite_accessory/underwear/bottom/longjon - name = "Long John Bottoms" - icon_state = "ljonb" - has_digitigrade = TRUE - has_color = TRUE - -/datum/sprite_accessory/underwear/bottom/swimsuit_red - name = "Swimsuit, One Piece - Red" - icon_state = "swimming_red" +/datum/sprite_accessory/underwear/bottom/panties_uk + name = "Panties - UK" + icon_state = "panties_uk" gender = FEMALE - covers_chest = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit name = "Swimsuit, One Piece - Black" @@ -173,6 +169,12 @@ gender = FEMALE covers_chest = TRUE +/datum/sprite_accessory/underwear/bottom/swimsuit_red + name = "Swimsuit, One Piece - Red" + icon_state = "swimming_red" + gender = FEMALE + covers_chest = TRUE + /datum/sprite_accessory/underwear/bottom/thong name = "Thong" icon_state = "thong" @@ -184,5 +186,3 @@ icon_state = "thong_babydoll" has_color = TRUE gender = FEMALE - - diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index fb03df88a1..fb71bb483d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -58,6 +58,10 @@ dimension_y = 34 relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) +/datum/sprite_accessory/deco_wings/atlas + name = "Atlas" + icon_state = "atlas" + /datum/sprite_accessory/deco_wings/bat name = "Bat" icon_state = "bat" @@ -66,6 +70,10 @@ name = "Bee" icon_state = "bee" +/datum/sprite_accessory/deco_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + /datum/sprite_accessory/deco_wings/fairy name = "Fairy" icon_state = "fairy" @@ -74,14 +82,6 @@ name = "Feathery" icon_state = "feathery" -/datum/sprite_accessory/deco_wings/atlas - name = "Atlas" - icon_state = "atlas" - -/datum/sprite_accessory/deco_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" - /datum/sprite_accessory/deco_wings/firewatch name = "Firewatch" icon_state = "firewatch" @@ -150,6 +150,10 @@ icon_state = "none" relevant_layers = null +/datum/sprite_accessory/insect_wings/atlas + name = "Atlas" + icon_state = "atlas" + /datum/sprite_accessory/insect_wings/bat name = "Bat" icon_state = "bat" @@ -158,6 +162,10 @@ name = "Bee" icon_state = "bee" +/datum/sprite_accessory/insect_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + /datum/sprite_accessory/insect_wings/fairy name = "Fairy" icon_state = "fairy" @@ -166,14 +174,6 @@ name = "Feathery" icon_state = "feathery" -/datum/sprite_accessory/insect_wings/atlas - name = "Atlas" - icon_state = "atlas" - -/datum/sprite_accessory/insect_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" - /datum/sprite_accessory/insect_wings/firewatch name = "Firewatch" icon_state = "firewatch" @@ -182,6 +182,10 @@ name = "Gothic" icon_state = "gothic" +/datum/sprite_accessory/insect_wings/jungle + name = "Jungle" + icon_state = "jungle" + /datum/sprite_accessory/insect_wings/lovers name = "Lovers" icon_state = "lovers" @@ -198,6 +202,10 @@ name = "Moon Fly" icon_state = "moonfly" +/datum/sprite_accessory/insect_wings/oakworm + name = "Oak Worm" + icon_state = "oakworm" + /datum/sprite_accessory/insect_wings/plain name = "Plain" icon_state = "plain" @@ -230,14 +238,6 @@ name = "White Fly" icon_state = "whitefly" -/datum/sprite_accessory/insect_wings/oakworm - name = "Oak Worm" - icon_state = "oakworm" - -/datum/sprite_accessory/insect_wings/jungle - name = "Jungle" - icon_state = "jungle" - /datum/sprite_accessory/insect_wings/witchwing name = "Witch Wing" icon_state = "witchwing" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index edb681e60f..b7d67e49a6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -87,7 +87,7 @@ if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)) for(var/datum/surgery/S in surgeries) if(S.next_step(user,user.a_intent)) - return 1 + return STOP_ATTACK_PROC_CHAIN if(!all_wounds || !(user.a_intent == INTENT_HELP || user == src)) return ..() @@ -95,7 +95,7 @@ for(var/i in shuffle(all_wounds)) var/datum/wound/W = i if(W.try_treating(I, user)) - return 1 + return STOP_ATTACK_PROC_CHAIN return ..() diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 1e2a375b39..2f5c94b784 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -21,7 +21,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() icon_render_key = null - cut_overlays(TRUE) + cut_overlays() //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index cb0dbef332..04747ffcb4 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -7,6 +7,11 @@ message = "cries." emote_type = EMOTE_AUDIBLE +/datum/emote/living/carbon/human/cry/run_emote(mob/user, params) + . = ..() + if(. && isipcperson(user)) + do_fake_sparks(5,FALSE,user) + /datum/emote/living/carbon/human/dap key = "dap" key_third_person = "daps" @@ -187,3 +192,71 @@ key_third_person = "chimes" message = "chimes." sound = 'sound/machines/chime.ogg' + +//rock paper scissors emote handling +/mob/living/carbon/human/proc/beginRockPaperScissors(var/chosen_move) + GLOB.rockpaperscissors_players[src] = list(chosen_move, ROCKPAPERSCISSORS_NOT_DECIDED) + do_after_advanced(src, ROCKPAPERSCISSORS_TIME_LIMIT, src, DO_AFTER_REQUIRES_USER_ON_TURF|DO_AFTER_NO_COEFFICIENT|DO_AFTER_NO_PROGRESSBAR|DO_AFTER_DISALLOW_MOVING_ABSOLUTE_USER, CALLBACK(src, .proc/rockpaperscissors_tick)) + var/new_entry = GLOB.rockpaperscissors_players[src] + if(new_entry[2] == ROCKPAPERSCISSORS_NOT_DECIDED) + to_chat(src, "You put your hand back down.") + GLOB.rockpaperscissors_players -= src + +/mob/living/carbon/human/proc/rockpaperscissors_tick() //called every cycle of the progress bar for rock paper scissors while waiting for an opponent + var/mob/living/carbon/human/opponent + for(var/mob/living/carbon/human/potential_opponent in (GLOB.rockpaperscissors_players - src)) //dont play against yourself + if(get_dist(src, potential_opponent) <= ROCKPAPERSCISSORS_RANGE) + opponent = potential_opponent + break + if(opponent) + //we found an opponent before they found us + var/move_to_number = list("rock" = 0, "paper" = 1, "scissors" = 2) + var/our_move = move_to_number[GLOB.rockpaperscissors_players[src][1]] + var/their_move = move_to_number[GLOB.rockpaperscissors_players[opponent][1]] + var/result_us = ROCKPAPERSCISSORS_WIN + var/result_them = ROCKPAPERSCISSORS_LOSE + if(our_move == their_move) + result_us = ROCKPAPERSCISSORS_TIE + result_them = ROCKPAPERSCISSORS_TIE + else + if(((our_move + 1) % 3) == their_move) + result_us = ROCKPAPERSCISSORS_LOSE + result_them = ROCKPAPERSCISSORS_WIN + //we decided our results so set them in the list + GLOB.rockpaperscissors_players[src][2] = result_us + GLOB.rockpaperscissors_players[opponent][2] = result_them + + //show what happened + src.visible_message("[src] makes [GLOB.rockpaperscissors_players[src][1]] with their hand!") + opponent.visible_message("[opponent] makes [GLOB.rockpaperscissors_players[opponent][1]] with their hands!") + switch(result_us) + if(ROCKPAPERSCISSORS_TIE) + src.visible_message("It was a tie!") + if(ROCKPAPERSCISSORS_WIN) + src.visible_message("[src] wins!") + if(ROCKPAPERSCISSORS_LOSE) + src.visible_message("[opponent] wins!") + + //make the progress bar end so that each player can handle the result + return DO_AFTER_STOP + + //no opponent was found, so keep searching + return DO_AFTER_PROCEED + +//the actual emotes +/datum/emote/living/carbon/human/rockpaperscissors + message = "is attempting to play rock paper scissors!" + +/datum/emote/living/carbon/human/rockpaperscissors/rock + key = "rock" + +/datum/emote/living/carbon/human/rockpaperscissors/paper + key = "paper" + +/datum/emote/living/carbon/human/rockpaperscissors/scissors + key = "scissors" + +/datum/emote/living/carbon/human/rockpaperscissors/run_emote(mob/living/carbon/human/user, params) + if(!(user in GLOB.rockpaperscissors_players)) //no using the emote again while already playing! + . = ..() + user.beginRockPaperScissors(key) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7879edbb45..2bc32cf50f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -115,6 +115,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /// Our default override for typing indicator state var/typing_indicator_state + //the ids you can use for your species, if empty, it means default only and not changeable + var/list/allowed_limb_ids + /////////// // PROCS // /////////// @@ -122,7 +125,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/New() if(!limbs_id) //if we havent set a limbs id to use, just use our own id - limbs_id = id + mutant_bodyparts["limbs_id"] = id //done this way to be non-intrusive to the existing system + else + mutant_bodyparts["limbs_id"] = limbs_id ..() //update our mutant bodyparts to include unlocked ones diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 2a955e28a4..16b371c772 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -13,10 +13,11 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect liked_food = MEAT | FRUIT disliked_food = TOXIC - icon_limbs = DEFAULT_BODYPART_ICON_CITADEL exotic_bloodtype = "BUG" exotic_blood_color = BLOOD_COLOR_BUG tail_type = "mam_tail" wagging_type = "mam_waggingtail" - species_type = "insect" \ No newline at end of file + species_type = "insect" + + allowed_limb_ids = list("insect","apid","moth","moth_not_greyscale") diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 7706d4a9d5..534536d6e7 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -2,7 +2,6 @@ name = "Anthromorph" id = "mammal" default_color = "4B4B4B" - icon_limbs = DEFAULT_BODYPART_ICON_CITADEL species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", @@ -17,3 +16,5 @@ tail_type = "mam_tail" wagging_type = "mam_waggingtail" species_type = "furry" + + allowed_limb_ids = list("mammal","aquatic","avian") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index 3aef14c256..806782a8b2 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -3,7 +3,6 @@ id = "ipc" say_mod = "beeps" default_color = "00FF00" - icon_limbs = DEFAULT_BODYPART_ICON_CITADEL blacklisted = 0 sexes = 0 species_traits = list(MUTCOLORS,NOEYES,NOTRANSSTING,HAS_FLESH,HAS_BONE) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index a55952d62f..a8e3f89957 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -5,13 +5,12 @@ say_mod = "hisses" default_color = "00FF00" species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs", "taur", "deco_wings") inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutanttongue = /obj/item/organ/tongue/lizard mutanttail = /obj/item/organ/tail/lizard coldmod = 1.5 heatmod = 0.67 - mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", + mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index f5a2f807e4..0f62953e6c 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -21,6 +21,8 @@ species_type = "plant" + allowed_limb_ids = list("pod","mush") + /datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() C.faction |= "plants" diff --git a/code/modules/mob/living/carbon/human/species_types/synthliz.dm b/code/modules/mob/living/carbon/human/species_types/synthliz.dm index 173411eaa1..70afa2f476 100644 --- a/code/modules/mob/living/carbon/human/species_types/synthliz.dm +++ b/code/modules/mob/living/carbon/human/species_types/synthliz.dm @@ -1,7 +1,6 @@ /datum/species/synthliz name = "Synthetic Lizardperson" id = "synthliz" - icon_limbs = DEFAULT_BODYPART_ICON_CITADEL say_mod = "beeps" default_color = "00FF00" species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,HAS_FLESH,HAS_BONE) diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index c10521dfd9..3d55ce1027 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -61,7 +61,7 @@ mutant_organs = S.mutant_organs.Copy() nojumpsuit = S.nojumpsuit no_equip = S.no_equip.Copy() - limbs_id = S.limbs_id + limbs_id = S.mutant_bodyparts["limbs_id"] use_skintones = S.use_skintones fixed_mut_color = S.fixed_mut_color hair_color = S.hair_color diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm index db34d1ae45..ddd1c86f0a 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -4,7 +4,6 @@ id = "xeno" say_mod = "hisses" default_color = "00FF00" - icon_limbs = DEFAULT_BODYPART_ICON_CITADEL species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR) mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade") attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e399ddf872..9b39438563 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -660,7 +660,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if //produces a key based on the human's limbs /mob/living/carbon/human/generate_icon_render_key() - . = "[dna.species.limbs_id]" + . = "[dna.species.mutant_bodyparts["limbs_id"]]" if(dna.check_mutation(HULK)) . += "-coloured-hulk" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index ad1a3bc9b9..fe5a78de21 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -8,8 +8,6 @@ spill_organs(no_brain, no_organs, no_bodyparts) - release_vore_contents(silent = TRUE) // return of the bomb safe internals. - if(!no_bodyparts) spread_bodyparts(no_brain, no_organs) @@ -46,7 +44,6 @@ buckled.unbuckle_mob(src, force = TRUE) dust_animation() - release_vore_contents(silent = TRUE) //technically grief protection, I guess? if they're SM'd it doesn't matter seconds after anyway. spawn_dust(just_ash) QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes. @@ -103,5 +100,5 @@ for(var/s in sharedSoullinks) var/datum/soullink/S = s S.sharerDies(gibbed) - + release_vore_contents(silent = TRUE) return TRUE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 97de8bfd6c..a735baceae 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -9,6 +9,11 @@ key_third_person = "blushes" message = "blushes." +/datum/emote/living/blush/run_emote(mob/user, params) + . = ..() + if(. && isipcperson(user)) + do_fake_sparks(5,FALSE,user) + /datum/emote/living/bow key = "bow" key_third_person = "bows" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9018c49b2c..d8299d42ad 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -289,50 +289,57 @@ return FALSE return ISINRANGE(T1.x, T0.x - interaction_range, T0.x + interaction_range) && ISINRANGE(T1.y, T0.y - interaction_range, T0.y + interaction_range) -/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src)) +/mob/living/silicon/robot/proc/attempt_welder_repair(obj/item/weldingtool/W, mob/user) + if (!getBruteLoss()) + to_chat(user, "[src] is already in good condition!") + return + if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. + return + user.DelayNextAction(CLICK_CD_MELEE) + if(src == user) + to_chat(user, "You start fixing yourself...") + if(!W.use_tool(src, user, 50)) + return + adjustBruteLoss(-10) + else + to_chat(user, "You start fixing [src]...") + if(!do_after(user, 30, target = src)) + return + adjustBruteLoss(-30) + updatehealth() + add_fingerprint(user) + visible_message("[user] has fixed some of the dents on [src].") + +/mob/living/silicon/robot/proc/attempt_cable_repair(obj/item/stack/cable_coil/W, mob/user) + if (getFireLoss() > 0 || getToxLoss() > 0) user.DelayNextAction(CLICK_CD_MELEE) - if (!getBruteLoss()) - to_chat(user, "[src] is already in good condition!") - return - if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away. - return if(src == user) to_chat(user, "You start fixing yourself...") - if(!W.use_tool(src, user, 50)) + if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT)) + to_chat(user, "You need more cable to repair [src]!") return - adjustBruteLoss(-10) + adjustFireLoss(-10) + adjustToxLoss(-10) else to_chat(user, "You start fixing [src]...") - if(!do_after(user, 30, target = src)) + if(!W.use_tool(src, user, 30, 1)) + to_chat(user, "You need more cable to repair [src]!") return - adjustBruteLoss(-30) - updatehealth() - add_fingerprint(user) - visible_message("[user] has fixed some of the dents on [src].") + adjustFireLoss(-30) + adjustToxLoss(-30) + updatehealth() + user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].") + else + to_chat(user, "The wires seem fine, there's no need to fix them.") + +/mob/living/silicon/robot/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/weldingtool) && (user.a_intent != INTENT_HARM || user == src)) + INVOKE_ASYNC(src, .proc/attempt_welder_repair, W, user) return else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) - user.DelayNextAction(CLICK_CD_MELEE) - if (getFireLoss() > 0 || getToxLoss() > 0) - if(src == user) - to_chat(user, "You start fixing yourself...") - if(!W.use_tool(src, user, 50, 1, skill_gain_mult = TRIVIAL_USE_TOOL_MULT)) - to_chat(user, "You need more cable to repair [src]!") - return - adjustFireLoss(-10) - adjustToxLoss(-10) - else - to_chat(user, "You start fixing [src]...") - if(!W.use_tool(src, user, 30, 1)) - to_chat(user, "You need more cable to repair [src]!") - return - adjustFireLoss(-30) - adjustToxLoss(-30) - updatehealth() - user.visible_message("[user] has fixed some of the burnt wires on [src].", "You fix some of the burnt wires on [src].") - else - to_chat(user, "The wires seem fine, there's no need to fix them.") + INVOKE_ASYNC(src, .proc/attempt_cable_repair, W, user) + return else if(istype(W, /obj/item/crowbar)) // crowbar means open or close the cover if(opened) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 354bc9ed0f..95bd8d8991 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -11,7 +11,6 @@ response_disarm_simple = "flail at" response_harm_continuous = "punches" response_harm_simple = "punch" - threat = 1 speak_chance = 1 icon = 'icons/mob/mob.dmi' speed = 0 @@ -122,7 +121,6 @@ desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." icon_state = "behemoth" icon_living = "behemoth" - threat = 3 maxHealth = 150 health = 150 response_harm_continuous = "harmlessly punches" @@ -187,7 +185,6 @@ desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines." icon_state = "floating" icon_living = "floating" - threat = 3 maxHealth = 65 health = 65 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/friendly/gondola.dm b/code/modules/mob/living/simple_animal/friendly/gondola.dm index 0cfea3548b..e29cbb8062 100644 --- a/code/modules/mob/living/simple_animal/friendly/gondola.dm +++ b/code/modules/mob/living/simple_animal/friendly/gondola.dm @@ -58,7 +58,7 @@ eyes_overlay.pixel_y = -8 moustache_overlay.pixel_y = -8 - cut_overlays(TRUE) + cut_overlays() add_overlay(body_overlay) add_overlay(eyes_overlay) add_overlay(moustache_overlay) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index fb24b0fc09..7abecc7c81 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -8,7 +8,6 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians name = "Guardian Spirit" real_name = "Guardian Spirit" desc = "A mysterious being that stands by its charge, ever vigilant." - threat = 5 speak_emote = list("hisses") gender = NEUTER mob_biotypes = NONE diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 7120ab6d0a..86467624b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -7,7 +7,6 @@ icon_dead = "alienh_dead" icon_gib = "syndicate_gib" gender = FEMALE - threat = 1 response_help_continuous = "pokes" response_help_simple = "poke" response_disarm_continuous = "shoves" @@ -69,7 +68,6 @@ icon_state = "aliens" icon_living = "aliens" icon_dead = "aliens_dead" - threat = 3 health = 150 maxHealth = 150 melee_damage_lower = 15 @@ -87,7 +85,6 @@ icon_living = "alienq" icon_dead = "alienq_dead" pixel_x = -16 - threat = 8 health = 250 maxHealth = 250 melee_damage_lower = 15 @@ -167,7 +164,6 @@ name = "lusty xenomorph maid" melee_damage_lower = 0 melee_damage_upper = 0 - threat = -1 a_intent = INTENT_HELP friendly_verb_continuous = "caresses" friendly_verb_simple = "caress" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index da16ec581b..1be90a07f8 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -2,7 +2,6 @@ /mob/living/simple_animal/hostile/bear name = "space bear" desc = "You don't need to be faster than a space bear, you just need to outrun your crewmates." - threat = 1 icon_state = "bear" icon_living = "bear" icon_dead = "bear_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 5f3d4f11c1..0a3cde3ef8 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -16,7 +16,6 @@ icon_state = "" icon_living = "" icon = 'icons/mob/bees.dmi' - threat = 0.3 gender = FEMALE speak_emote = list("buzzes") emote_hear = list("buzzes") diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index cde63adffd..b4d60af198 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal/hostile/boss name = "A Perfectly Generic Boss Placeholder" desc = "" - threat = 10 robust_searching = TRUE stat_attack = UNCONSCIOUS status_flags = NONE diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index f775d6600c..51a646f668 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -7,7 +7,6 @@ icon_living = "carp" icon_dead = "carp_dead" icon_gib = "carp_gib" - threat = 0.1 mob_biotypes = MOB_ORGANIC|MOB_BEAST speak_chance = 0 turns_per_move = 5 @@ -74,7 +73,6 @@ icon_living = "megacarp" icon_dead = "megacarp_dead" icon_gib = "megacarp_gib" - threat = 3 regen_amount = 6 maxHealth = 30 @@ -98,7 +96,6 @@ name = "Cayenne" desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot." gender = FEMALE - threat = 5 regen_amount = 8 speak_emote = list("squeaks") diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm index 48266e3e76..9b50587b3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal/hostile/dark_wizard name = "Dark Wizard" desc = "Killing amateurs since the dawn of times." - threat = 3 icon = 'icons/mob/simple_human.dmi' icon_state = "dark_wizard" icon_living = "dark_wizard" diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 4f8d2fef6c..b44a2502ef 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -4,7 +4,6 @@ icon_state = "faithless" icon_living = "faithless" icon_dead = "faithless_dead" - threat = 1 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID gender = MALE speak_chance = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index a253ecfd96..a8799f4e8c 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -17,7 +17,6 @@ //basic spider mob, these generally guard nests /mob/living/simple_animal/hostile/poison/giant_spider - threat = 1 name = "giant spider" desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." icon_state = "guard" diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index f48eef083b..ec0b7acd07 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -9,7 +9,6 @@ icon_state = "crawling" icon_living = "crawling" icon_dead = "dead" - threat = 0.5 mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 80 maxHealth = 220 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 501534237a..ac53ff794b 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -6,7 +6,6 @@ icon_state = "headcrab" icon_living = "headcrab" icon_dead = "headcrab_dead" - threat = 1 gender = NEUTER health = 50 maxHealth = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 5ed3cd0cdd..186fe36a10 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -3,7 +3,6 @@ stop_automated_movement_when_pulled = 0 obj_damage = 40 environment_smash = ENVIRONMENT_SMASH_STRUCTURES //Bitflags. Set to ENVIRONMENT_SMASH_STRUCTURES to break closets,tables,racks, etc; ENVIRONMENT_SMASH_WALLS for walls; ENVIRONMENT_SMASH_RWALLS for rwalls - var/threat = 0 // for dynamic var/atom/target var/ranged = FALSE var/rapid = 0 //How many shots per volley. @@ -600,6 +599,3 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega . += M else if (M.loc.type in hostile_machines) . += M.loc - -/mob/living/simple_animal/hostile/proc/threat() - return threat diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 55046d6555..362432b2af 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -11,7 +11,6 @@ icon_living = "leaper" icon_dead = "leaper_dead" mob_biotypes = MOB_ORGANIC|MOB_BEAST - threat = 2 maxHealth = 300 health = 300 ranged = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm index 99349168f0..31303bd7f1 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm @@ -8,7 +8,6 @@ icon_living = "arachnid" icon_dead = "arachnid_dead" mob_biotypes = MOB_ORGANIC|MOB_BUG - threat = 2 melee_damage_lower = 30 melee_damage_upper = 30 maxHealth = 300 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm index 6efa0cf468..2d964f5721 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -14,7 +14,6 @@ icon_living = "mook" icon_dead = "mook_dead" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - threat = 0.5 pixel_x = -16 maxHealth = 45 health = 45 diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 0521afa9e9..7565a686bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -13,7 +13,6 @@ icon_state = "seedling" icon_living = "seedling" icon_dead = "seedling_dead" - threat = 0.5 maxHealth = 100 health = 100 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 9cb65d7c30..b86d5d87fc 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -5,7 +5,6 @@ icon_living = "tomato" icon_dead = "tomato_dead" gender = NEUTER - threat = 0.3 speak_chance = 0 turns_per_move = 5 maxHealth = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 5c1229c130..2a5f279386 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -23,7 +23,6 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner name = "blood-drunk miner" desc = "A miner destined to wander forever, engaged in an endless hunt." - threat = 15 health = 900 maxHealth = 900 icon_state = "miner" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index b191eaf3fb..519d6402e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -26,7 +26,6 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum name = "bubblegum" desc = "In what passes for a hierarchy among slaughter demons, this one is king." - threat = 35 health = 2500 maxHealth = 2500 attack_verb_continuous = "rends" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 18abb019d3..883ad39261 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -24,7 +24,6 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/megafauna/colossus name = "colossus" desc = "A monstrous creature protected by heavy shielding." - threat = 40 health = 2500 maxHealth = 2500 attack_verb_continuous = "judges" @@ -603,7 +602,6 @@ Difficulty: Very Hard icon_state = "lightgeist" icon_living = "lightgeist" icon_dead = "butterfly_dead" - threat = -0.7 turns_per_move = 1 response_help_continuous = "waves away" response_help_simple = "wave away" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index a1ecde40b8..4dfd4561d6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -38,7 +38,6 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/dragon name = "ash drake" desc = "Guardians of the necropolis." - threat = 30 health = 2500 maxHealth = 2500 spacewalk = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c00d7c3130..bd3a6e8232 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -37,7 +37,6 @@ Difficulty: Normal /mob/living/simple_animal/hostile/megafauna/hierophant name = "hierophant" desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat." - threat = 30 health = 2500 maxHealth = 2500 attack_verb_continuous = "clubs" @@ -662,7 +661,7 @@ Difficulty: Normal continue to_chat(M.occupant, "Your [M.name] is struck by a [name]!") playsound(M,'sound/weapons/sear.ogg', 50, 1, -4) - M.take_damage(damage, BURN, 0, 0) + M.take_damage(damage, BURN, 0, 0, null, 50) /obj/effect/hierophant name = "hierophant beacon" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 78c02fb7a7..795184bad5 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -18,7 +18,6 @@ Difficulty: Medium /mob/living/simple_animal/hostile/megafauna/legion name = "Legion" - threat = 30 health = 800 maxHealth = 800 spacewalk = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 13738b20e1..61be1f6287 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -8,7 +8,6 @@ icon_aggro = "Basilisk_alert" icon_dead = "Basilisk_dead" icon_gib = "syndicate_gib" - threat = 4 mob_biotypes = MOB_ORGANIC|MOB_BEAST move_to_delay = 20 projectiletype = /obj/item/projectile/temp/basilisk diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 11cc0fe67e..ed056c2ad9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -10,7 +10,6 @@ move_to_delay = 5 vision_range = 20 aggro_vision_range = 20 - threat = 1 maxHealth = 40 //easy to kill, but oh, will you be seeing a lot of them. health = 40 melee_damage_lower = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 87ec79abcf..e3edd171c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -11,7 +11,6 @@ robust_searching = TRUE ranged_ignores_vision = TRUE ranged = TRUE - threat = 5 obj_damage = 5 vision_range = 6 aggro_vision_range = 18 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 80489e0e40..d9f3cfba3d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -25,7 +25,6 @@ icon_aggro = "broodmother" icon_dead = "egg_sac" icon_gib = "syndicate_gib" - threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 78b24acfb0..fce5b636e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -24,7 +24,6 @@ icon_aggro = "herald" icon_dead = "herald_dying" icon_gib = "syndicate_gib" - threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 31f925fb2b..15ed0135fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -24,7 +24,6 @@ icon_aggro = "legionnaire" icon_dead = "legionnaire_dead" icon_gib = "syndicate_gib" - threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index cdef0c50d3..7995e4d20f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -24,7 +24,6 @@ icon_aggro = "pandora" icon_dead = "pandora_dead" icon_gib = "syndicate_gib" - threat = 10 maxHealth = 800 health = 800 melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index 4a3497055a..3845c6f406 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -8,7 +8,6 @@ icon_aggro = "Goldgrub_alert" icon_dead = "Goldgrub_dead" icon_gib = "syndicate_gib" - threat = 0.2 mob_biotypes = MOB_ORGANIC|MOB_BEAST vision_range = 2 aggro_vision_range = 9 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 5f6c21bbbd..fa67fd8e3b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -10,7 +10,6 @@ icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_OPAQUE - threat = 2 move_to_delay = 10 ranged = 1 ranged_cooldown_time = 60 @@ -201,6 +200,8 @@ L.Stun(75) L.adjustBruteLoss(rand(15,20)) // Less stun more harm latched = TRUE + for(var/obj/mecha/M in loc) + M.take_damage(20, BRUTE, null, null, null, 25) if(!latched) retract() else diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 16f892bbff..11ce4f9214 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -9,7 +9,6 @@ icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC mouse_opacity = MOUSE_OPACITY_OPAQUE - threat = 4 move_to_delay = 14 ranged = 1 vision_range = 4 @@ -241,7 +240,6 @@ icon_state = "legion" icon_living = "legion" icon_dead = "legion" - threat = 5 health = 450 maxHealth = 450 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index e21e3e0693..92f331071a 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -10,7 +10,6 @@ obj_damage = 100 melee_damage_lower = 25 melee_damage_upper = 50 - threat = 2 attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index 0544ddc676..74e37bea21 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -10,7 +10,6 @@ turns_per_move = 5 response_help_continuous = "pushes" response_help_simple = "push" - threat = 3 speed = 0 maxHealth = 115 health = 115 diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index f7a46658c4..e9879f38ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -10,7 +10,6 @@ speak_chance = 0 turns_per_move = 5 speed = 0 - threat = 1 maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/sharks.dm b/code/modules/mob/living/simple_animal/hostile/sharks.dm index 1263a23d26..af61149130 100644 --- a/code/modules/mob/living/simple_animal/hostile/sharks.dm +++ b/code/modules/mob/living/simple_animal/hostile/sharks.dm @@ -19,7 +19,6 @@ response_harm_continuous = "kicks" response_harm_simple = "kick" speed = 0 - threat = 1 maxHealth = 75 health = 75 harm_intent_damage = 18 diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index 3091949552..ebacf1edef 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -11,7 +11,6 @@ speak_emote = list("rattles") emote_see = list("rattles") a_intent = INTENT_HARM - threat = 0.5 maxHealth = 40 blood_volume = 0 health = 40 @@ -64,7 +63,6 @@ icon_state = "templar" icon_living = "templar" icon_dead = "templar_dead" - threat = 1.5 maxHealth = 150 health = 150 weather_immunities = list("snow") @@ -98,7 +96,6 @@ icon_state = "plasma_miner" icon_living = "plasma_miner" icon_dead = "plasma_miner" - threat = 2 maxHealth = 150 health = 150 harm_intent_damage = 10 @@ -116,7 +113,6 @@ icon_state = "plasma_miner_tool" icon_living = "plasma_miner_tool" icon_dead = "plasma_miner_tool" - threat = 3 maxHealth = 185 health = 185 harm_intent_damage = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 3490d757a1..600d60eb4d 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -10,7 +10,6 @@ gender = NEUTER a_intent = INTENT_HARM mob_biotypes = MOB_HUMANOID - threat = 3 response_help_continuous = "touches" response_help_simple = "touch" response_disarm_continuous = "pushes" diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 226af952b1..6eeeabc877 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -5,7 +5,6 @@ icon_living = "stickman" icon_dead = "stickman_dead" icon_gib = "syndicate_gib" - threat = 0.5 mob_biotypes = MOB_HUMANOID gender = MALE speak_chance = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index fd37bb26aa..103868e1d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -25,7 +25,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 5 - threat = 1 speed = 0 stat_attack = UNCONSCIOUS robust_searching = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 2b9f4eea35..46a5a8ec68 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -7,7 +7,6 @@ icon_dead = "pine_1" icon_gib = "pine_1" gender = NEUTER - threat = 1 speak_chance = 0 turns_per_move = 5 response_help_continuous = "brushes" diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index 57fb6f829d..b3523fc42c 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -8,7 +8,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 turns_per_move = 3 - threat = 3 speed = 0 maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index dc6154c05e..bce1a01c8a 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -11,7 +11,6 @@ mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 - threat = 1 friendly_verb_continuous = "floats near" friendly_verb_simple = "float near" speak_emote = list("puffs") diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 6e4cbac022..1217084ce3 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -7,7 +7,6 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 stat_attack = UNCONSCIOUS //braains - threat = 1 maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 36a596f42e..6661d0ccea 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -19,8 +19,11 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( to_chat(src, "You can't vent crawl while you're restrained!") return if(has_buckled_mobs()) - to_chat(src, "You can't vent crawl with other creatures on you!") - return + // attempt once + unbuckle_all_mobs() + if(has_buckled_mobs()) + to_chat(src, "You can't vent crawl with other creatures on you!") + return if(buckled) to_chat(src, "You can't vent crawl while buckled!") return diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index cb2d49fc64..470b34e82c 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -95,6 +95,10 @@ GLOBAL_LIST_EMPTY(allCasters) . = ..() update_icon() +/obj/machinery/newscaster/attack_ghost(mob/dead/observer/user) + if(istype(user)) + user.read_news() + /obj/machinery/newscaster/ui_interact(mob/user) . = ..() if(ishuman(user) || issilicon(user)) diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 414026924a..392eba5f56 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -96,7 +96,7 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/job_changes name = "MEMO: Job Changes" - info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Scientists are to have access to chemistry in order to reach the MedSci router.
\n
\n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large.
\n- Roboticists are to have basic Medical and Morgue access.
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053" + info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires:
\n
\n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access.
\n- The Cook should not have Morgue access.
\n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices.
\n
\nGenerated by Organic Resources Bot #2053" /obj/item/paper/guides/cogstation/letter_sec name = "To future Security personnel" @@ -104,7 +104,7 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/disposals name = "Regarding the disposal system:" - info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES is for DELIVERIES.
\n- RED STRIPES is for CORPSES.
\n- EVERYTHING ELSE is for TRASH,
barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst" + info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin.
\n
\n- WHITE/GRAY STRIPES are for DELIVERIES.
\n- RED STRIPES are for CORPSES.
\n- EVERYTHING ELSE is for TRASH,
barring a few exceptions that should be labeled as such.
\n
\nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly.
\n
\n-C. Donnelly
Architectural Analyst" /obj/item/paper/guides/cogstation/janitor name = "a quick tip" @@ -128,7 +128,7 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/letter_eng name = "To future Engineering staff:" - info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst" + info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running.
\n
\n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of protection out there.
\n
\nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority.
\n
\nGood luck. You're gonna need it.
\n
\n-C. Donnelly
Architectural Analyst" /obj/item/paper/guides/cogstation/letter_atmos name = "To future Atmospheric Technicians:" @@ -140,15 +140,15 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/letter_hos name = "To the future HoS" - info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC" + info = "I'm gonna be rather disappointed if Central Command doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed.
\n
\nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it.
\n
-LC" /obj/item/paper/guides/cogstation/letter_supp name = "To future Supply Staff:" - info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst" + info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of.
\n
\nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there.
\n
\nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. It also isn't fully space-proofed, meanin it may not be the best choice for livestock, monkey cubes, or clowns. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours.
\n
\nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly.
\n
\n-C. Donnelly
\nArchitectural Analyst" -/obj/item/paper/fluff/cogstation/sleepers - name = "Re: Sleepers?" - info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries.
\n
\nThis is no excuse for you not to do your jobs. You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself.
\n
\n- Dr. Halley" +/obj/item/paper/guides/cogstation/letter_med + name = "Re: Future Medical Staff" + info = "With this station nearing approval for regular use, I've been told to consolidate anything noteworthy about its general medical department into a single document. As you may be able to guess, this is that document.
\n
\n- First, you should know a medical clinic is present in the civilian (starboard bow) wing. If you have personnel to spare, it's recommended you have someone staff it - that way people with minor injuries can report there instead of clogging up the research wing.
\n
\n- Despite recent renovations to bring this station in line with regional policy, you'll still find the robotics lab directly adjacent to your department. I advise you take full advantage of this, whether it's requesting prosthetics in advance or harvesting organs from those who have undergone more...permanent procedures.
\n
\n- Lastly, please make a habit of checking the morgue on a regular basis. Thanks to the Corpse Disposal Network (or CDN for short), you may find the station's deceased delivered directly to you. Some may be employees capable of being revived - more information can be found in the morgue itself.
\n
\n- Dr. Halley" /obj/item/paper/fluff/cogstation/cloner name = "Re: Issue with the cloner?" @@ -172,7 +172,7 @@ Accidental Reentry: /obj/item/paper/fluff/cogstation/letter_chap name = "A message from the DHDA" - info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs" + info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination.
\nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated.
\n
\nSoulstone Obelisk
\n
\nDepartment of Higher-Dimensional Affairs" /obj/item/paper/fluff/cogstation/cluwne name = "Mysterious Note" @@ -184,7 +184,7 @@ Accidental Reentry: /obj/item/paper/fluff/cogstation/eva name = "MEMO: Spacesuits" - info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\n-Generated by Organic Resources Bot #2053" + info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department.
\n
\nGenerated by Organic Resources Bot #2053" /obj/item/paper/fluff/cogstation/chemists name = "Re: Scientists?!" @@ -214,9 +214,9 @@ Accidental Reentry: name = "ROUTER STATUS: LIMITED" info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst" -/obj/item/paper/fluff/cogstation/router_cargo - name = "ROUTER STATUS: VERY LIMITED" - info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler.
\n
\n-C. Donnelly
\n
\nArchitectural Analyst" +/obj/item/paper/fluff/cogstation/mulebot + name = "MEMO: MULEbots" + info = "As you may know, MULEbots have been coded to minimize travel distance for maximum efficiency. In the case of this station, that may include travelling through depressurized areas exposed to space. Please bear this in mind before using them to transport living tissue.
\n
\nGenerated by Organic Resources Bot #2053" /////////// CentCom diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm new file mode 100644 index 0000000000..8a27f2669c --- /dev/null +++ b/code/modules/plumbing/ducts.dm @@ -0,0 +1,433 @@ +/* +All the important duct code: +/code/datums/components/plumbing/plumbing.dm +/code/datums/ductnet.dm +*/ +/obj/machinery/duct + name = "fluid duct" + icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon_state = "nduct" + + ///bitfield with the directions we're connected in + var/connects + ///set to TRUE to disable smart duct behaviour + var/dumb = FALSE + ///wheter we allow our connects to be changed after initialization or not + var/lock_connects = FALSE + ///our ductnet, wich tracks what we're connected to + var/datum/ductnet/duct + ///amount we can transfer per process. note that the ductnet can carry as much as the lowest capacity duct + var/capacity = 10 + + ///the color of our duct + var/duct_color = null + ///TRUE to ignore colors, so yeah we also connect with other colors without issue + var/ignore_colors = FALSE + ///1,2,4,8,16 + var/duct_layer = DUCT_LAYER_DEFAULT + ///whether we allow our layers to be altered + var/lock_layers = FALSE + ///TRUE to let colors connect when forced with a wrench, false to just not do that at all + var/color_to_color_support = TRUE + ///wheter to even bother with plumbing code or not + var/active = TRUE + ///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts + var/list/neighbours = list() + ///wheter we just unanchored or drop whatever is in the variable. either is safe + var/drop_on_wrench = /obj/item/stack/ducts + +/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) + . = ..() + + if(no_anchor) + active = FALSE + set_anchored(FALSE) + else if(!can_anchor()) + qdel(src) + CRASH("Overlapping ducts detected") + + if(force_connects) + connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point + if(!lock_layers) + duct_layer = layer_of_duct + if(!ignore_colors) + duct_color = color_of_duct + if(duct_color) + add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) + + handle_layer() + + for(var/obj/machinery/duct/D in loc) + if(D == src) + continue + if(D.duct_layer & duct_layer) + disconnect_duct() + + if(active) + attempt_connect() + + +///start looking around us for stuff to connect to +/obj/machinery/duct/proc/attempt_connect() + + for(var/atom/movable/AM in loc) + var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing) + if(P?.active) + disconnect_duct() //let's not built under plumbing machinery + return + for(var/D in GLOB.cardinals) + if(dumb && !(D & connects)) + continue + for(var/atom/movable/AM in get_step(src, D)) + if(connect_network(AM, D)) + add_connects(D) + update_icon() + +///see if whatever we found can be connected to +/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color) + if(istype(AM, /obj/machinery/duct)) + return connect_duct(AM, direction, ignore_color) + + var/plumber = AM.GetComponent(/datum/component/plumbing) + if(!plumber) + return + return connect_plumber(plumber, direction) + +///connect to a duct +/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color) + var/opposite_dir = turn(direction, 180) + if(!active || !D.active) + return + + if(!dumb && D.dumb && !(opposite_dir & D.connects)) + return + if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect + return + + if((duct == D.duct) && duct)//check if we're not just comparing two null values + add_neighbour(D, direction) + + D.add_connects(opposite_dir) + D.update_icon() + return TRUE //tell the current pipe to also update it's sprite + if(!(D in neighbours)) //we cool + if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors)) + return + if(!(duct_layer & D.duct_layer)) + return + + if(D.duct) + if(duct) + duct.assimilate(D.duct) + else + D.duct.add_duct(src) + else + if(duct) + duct.add_duct(D) + else + create_duct() + duct.add_duct(D) + add_neighbour(D, direction) + //tell our buddy its time to pass on the torch of connecting to pipes. This shouldn't ever infinitely loop since it only works on pipes that havent been inductrinated + D.attempt_connect() + + return TRUE + +///connect to a plumbing object +/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction) + var/opposite_dir = turn(direction, 180) + if(duct_layer != DUCT_LAYER_DEFAULT) //plumbing devices don't support multilayering. 3 is the default layer so we only use that. We can change this later + return FALSE + + if(!P.active) + return + + var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure + if(opposite_dir & comp_directions) + if(!duct) + create_duct() + if(duct.add_plumber(P, opposite_dir)) + neighbours[P.parent] = direction + return TRUE + +///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one +/obj/machinery/duct/proc/disconnect_duct(skipanchor) + if(!skipanchor) //since set_anchored calls us too. + set_anchored(FALSE) + active = FALSE + if(duct) + duct.remove_duct(src) + lose_neighbours() + reset_connects(0) + update_icon() + if(ispath(drop_on_wrench) && !QDELING(src)) + new drop_on_wrench(drop_location()) + qdel(src) + +///''''''''''''''''optimized''''''''''''''''' proc for quickly reconnecting after a duct net was destroyed +/obj/machinery/duct/proc/reconnect() + if(neighbours.len && !duct) + create_duct() + for(var/atom/movable/AM in neighbours) + if(istype(AM, /obj/machinery/duct)) + var/obj/machinery/duct/D = AM + if(D.duct) + if(D.duct == duct) //we're already connected + continue + else + duct.assimilate(D.duct) + continue + else + duct.add_duct(D) + D.reconnect() + else + var/datum/component/plumbing/P = AM.GetComponent(/datum/component/plumbing) + if(AM in get_step(src, neighbours[AM])) //did we move? + if(P) + connect_plumber(P, neighbours[AM]) + else + neighbours -= AM //we moved + +///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds +/obj/machinery/duct/proc/generate_connects() + if(lock_connects) + return + connects = 0 + for(var/A in neighbours) + connects |= neighbours[A] + update_icon() + +///create a new duct datum +/obj/machinery/duct/proc/create_duct() + duct = new() + duct.add_duct(src) + +///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate +/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction) + if(!(D in neighbours)) + neighbours[D] = direction + if(!(src in D.neighbours)) + D.neighbours[src] = turn(direction, 180) + +///remove all our neighbours, and remove us from our neighbours aswell +/obj/machinery/duct/proc/lose_neighbours() + for(var/obj/machinery/duct/D in neighbours) + D.neighbours.Remove(src) + neighbours = list() + +///add a connect direction +/obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls? + if(!lock_connects) + connects |= new_connects + +///remove a connect direction +/obj/machinery/duct/proc/remove_connects(dead_connects) + if(!lock_connects) + connects &= ~dead_connects + +///remove our connects +/obj/machinery/duct/proc/reset_connects() + if(!lock_connects) + connects = 0 + +///get a list of the ducts we can connect to if we are dumb +/obj/machinery/duct/proc/get_adjacent_ducts() + var/list/adjacents = list() + for(var/A in GLOB.cardinals) + if(A & connects) + for(var/obj/machinery/duct/D in get_step(src, A)) + if((turn(A, 180) & D.connects) && D.active) + adjacents += D + return adjacents + +/obj/machinery/duct/update_icon_state() + var/temp_icon = initial(icon_state) + for(var/D in GLOB.cardinals) + if(D & connects) + if(D == NORTH) + temp_icon += "_n" + if(D == SOUTH) + temp_icon += "_s" + if(D == EAST) + temp_icon += "_e" + if(D == WEST) + temp_icon += "_w" + icon_state = temp_icon + +///update the layer we are on +/obj/machinery/duct/proc/handle_layer() + var/offset + switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently + if(FIRST_DUCT_LAYER) + offset = -10 + if(SECOND_DUCT_LAYER) + offset = -5 + if(THIRD_DUCT_LAYER) + offset = 0 + if(FOURTH_DUCT_LAYER) + offset = 5 + if(FIFTH_DUCT_LAYER) + offset = 10 + pixel_x = offset + pixel_y = offset + + +/obj/machinery/duct/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + if(anchorvalue) + active = TRUE + attempt_connect() + else + disconnect_duct(TRUE) + +/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD + ..() + add_fingerprint(user) + I.play_tool_sound(src) + if(anchored || can_anchor()) + set_anchored(!anchored) + user.visible_message( \ + "[user] [anchored ? null : "un"]fastens \the [src].", \ + "You [anchored ? null : "un"]fasten \the [src].", \ + "You hear ratcheting.") + return TRUE +///collection of all the sanity checks to prevent us from stacking ducts that shouldn't be stacked +/obj/machinery/duct/proc/can_anchor(turf/T) + if(!T) + T = get_turf(src) + for(var/obj/machinery/duct/D in T) + if(!anchored || D == src) + continue + for(var/A in GLOB.cardinals) + if(A & connects && A & D.connects) + return FALSE + return TRUE + +/obj/machinery/duct/doMove(destination) + . = ..() + disconnect_duct() + anchored = FALSE + +/obj/machinery/duct/Destroy() + disconnect_duct() + return ..() + +/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user) + if(!istype(A, /obj/machinery/duct)) + return + var/obj/machinery/duct/D = A + var/obj/item/I = user.get_active_held_item() + if(I?.tool_behaviour != TOOL_WRENCH) + to_chat(user, "You need to be holding a wrench in your active hand to do that!") + return + if(get_dist(src, D) != 1) + return + var/direction = get_dir(src, D) + if(!(direction in GLOB.cardinals)) + return + if(duct_layer != D.duct_layer) + return + + add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases + add_neighbour(D, direction) + connect_network(D, direction, TRUE) + update_icon() + +///has a total of 5 layers and doesnt give a shit about color. its also dumb so doesnt autoconnect. +/obj/machinery/duct/multilayered + name = "duct layer-manifold" + icon = 'icons/obj/2x2.dmi' + icon_state = "multiduct" + pixel_x = -15 + pixel_y = -15 + + color_to_color_support = FALSE + duct_layer = FIRST_DUCT_LAYER | SECOND_DUCT_LAYER | THIRD_DUCT_LAYER | FOURTH_DUCT_LAYER | FIFTH_DUCT_LAYER + drop_on_wrench = null + + lock_connects = TRUE + lock_layers = TRUE + ignore_colors = TRUE + dumb = TRUE + + active = FALSE + anchored = FALSE + +/obj/machinery/duct/multilayered/Initialize(mapload, no_anchor, color_of_duct, layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) + . = ..() + update_connects() + +/obj/machinery/duct/multilayered/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) + +/obj/machinery/duct/multilayered/wrench_act(mob/living/user, obj/item/I) + . = ..() + update_connects() + +/obj/machinery/duct/multilayered/proc/update_connects() + if(dir & NORTH || dir & SOUTH) + connects = NORTH | SOUTH + else + connects = EAST | WEST + +///don't connect to other multilayered stuff because honestly it shouldn't be done and I dont wanna deal with it +/obj/machinery/duct/multilayered/connect_duct(obj/machinery/duct/D, direction, ignore_color) + if(istype(D, /obj/machinery/duct/multilayered)) + return + return ..() + +/obj/machinery/duct/multilayered/handle_layer() + return + +/obj/item/stack/ducts + name = "stack of duct" + desc = "A stack of fluid ducts." + singular_name = "duct" + icon = 'icons/obj/plumbing/fluid_ducts.dmi' + icon_state = "ducts" + custom_materials = list(/datum/material/iron=500) + w_class = WEIGHT_CLASS_TINY + novariants = FALSE + max_amount = 50 + item_flags = NOBLUDGEON + merge_type = /obj/item/stack/ducts + ///Color of our duct + var/duct_color = "grey" + ///Default layer of our duct + var/duct_layer = "Default Layer" + ///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way + var/list/layers = list("First Layer" = FIRST_DUCT_LAYER, "Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, + "Fourth Layer" = FOURTH_DUCT_LAYER, "Fifth Layer" = FIFTH_DUCT_LAYER) + +/obj/item/stack/ducts/examine(mob/user) + . = ..() + . += "It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change." + +/obj/item/stack/ducts/attack_self(mob/user) + var/new_layer = input("Select a layer", "Layer") as null|anything in layers + if(new_layer) + duct_layer = new_layer + var/new_color = input("Select a color", "Color") as null|anything in GLOB.pipe_paint_colors + if(new_color) + duct_color = new_color + add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY) + +/obj/item/stack/ducts/afterattack(atom/A, user, proximity) + . = ..() + if(!proximity) + return + if(istype(A, /obj/machinery/duct)) + var/obj/machinery/duct/D = A + if(!D.anchored) + add(1) + qdel(D) + if(istype(A, /turf/open) && use(1)) + var/turf/open/OT = A + new /obj/machinery/duct(OT, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer]) + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) + +/obj/item/stack/ducts/fifty + amount = 50 diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm new file mode 100644 index 0000000000..0566945e3b --- /dev/null +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -0,0 +1,98 @@ +/**Basic plumbing object. +* It doesn't really hold anything special, YET. +* Objects that are plumbing but not a subtype are as of writing liquid pumps and the reagent_dispenser tank +* Also please note that the plumbing component is toggled on and off by the component using a signal from default_unfasten_wrench, so dont worry about it +*/ +/obj/machinery/plumbing + name = "pipe thing" + icon = 'icons/obj/plumbing/plumbers.dmi' + icon_state = "pump" + density = TRUE + active_power_usage = 30 + use_power = ACTIVE_POWER_USE + resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + ///Plumbing machinery is always gonna need reagents, so we might aswell put it here + var/buffer = 50 + ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm + var/reagent_flags = TRANSPARENT + ///wheter we partake in rcd construction or not + var/rcd_constructable = TRUE + ///cost of the plumbing rcd construction + var/rcd_cost = 15 + ///delay of constructing it throught the plumbing rcd + var/rcd_delay = 10 + +/obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) + . = ..() + anchored = bolt + create_reagents(buffer, reagent_flags) + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + +/obj/machinery/plumbing/proc/can_be_rotated(mob/user,rotation_type) + return TRUE + + +/obj/machinery/plumbing/examine(mob/user) + . = ..() + . += "The maximum volume display reads: [reagents.maximum_volume] units." + +/obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.reaction(get_turf(src), TOUCH) //splash on the floor + reagents.clear_reagents() + +/obj/machinery/plumbing/welder_act(mob/living/user, obj/item/I) + . = ..() + if(anchored) + to_chat(user, "The [name] needs to be unbolted to do that!You start slicing the [name] apart.You slice the [name] apart. target_temperature && acclimate_state != COOLING) + acclimate_state = COOLING + update_icon() + if(!emptying) + if(reagents.chem_temp >= target_temperature && target_temperature + allowed_temperature_difference >= reagents.chem_temp) //cooling here + emptying = TRUE + if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here + emptying = TRUE + + reagents.adjust_thermal_energy((target_temperature - reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * reagents.total_volume) //keep constant with chem heater + reagents.handle_reactions() + +/obj/machinery/plumbing/acclimator/update_icon() + icon_state = initial(icon_state) + switch(acclimate_state) + if(COOLING) + icon_state += "_cold" + if(HEATING) + icon_state += "_hot" + +/obj/machinery/plumbing/acclimator/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemAcclimator", name) + ui.open() + +/obj/machinery/plumbing/acclimator/ui_data(mob/user) + var/list/data = list() + + data["enabled"] = enabled + data["chem_temp"] = reagents.chem_temp + data["target_temperature"] = target_temperature + data["allowed_temperature_difference"] = allowed_temperature_difference + data["acclimate_state"] = acclimate_state + data["max_volume"] = reagents.maximum_volume + data["reagent_volume"] = reagents.total_volume + data["emptying"] = emptying + return data + +/obj/machinery/plumbing/acclimator/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("set_target_temperature") + var/target = text2num(params["temperature"]) + target_temperature = clamp(target, 0, 1000) + if("set_allowed_temperature_difference") + var/target = text2num(params["temperature"]) + allowed_temperature_difference = clamp(target, 0, 1000) + if("toggle_power") + enabled = !enabled + if("change_volume") + var/target = text2num(params["volume"]) + reagents.maximum_volume = clamp(round(target), 1, buffer) + +#undef COOLING +#undef HEATING +#undef NEUTRAL diff --git a/code/modules/plumbing/plumbers/autohydro.dm b/code/modules/plumbing/plumbers/autohydro.dm new file mode 100644 index 0000000000..dbc70dfcf5 --- /dev/null +++ b/code/modules/plumbing/plumbers/autohydro.dm @@ -0,0 +1,65 @@ +/obj/machinery/hydroponics/constructable/automagic + name = "automated hydroponics system" + desc = "The bane of botanists everywhere. Accepts chemical reagents via plumbing, automatically harvests and removes dead plants." + obj_flags = CAN_BE_HIT | UNIQUE_RENAME + circuit = /obj/item/circuitboard/machine/hydroponics/automagic + self_sufficiency_req = 400 //automating hydroponics makes gaia sad so she needs more drugs to turn they tray godly. + canirrigate = FALSE + + +/obj/machinery/hydroponics/constructable/automagic/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/reagent_containers)) + return FALSE //avoid fucky wuckies + ..() + +/obj/machinery/hydroponics/constructable/automagic/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + user.visible_message("[user.name] [anchored ? "fasten" : "unfasten"] [src]", \ + "You [anchored ? "fasten" : "unfasten"] [src]") + var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing) + if(anchored) + CP.enable() + else + CP.disable() + +/obj/machinery/hydroponics/constructable/automagic/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/machinery/hydroponics/constructable/automagic/Initialize(mapload) + . = ..() + START_PROCESSING(SSobj, src) + create_reagents(100 , AMOUNT_VISIBLE) + +/obj/machinery/hydroponics/constructable/automagic/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + AddComponent(/datum/component/plumbing/simple_demand) + +/obj/machinery/hydroponics/constructable/proc/can_be_rotated(mob/user, rotation_type) + return !anchored + +/obj/machinery/hydroponics/constructable/automagic/process() + if(reagents) + applyChemicals(reagents) + reagents.clear_reagents() + if(dead) + dead = 0 + qdel(myseed) + myseed = null + update_icon() + name = initial(name) + desc = initial(desc) + if(harvest) + myseed.harvest_userless() + harvest = 0 + lastproduce = age + if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest)) + qdel(myseed) + myseed = null + dead = 0 + name = initial(name) + desc = initial(desc) + update_icon() + ..() diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm new file mode 100644 index 0000000000..396c7cac22 --- /dev/null +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -0,0 +1,79 @@ +/obj/machinery/plumbing/bottler + name = "chemical bottler" + desc = "Puts reagents into containers, like bottles and beakers." + icon_state = "bottler" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 50 + rcd_delay = 50 + buffer = 100 + ///how much do we fill + var/wanted_amount = 10 + ///where things are sent + var/turf/goodspot = null + ///where things are taken + var/turf/inputspot = null + ///where beakers that are already full will be sent + var/turf/badspot = null + +/obj/machinery/plumbing/bottler/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + setDir(dir) + +/obj/machinery/plumbing/bottler/can_be_rotated(mob/user, rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + return TRUE + +///changes the tile array +/obj/machinery/plumbing/bottler/setDir(newdir) + . = ..() + switch(dir) + if(NORTH) + goodspot = get_step(get_turf(src), NORTH) + inputspot = get_step(get_turf(src), SOUTH) + badspot = get_step(get_turf(src), EAST) + if(SOUTH) + goodspot = get_step(get_turf(src), SOUTH) + inputspot = get_step(get_turf(src), NORTH) + badspot = get_step(get_turf(src), WEST) + if(WEST) + goodspot = get_step(get_turf(src), WEST) + inputspot = get_step(get_turf(src), EAST) + badspot = get_step(get_turf(src), NORTH) + if(EAST) + goodspot = get_step(get_turf(src), EAST) + inputspot = get_step(get_turf(src), WEST) + badspot = get_step(get_turf(src), SOUTH) + +///changing input ammount with a window +/obj/machinery/plumbing/bottler/interact(mob/user) + . = ..() + wanted_amount = clamp(round(input(user,"maximum is 100u","set ammount to fill with") as num|null, 1), 1, 100) + reagents.clear_reagents() + to_chat(user, " The [src] will now fill for [wanted_amount]u.") + +/obj/machinery/plumbing/bottler/process() + if(stat & NOPOWER) + return + ///see if machine has enough to fill + if(reagents.total_volume >= wanted_amount && anchored) + var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used + if(istype(AM, /obj/item/reagent_containers) && (!istype(AM, /obj/item/reagent_containers/hypospray/medipen))) + var/obj/item/reagent_containers/B = AM + ///see if it would overflow else inject + if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume) + reagents.trans_to(B, wanted_amount) + B.forceMove(goodspot) + return + ///glass was full so we move it away + AM.forceMove(badspot) + if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject + AM.forceMove(goodspot) + reagents.trans_to(AM, wanted_amount) + return + if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things + reagents.trans_to(AM, wanted_amount) + return diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm new file mode 100644 index 0000000000..b61383ea4a --- /dev/null +++ b/code/modules/plumbing/plumbers/destroyer.dm @@ -0,0 +1,21 @@ +/obj/machinery/plumbing/disposer + name = "chemical disposer" + desc = "Breaks down chemicals and annihilates them." + icon_state = "disposal" + ///we remove 10 reagents per second + var/disposal_rate = 10 + +/obj/machinery/plumbing/disposer/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + +/obj/machinery/plumbing/disposer/process() + if(stat & NOPOWER) + return + if(reagents.total_volume) + if(icon_state != initial(icon_state) + "_working") //threw it here instead of update icon since it only has two states + icon_state = initial(icon_state) + "_working" + reagents.remove_any(disposal_rate) + else + if(icon_state != initial(icon_state)) + icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm new file mode 100644 index 0000000000..b1e1e4b676 --- /dev/null +++ b/code/modules/plumbing/plumbers/fermenter.dm @@ -0,0 +1,59 @@ +/obj/machinery/plumbing/fermenter //FULLY AUTOMATIC BEER BREWING. TRULY, THE FUTURE. + name = "chemical fermenter" + desc = "Turns plants into various types of booze." + icon_state = "fermenter" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 30 + rcd_delay = 30 + buffer = 400 + ///input dir + var/eat_dir = SOUTH + +/obj/machinery/plumbing/fermenter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/fermenter/can_be_rotated(mob/user,rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + switch(eat_dir) + if(WEST) + eat_dir = NORTH + return TRUE + if(EAST) + eat_dir = SOUTH + return TRUE + if(NORTH) + eat_dir = EAST + return TRUE + if(SOUTH) + eat_dir = WEST + return TRUE + +/obj/machinery/plumbing/fermenter/CanPass(atom/movable/AM) + . = ..() + if(!anchored) + return + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + return TRUE + +/obj/machinery/plumbing/fermenter/Crossed(atom/movable/AM) + . = ..() + ferment(AM) + +/obj/machinery/plumbing/fermenter/proc/ferment(atom/AM) + if(stat & NOPOWER) + return + if(reagents.holder_full()) + return + if(!isitem(AM)) + return + if(istype(AM, /obj/item/reagent_containers/food/snacks/grown)) + var/obj/item/reagent_containers/food/snacks/grown/G = AM + if(G.distill_reagent) + var/amount = G.seed.potency * 0.25 + reagents.add_reagent(G.distill_reagent, amount) + qdel(G) diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm new file mode 100644 index 0000000000..1ffd170507 --- /dev/null +++ b/code/modules/plumbing/plumbers/filter.dm @@ -0,0 +1,65 @@ +///chemical plumbing filter. If it's not filtered by left and right, it goes straight. +/obj/machinery/plumbing/filter + name = "chemical filter" + desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port." + icon_state = "filter" + density = FALSE + + ///whitelist of chems id's that go to the left side. Empty to disable port + var/list/left = list() + ///whitelist of chem id's that go to the right side. Empty to disable port + var/list/right = list() + ///whitelist of chems but their name instead of path + var/list/english_left = list() + ///whitelist of chems but their name instead of path + var/list/english_right = list() + +/obj/machinery/plumbing/filter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/filter, bolt) + +/obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemFilter", name) + ui.open() + +/obj/machinery/plumbing/filter/ui_data(mob/user) + var/list/data = list() + data["left"] = english_left + data["right"] = english_right + return data + +/obj/machinery/plumbing/filter/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("add") + var/new_chem_name = params["name"] + var/chem_id = get_chem_id(new_chem_name) + if(chem_id) + switch(params["which"]) + if("left") + if(!left.Find(chem_id)) + english_left += new_chem_name + left += chem_id + if("right") + if(!right.Find(chem_id)) + english_right += new_chem_name + right += chem_id + else + to_chat(usr, "No such known reagent exists!") + + if("remove") + var/chem_name = params["reagent"] + var/chem_id = get_chem_id(chem_name) + switch(params["which"]) + if("left") + if(english_left.Find(chem_name)) + english_left -= chem_name + left -= chem_id + if("right") + if(english_right.Find(chem_name)) + english_right -= chem_name + right -= chem_id diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm new file mode 100644 index 0000000000..f39c79f906 --- /dev/null +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -0,0 +1,64 @@ +/obj/machinery/plumbing/grinder_chemical + name = "chemical grinder" + desc = "chemical grinder." + icon_state = "grinder_chemical" + layer = ABOVE_ALL_MOB_LAYER + reagent_flags = TRANSPARENT | DRAINABLE + rcd_cost = 30 + rcd_delay = 30 + buffer = 400 + var/eat_dir = NORTH + +/obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type) + if(anchored) + to_chat(user, "It is fastened to the floor!") + return FALSE + switch(eat_dir) + if(WEST) + eat_dir = NORTH + return TRUE + if(EAST) + eat_dir = SOUTH + return TRUE + if(NORTH) + eat_dir = EAST + return TRUE + if(SOUTH) + eat_dir = WEST + return TRUE + +/obj/machinery/plumbing/grinder_chemical/CanPass(atom/movable/AM) + . = ..() + if(!anchored) + return + var/move_dir = get_dir(loc, AM.loc) + if(move_dir == eat_dir) + return TRUE + +/obj/machinery/plumbing/grinder_chemical/Crossed(atom/movable/AM) + . = ..() + grind(AM) + +/obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM) + if(stat & NOPOWER) + return + if(reagents.holder_full()) + return + if(!isitem(AM)) + return + var/obj/item/I = AM + if(I.juice_results || I.grind_results) + if(I.juice_results) + I.on_juice() + reagents.add_reagent_list(I.juice_results) + if(I.reagents) + I.reagents.trans_to(src, I.reagents.total_volume) + qdel(I) + return + I.on_grind() + reagents.add_reagent_list(I.grind_results) + qdel(I) diff --git a/code/modules/plumbing/plumbers/medipenrefill.dm b/code/modules/plumbing/plumbers/medipenrefill.dm new file mode 100644 index 0000000000..fb7553a4d5 --- /dev/null +++ b/code/modules/plumbing/plumbers/medipenrefill.dm @@ -0,0 +1,94 @@ +/obj/machinery/medipen_refiller + name = "Medipen Refiller" + desc = "A machine that refills used medipens with chemicals." + icon = 'icons/obj/machines/medipen_refiller.dmi' + icon_state = "medipen_refiller" + density = TRUE + circuit = /obj/item/circuitboard/machine/medipen_refiller + idle_power_usage = 100 + /// list of medipen subtypes it can refill + var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/ekit = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/firelocker = /datum/reagent/medicine/oxandrolone, + /obj/item/reagent_containers/hypospray/medipen/stimpack = /datum/reagent/medicine/ephedrine, + /obj/item/reagent_containers/hypospray/medipen/blood_loss = /datum/reagent/medicine/coagulant/weak) + /// var to prevent glitches in the animation + var/busy = FALSE + +/obj/machinery/medipen_refiller/Initialize() + . = ..() + create_reagents(100, TRANSPARENT) + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + reagents.maximum_volume += 100 * B.rating + AddComponent(/datum/component/plumbing/simple_demand) + + +/obj/machinery/medipen_refiller/RefreshParts() + var/new_volume = 100 + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + new_volume += 100 * B.rating + if(!reagents) + create_reagents(new_volume, TRANSPARENT) + reagents.maximum_volume = new_volume + return TRUE + +/// handles the messages and animation, calls refill to end the animation +/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params) + if(busy) + to_chat(user, "The machine is busy.") + return + if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) + var/obj/item/reagent_containers/RC = I + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this) + if(units) + to_chat(user, "You transfer [units] units of the solution to the [name].") + return + else + to_chat(user, "The [name] is full.") + return + if(istype(I, /obj/item/reagent_containers/hypospray/medipen)) + var/obj/item/reagent_containers/hypospray/medipen/P = I + if(!(LAZYFIND(allowed, P.type))) + to_chat(user, "Error! Unknown schematics.") + return + if(P.reagents?.reagent_list.len) + to_chat(user, "The medipen is already filled.") + return + if(reagents.has_reagent(allowed[P.type], 10)) + busy = TRUE + add_overlay("active") + addtimer(CALLBACK(src, .proc/refill, P, user), 20) + qdel(P) + return + to_chat(user, "There aren't enough reagents to finish this operation.") + return + ..() + +/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.clear_reagents() + +/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I) + ..() + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I) + +/// refills the medipen +/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user) + new P.type(loc) + reagents.remove_reagent(allowed[P.type], 10) + cut_overlays() + busy = FALSE + to_chat(user, "Medipen refilled.") diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm new file mode 100644 index 0000000000..56510fac87 --- /dev/null +++ b/code/modules/plumbing/plumbers/pill_press.dm @@ -0,0 +1,127 @@ +///We take a constant input of reagents, and produce a pill once a set volume is reached +/obj/machinery/plumbing/pill_press + name = "chemical press" + desc = "A press that makes pills, patches and bottles." + icon_state = "pill_press" + ///maximum size of a pill + var/max_pill_volume = 50 + ///maximum size of a patch + var/max_patch_volume = 40 + ///maximum size of a bottle + var/max_bottle_volume = 30 + ///current operating product (pills or patches) + var/product = "pill" + ///the minimum size a pill or patch can be + var/min_volume = 5 + ///the maximum size a pill or patch can be + var/max_volume = 50 + ///selected size of the product + var/current_volume = 10 + ///prefix for the product name + var/product_name = "factory" + ///the icon_state number for the pill. + var/pill_number = RANDOM_PILL_STYLE + ///list of id's and icons for the pill selection of the ui + var/list/pill_styles + ///list of products stored in the machine, so we dont have 610 pills on one tile + var/list/stored_products = list() + ///max amount of pills allowed on our tile before we start storing them instead + var/max_floor_products = 50 //haha massive pill piles + +/obj/machinery/plumbing/pill_press/examine(mob/user) + . = ..() + . += "The [name] currently has [stored_products.len] stored. There needs to be less than [max_floor_products ] on the floor to continue dispensing." + +/obj/machinery/plumbing/pill_press/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt) + + //expertly copypasted from chemmasters + var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) + pill_styles = list() + for (var/x in 1 to PILL_STYLE_COUNT) + var/list/SL = list() + SL["id"] = x + SL["htmltag"] = assets.icon_tag("pill[x]") + pill_styles += list(SL) + + +/obj/machinery/plumbing/pill_press/process() + if(stat & NOPOWER) + return + if(reagents.total_volume >= current_volume) + if (product == "pill") + var/obj/item/reagent_containers/pill/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] pill") + stored_products += P + if(pill_number == RANDOM_PILL_STYLE) + P.icon_state = "pill[rand(1,21)]" + else + P.icon_state = "pill[pill_number]" + if(P.icon_state == "pill4") //mirrored from chem masters + P.desc = "A tablet or capsule, but not just any, a red one, one taken by the ones not scared of knowledge, freedom, uncertainty and the brutal truths of reality." + else if (product == "patch") + var/obj/item/reagent_containers/pill/patch/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] patch") + stored_products += P + else if (product == "bottle") + var/obj/item/reagent_containers/glass/bottle/P = new(src) + reagents.trans_to(P, current_volume) + P.name = trim("[product_name] bottle") + stored_products += P + if(stored_products.len) + var/pill_amount = 0 + for(var/obj/item/reagent_containers/pill/P in loc) + pill_amount++ + if(pill_amount >= max_floor_products) //too much so just stop + break + if(pill_amount < max_floor_products) + var/atom/movable/AM = stored_products[1] //AM because forceMove is all we need + stored_products -= AM + AM.forceMove(drop_location()) + + +/obj/machinery/plumbing/pill_press/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/simple/pills), + ) + +/obj/machinery/plumbing/pill_press/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemPress", name) + ui.open() + +/obj/machinery/plumbing/pill_press/ui_data(mob/user) + var/list/data = list() + data["pill_style"] = pill_number + data["current_volume"] = current_volume + data["product_name"] = product_name + data["pill_styles"] = pill_styles + data["product"] = product + data["min_volume"] = min_volume + data["max_volume"] = max_volume + return data + +/obj/machinery/plumbing/pill_press/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("change_pill_style") + pill_number = clamp(text2num(params["id"]), 1 , PILL_STYLE_COUNT) + if("change_current_volume") + current_volume = clamp(text2num(params["volume"]), min_volume, max_volume) + if("change_product_name") + product_name = html_encode(params["name"]) + if("change_product") + product = params["product"] + if (product == "pill") + max_volume = max_pill_volume + else if (product == "patch") + max_volume = max_patch_volume + else if (product == "bottle") + max_volume = max_bottle_volume + current_volume = clamp(current_volume, min_volume, max_volume) diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm new file mode 100644 index 0000000000..c24e48098d --- /dev/null +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -0,0 +1,64 @@ +///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We don't need to be wired. +/obj/machinery/plumbing/liquid_pump + name = "liquid pump" + desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun + icon = 'icons/obj/plumbing/plumbers.dmi' + icon_state = "pump" + anchored = FALSE + density = TRUE + idle_power_usage = 10 + active_power_usage = 1000 + + rcd_cost = 30 + rcd_delay = 40 + + ///units we pump per process (2 seconds) + var/pump_power = 2 + ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try + var/geyserless = FALSE + ///The geyser object + var/obj/structure/geyser/geyser + ///volume of our internal buffer + var/volume = 200 + +/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +///please note that the component has a hook in the parent call, wich handles activating and deactivating +/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + geyser = null + update_icon() + geyserless = FALSE //we switched state, so lets just set this back aswell + +/obj/machinery/plumbing/liquid_pump/process() + if(!anchored || panel_open || geyserless) + return + + if(!geyser) + for(var/obj/structure/geyser/G in loc.contents) + geyser = G + update_icon() + if(!geyser) //we didnt find one, abort + geyserless = TRUE + visible_message("The [name] makes a sad beep!") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50) + return + + pump() + +///pump up that sweet geyser nectar +/obj/machinery/plumbing/liquid_pump/proc/pump() + if(!geyser || !geyser.reagents) + return + geyser.reagents.trans_to(src, pump_power) + +/obj/machinery/plumbing/liquid_pump/update_icon_state() + if(geyser) + icon_state = initial(icon_state) + "-on" + else if(panel_open) + icon_state = initial(icon_state) + "-open" + else + icon_state = initial(icon_state) diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm new file mode 100644 index 0000000000..949543c300 --- /dev/null +++ b/code/modules/plumbing/plumbers/reaction_chamber.dm @@ -0,0 +1,63 @@ +///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents seperated and only reacts under your given terms +/obj/machinery/plumbing/reaction_chamber + name = "reaction chamber" + desc = "Keeps chemicals seperated until given conditions are met." + icon_state = "reaction_chamber" + buffer = 200 + reagent_flags = TRANSPARENT | NO_REACT + + /**list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. + * example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50) + */ + var/list/required_reagents = list() + ///our reagent goal has been reached, so now we lock our inputs and start emptying + var/emptying = FALSE + +/obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/reaction_chamber, bolt) + +/obj/machinery/plumbing/reaction_chamber/on_reagent_change() + if(reagents.total_volume == 0 && emptying) //we were emptying, but now we aren't + emptying = FALSE + reagent_flags |= NO_REACT + +/obj/machinery/plumbing/reaction_chamber/power_change() + . = ..() + if(use_power != NO_POWER_USE) + icon_state = initial(icon_state) + "_on" + else + icon_state = initial(icon_state) + +/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemReactionChamber", name) + ui.open() + +/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) + var/list/data = list() + var/list/text_reagents = list() + for(var/A in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath + var/datum/reagent/R = A + text_reagents[initial(R.name)] = required_reagents[R] + + data["reagents"] = text_reagents + data["emptying"] = emptying + return data + +/obj/machinery/plumbing/reaction_chamber/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("remove") + var/reagent = get_chem_id(params["chem"]) + if(reagent) + required_reagents.Remove(reagent) + if("add") + var/input_reagent = get_chem_id(params["chem"]) + if(input_reagent && !required_reagents.Find(input_reagent)) + var/input_amount = text2num(params["amount"]) + if(input_amount) + required_reagents[input_reagent] = input_amount diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm new file mode 100644 index 0000000000..a26813486c --- /dev/null +++ b/code/modules/plumbing/plumbers/splitters.dm @@ -0,0 +1,50 @@ +///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component +/obj/machinery/plumbing/splitter + name = "Chemical Splitter" + desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts." + icon_state = "splitter" + buffer = 100 + density = FALSE + + ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct. + var/turn_straight = TRUE + ///how much we must transfer straight. note input can be as high as 10 reagents per process, usually + var/transfer_straight = 5 + ///how much we must transfer to the side + var/transfer_side = 5 + //the maximum you can set the transfer to + var/max_transfer = 9 + + +/obj/machinery/plumbing/splitter/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/splitter, bolt) + +/obj/machinery/plumbing/splitter/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemSplitter", name) + ui.open() + +/obj/machinery/plumbing/splitter/ui_data(mob/user) + var/list/data = list() + data["straight"] = transfer_straight + data["side"] = transfer_side + data["max_transfer"] = max_transfer + return data + +/obj/machinery/plumbing/splitter/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("set_amount") + var/direction = params["target"] + var/value = clamp(text2num(params["amount"]), 1, max_transfer) + switch(direction) + if("straight") + transfer_straight = value + if("side") + transfer_side = value + else + return FALSE diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm new file mode 100644 index 0000000000..c2bc3439ff --- /dev/null +++ b/code/modules/plumbing/plumbers/synthesizer.dm @@ -0,0 +1,111 @@ +///A single machine that produces a single chem. Can be placed in unison with others through plumbing to create chemical factories +/obj/machinery/plumbing/synthesizer + name = "chemical synthesizer" + desc = "Produces a single chemical at a given volume. Must be plumbed. Most effective when working in unison with other chemical synthesizers, heaters and filters." + + icon_state = "synthesizer" + icon = 'icons/obj/plumbing/plumbers.dmi' + rcd_cost = 25 + rcd_delay = 15 + + ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity + var/amount = 1 + ///The maximum we can produce for every process + buffer = 5 + ///I track them here because I have no idea how I'd make tgui loop like that + var/static/list/possible_amounts = list(0,1,2,3,4,5) + ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial. + var/datum/reagent/reagent_id = null + ///straight up copied from chem dispenser. Being a subtype would be extremely tedious and making it global would restrict potential subtypes using different dispensable_reagents + var/list/dispensable_reagents = list( + /datum/reagent/aluminium, + /datum/reagent/bromine, + /datum/reagent/carbon, + /datum/reagent/chlorine, + /datum/reagent/copper, + /datum/reagent/consumable/ethanol, + /datum/reagent/fluorine, + /datum/reagent/hydrogen, + /datum/reagent/iodine, + /datum/reagent/iron, + /datum/reagent/lithium, + /datum/reagent/mercury, + /datum/reagent/nitrogen, + /datum/reagent/oxygen, + /datum/reagent/phosphorus, + /datum/reagent/potassium, + /datum/reagent/radium, + /datum/reagent/silicon, + /datum/reagent/silver, + /datum/reagent/sodium, + /datum/reagent/stable_plasma, + /datum/reagent/consumable/sugar, + /datum/reagent/sulfur, + /datum/reagent/toxin/acid, + /datum/reagent/water, + /datum/reagent/fuel, + ) + +/obj/machinery/plumbing/synthesizer/Initialize(mapload, bolt) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt) + +/obj/machinery/plumbing/synthesizer/process() + if(stat & NOPOWER || !reagent_id || !amount) + return + if(reagents.total_volume >= amount) //otherwise we get leftovers, and we need this to be precise + return + reagents.add_reagent(reagent_id, amount) + +/obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ChemSynthesizer", name) + ui.open() + +/obj/machinery/plumbing/synthesizer/ui_data(mob/user) + var/list/data = list() + + var/is_hallucinating = user.hallucinating() + var/list/chemicals = list() + + for(var/A in dispensable_reagents) + var/datum/reagent/R = GLOB.chemical_reagents_list[A] + if(R) + var/chemname = R.name + if(is_hallucinating && prob(5)) + chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" + chemicals.Add(list(list("title" = chemname, "id" = ckey(R.name)))) + data["chemicals"] = chemicals + data["amount"] = amount + data["possible_amounts"] = possible_amounts + + data["current_reagent"] = ckey(initial(reagent_id.name)) + return data + +/obj/machinery/plumbing/synthesizer/ui_act(action, params) + if(..()) + return + . = TRUE + switch(action) + if("amount") + var/new_amount = text2num(params["target"]) + if(new_amount in possible_amounts) + amount = new_amount + . = TRUE + if("select") + var/new_reagent = GLOB.name2reagent[params["reagent"]] + if(new_reagent in dispensable_reagents) + reagent_id = new_reagent + . = TRUE + update_icon() + reagents.clear_reagents() + +/obj/machinery/plumbing/synthesizer/update_overlays() + . = ..() + var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay") + if(reagent_id) + r_overlay.color = initial(reagent_id.color) + else + r_overlay.color = "#FFFFFF" + . += r_overlay diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a70e508476..2480288484 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1009,7 +1009,7 @@ . = UI_INTERACTIVE /obj/machinery/power/apc/ui_act(action, params) - if(..() || !can_use(usr, 1) || (locked && area.hasSiliconAccessInArea(usr, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE) && !failure_timer && action != "toggle_nightshift") || (integration_cog && (is_servant_of_ratvar(usr)))) + if(..() || !can_use(usr, 1) || (locked && !area.hasSiliconAccessInArea(usr, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE) && !failure_timer && action != "toggle_nightshift" && (!integration_cog || !(is_servant_of_ratvar(usr))))) return switch(action) if("lock") diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 78a20e5b62..54b1362518 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -66,7 +66,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency + lastgen += LOGISTIC_FUNCTION(1000000,0.0034,delta_temperature,2000) hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity) cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index d0d846c144..78ca6e9280 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -76,7 +76,8 @@ return 1 /obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) - if(INTERACTING_WITH(user, A)) + if(INTERACTING_WITH(user, src) || INTERACTING_WITH(user, A)) + to_chat(user, "You're already doing that!") return FALSE var/num_loaded = 0 if(!can_load(user)) @@ -84,13 +85,16 @@ if(istype(A, /obj/item/ammo_box)) var/obj/item/ammo_box/AM = A for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(load_delay && do_after(user, load_delay, target = src)) - var/did_load = give_round(AC, replace_spent) - if(did_load) - AM.stored_ammo -= AC - num_loaded++ - if(!did_load || !multiload) - break + if(load_delay || AM.load_delay) + var/loadtime = max(AM.load_delay, load_delay) + if(!do_after(user, loadtime, target = src)) + return FALSE + var/did_load = give_round(AC, replace_spent) + if(did_load) + AM.stored_ammo -= AC + num_loaded++ + if(!did_load || !multiload) + break if(istype(A, /obj/item/ammo_casing)) var/obj/item/ammo_casing/AC = A if(give_round(AC, replace_spent)) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 0b00c89c02..8cd49bdf16 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -149,6 +149,9 @@ icon = 'icons/obj/ammo.dmi' icon_state = "shotgunclip" caliber = "shotgun" // slapped in to allow shell mix n match + slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET + w_class = WEIGHT_CLASS_NORMAL + w_volume = ITEM_VOLUME_STRIPPER_CLIP ammo_type = /obj/item/ammo_casing/shotgun max_ammo = 4 var/pixeloffsetx = 4 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ee073dbfcd..8cddd5d02f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -62,7 +62,8 @@ var/no_pin_required = FALSE //whether the gun can be fired without a pin var/obj/item/flashlight/gun_light - var/can_flashlight = 0 + var/can_flashlight = FALSE + var/gunlight_state = "flight" var/obj/item/kitchen/knife/bayonet var/mutable_appearance/knife_overlay var/can_bayonet = FALSE @@ -417,14 +418,7 @@ return to_chat(user, "You attach \the [K] to the front of \the [src].") bayonet = K - var/state = "bayonet" //Generic state. - if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? - state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' - knife_overlay = mutable_appearance(bayonet_icons, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - add_overlay(knife_overlay, TRUE) + update_icon() else if(istype(I, /obj/item/screwdriver)) if(gun_light) var/obj/item/flashlight/seclite/S = gun_light @@ -439,8 +433,7 @@ var/obj/item/kitchen/knife/K = bayonet K.forceMove(get_turf(user)) bayonet = null - cut_overlay(knife_overlay, TRUE) - knife_overlay = null + update_icon() else return ..() @@ -468,22 +461,35 @@ set_light(gun_light.brightness_on, gun_light.flashlight_power, gun_light.light_color) else set_light(0) - cut_overlays(flashlight_overlay, TRUE) - var/state = "flight[gun_light.on? "_on":""]" //Generic state. + else + set_light(0) + update_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/gun/update_overlays() + . = ..() + if(gun_light) + var/mutable_appearance/flashlight_overlay + var/state = "[gunlight_state][gun_light.on? "_on":""]" //Generic state. if(gun_light.icon_state in icon_states('icons/obj/guns/flashlights.dmi')) //Snowflake state? state = gun_light.icon_state flashlight_overlay = mutable_appearance('icons/obj/guns/flashlights.dmi', state) flashlight_overlay.pixel_x = flight_x_offset flashlight_overlay.pixel_y = flight_y_offset - add_overlay(flashlight_overlay, TRUE) - else - set_light(0) - cut_overlays(flashlight_overlay, TRUE) - flashlight_overlay = null - update_icon(TRUE) - for(var/X in actions) - var/datum/action/A = X - A.UpdateButtonIcon() + . += flashlight_overlay + + if(bayonet) + var/mutable_appearance/knife_overlay + var/state = "bayonet" //Generic state. + if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? + state = bayonet.icon_state + var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' + knife_overlay = mutable_appearance(bayonet_icons, state) + knife_overlay.pixel_x = knife_x_offset + knife_overlay.pixel_y = knife_y_offset + . += knife_overlay /obj/item/gun/item_action_slot_check(slot, mob/user, datum/action/A) if(istype(A, /datum/action/item_action/toggle_scope_zoom) && slot != SLOT_HANDS) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index fa8099a257..1aefa51a51 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -53,6 +53,8 @@ ..() if (istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A + if(AM.load_delay && !do_after(user, AM.load_delay, target = src)) + return FALSE if (!magazine && istype(AM, mag_type)) if(user.transferItemToLoc(AM, src)) magazine = AM diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index b31fd2d1e0..9210e66f22 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -18,13 +18,15 @@ /obj/item/gun/ballistic/automatic/proto/unrestricted pin = /obj/item/firing_pin -/obj/item/gun/ballistic/automatic/update_icon() - ..() +/obj/item/gun/ballistic/automatic/update_overlays() + . = ..() if(automatic_burst_overlay) if(!select) - add_overlay("[initial(icon_state)]semi") + . += ("[initial(icon_state)]semi") if(select == 1) - add_overlay("[initial(icon_state)]burst") + . += "[initial(icon_state)]burst" + +/obj/item/gun/ballistic/automatic/update_icon_state() icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/attackby(obj/item/A, mob/user, params) @@ -115,8 +117,7 @@ . = ..() empty_alarm() -/obj/item/gun/ballistic/automatic/c20r/update_icon() - ..() +/obj/item/gun/ballistic/automatic/c20r/update_icon_state() icon_state = "c20r[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/wt550 @@ -141,9 +142,8 @@ . = ..() spread = 0 -/obj/item/gun/ballistic/automatic/wt550/update_icon() - ..() - icon_state = "wt550[magazine ? "-[CEILING(( (get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20. +/obj/item/gun/ballistic/automatic/wt550/update_icon_state() + icon_state = "wt550[magazine ? "-[CEILING(((get_ammo(FALSE) / magazine.max_ammo) * 20) /4, 1)*4]" : "-0"]" //Sprites only support up to 20. /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper Type U3 Uzi" @@ -160,6 +160,7 @@ mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/gunshot_smg.ogg' can_suppress = FALSE + automatic_burst_overlay = FALSE var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel burst_size = 3 burst_shot_delay = 2 @@ -191,18 +192,19 @@ underbarrel.attackby(A, user, params) else ..() -/obj/item/gun/ballistic/automatic/m90/update_icon() - ..() - cut_overlays() +/obj/item/gun/ballistic/automatic/m90/update_overlays() + . = ..() switch(select) if(0) - add_overlay("[initial(icon_state)]semi") + . += "[initial(icon_state)]semi" if(1) - add_overlay("[initial(icon_state)]burst") + . += "[initial(icon_state)]burst" if(2) - add_overlay("[initial(icon_state)]gren") + . += "[initial(icon_state)]gren" + +/obj/item/gun/ballistic/automatic/m90/update_icon_state() icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" - return + /obj/item/gun/ballistic/automatic/m90/burst_select() var/mob/living/carbon/human/user = usr switch(select) @@ -257,6 +259,7 @@ weapon_weight = WEAPON_MEDIUM mag_type = /obj/item/ammo_box/magazine/m12g fire_sound = 'sound/weapons/gunshot.ogg' + automatic_burst_overlay = FALSE can_suppress = FALSE burst_size = 1 pin = /obj/item/firing_pin/implant/pindicate @@ -269,10 +272,13 @@ . = ..() update_icon() -/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_icon() - cut_overlays() +/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_icon_state() + return + +/obj/item/gun/ballistic/automatic/shotgun/bulldog/update_overlays() + . = ..() if(magazine) - add_overlay("[magazine.icon_state]") + . += "[magazine.icon_state]" icon_state = "bulldog[chambered ? "" : "-e"]" /obj/item/gun/ballistic/automatic/shotgun/bulldog/afterattack() @@ -298,6 +304,7 @@ burst_shot_delay = 1 spread = 7 pin = /obj/item/firing_pin/implant/pindicate + automatic_burst_overlay = FALSE /obj/item/gun/ballistic/automatic/l6_saw/unrestricted pin = /obj/item/firing_pin @@ -316,7 +323,7 @@ playsound(user, 'sound/weapons/sawclose.ogg', 60, 1) update_icon() -/obj/item/gun/ballistic/automatic/l6_saw/update_icon() +/obj/item/gun/ballistic/automatic/l6_saw/update_icon_state() icon_state = "l6[cover_open ? "open" : "closed"][magazine ? CEILING(get_ammo(0)/12.5, 1)*25 : "-empty"][suppressed ? "-suppressed" : ""]" item_state = "l6[cover_open ? "openmag" : "closedmag"]" @@ -369,9 +376,10 @@ zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you. zoom_out_amt = 13 slot_flags = ITEM_SLOT_BACK + automatic_burst_overlay = FALSE actions_types = list() -/obj/item/gun/ballistic/automatic/sniper_rifle/update_icon() +/obj/item/gun/ballistic/automatic/sniper_rifle/update_icon_state() if(magazine) icon_state = "sniper-mag" else @@ -397,9 +405,10 @@ can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK + automatic_burst_overlay = FALSE actions_types = list() -/obj/item/gun/ballistic/automatic/surplus/update_icon() +/obj/item/gun/ballistic/automatic/surplus/update_icon_state() if(magazine) icon_state = "surplus" else @@ -413,6 +422,7 @@ icon_state = "oldrifle" item_state = "arg" mag_type = /obj/item/ammo_box/magazine/recharge + automatic_burst_overlay = FALSE fire_delay = 2 can_suppress = FALSE burst_size = 1 @@ -420,7 +430,5 @@ fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE -/obj/item/gun/ballistic/automatic/laser/update_icon() - ..() +/obj/item/gun/ballistic/automatic/laser/update_icon_state() icon_state = "oldrifle[magazine ? "-[CEILING(get_ammo(0)/4, 1)*4]" : ""]" - return diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 004f78235a..9e03207888 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -42,8 +42,7 @@ actions_types = list() casing_ejector = FALSE -/obj/item/gun/ballistic/automatic/gyropistol/update_icon() - ..() +/obj/item/gun/ballistic/automatic/gyropistol/update_icon_state() icon_state = "[initial(icon_state)][magazine ? "loaded" : ""]" /obj/item/gun/ballistic/automatic/speargun @@ -54,6 +53,7 @@ w_class = WEIGHT_CLASS_BULKY force = 10 can_suppress = FALSE + automatic_burst_overlay = FALSE mag_type = /obj/item/ammo_box/magazine/internal/speargun fire_sound = 'sound/weapons/grenadelaunch.ogg' burst_size = 1 @@ -62,8 +62,9 @@ actions_types = list() casing_ejector = FALSE -/obj/item/gun/ballistic/automatic/speargun/update_icon() - return +/obj/item/gun/ballistic/automatic/speargun/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/gun/ballistic/automatic/speargun/attack_self() return @@ -137,7 +138,7 @@ chamber_round() update_icon() -/obj/item/gun/ballistic/rocketlauncher/update_icon() +/obj/item/gun/ballistic/rocketlauncher/update_icon_state() icon_state = "[initial(icon_state)]-[chambered ? "1" : "0"]" /obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) diff --git a/code/modules/projectiles/guns/ballistic/magweapon.dm b/code/modules/projectiles/guns/ballistic/magweapon.dm index 74b8b210a7..4e27a73300 100644 --- a/code/modules/projectiles/guns/ballistic/magweapon.dm +++ b/code/modules/projectiles/guns/ballistic/magweapon.dm @@ -75,8 +75,7 @@ recoil = 2 weapon_weight = WEAPON_HEAVY -/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon() - ..() +/obj/item/gun/ballistic/automatic/magrifle/hyperburst/update_icon_state() icon_state = "hyperburst[magazine ? "-[get_ammo()]" : ""][chambered ? "" : "-e"]" ///magpistol/// @@ -92,12 +91,14 @@ fire_delay = 2 inaccuracy_modifier = 0.25 cell_type = /obj/item/stock_parts/cell/magnetic/pistol + automatic_burst_overlay = FALSE -/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon() - ..() - cut_overlays() +/obj/item/gun/ballistic/automatic/magrifle/pistol/update_overlays() + . = ..() if(magazine) - add_overlay("magpistol-magazine") + . += "magpistol-magazine" + +/obj/item/gun/ballistic/automatic/magrifle/pistol/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" /obj/item/gun/ballistic/automatic/magrifle/pistol/nopin diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index cdaadb5c3b..e775fdc05a 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -8,12 +8,12 @@ burst_size = 1 fire_delay = 0 actions_types = list() + automatic_burst_overlay = FALSE /obj/item/gun/ballistic/automatic/pistol/no_mag spawnwithmagazine = FALSE -/obj/item/gun/ballistic/automatic/pistol/update_icon() - ..() +/obj/item/gun/ballistic/automatic/pistol/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/pistol/suppressed/Initialize(mapload) @@ -28,6 +28,7 @@ icon = 'modular_citadel/icons/obj/guns/cit_guns.dmi' icon_state = "cde" can_unsuppress = TRUE + automatic_burst_overlay = FALSE obj_flags = UNIQUE_RENAME unique_reskin = list("Default" = "cde", "N-99" = "n99", @@ -38,20 +39,18 @@ "PX4 Storm" = "px4" ) -/obj/item/gun/ballistic/automatic/pistol/modular/update_icon() - ..() +/obj/item/gun/ballistic/automatic/pistol/modular/update_icon_state() if(current_skin) icon_state = "[unique_reskin[current_skin]][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" else icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" + +/obj/item/gun/ballistic/automatic/pistol/modular/update_overlays() + . = ..() if(magazine && suppressed) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine-sup") //Yes, this means the default iconstate can't have a magazine overlay + . += "[unique_reskin[current_skin]]-magazine-sup" //Yes, this means the default iconstate can't have a magazine overlay else if (magazine) - cut_overlays() - add_overlay("[unique_reskin[current_skin]]-magazine") - else - cut_overlays() + . += "[unique_reskin[current_skin]]-magazine" /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" @@ -77,14 +76,14 @@ force = 14 mag_type = /obj/item/ammo_box/magazine/m50 can_suppress = FALSE + automatic_burst_overlay = FALSE -/obj/item/gun/ballistic/automatic/pistol/deagle/update_icon() - ..() +/obj/item/gun/ballistic/automatic/pistol/deagle/update_overlays() + . = ..() if(magazine) - cut_overlays() - add_overlay("deagle_magazine") - else - cut_overlays() + . += "deagle_magazine" + +/obj/item/gun/ballistic/automatic/pistol/deagle/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" /obj/item/gun/ballistic/automatic/pistol/deagle/gold @@ -142,14 +141,14 @@ actions_types = list() fire_sound = 'sound/weapons/blastcannon.ogg' spread = 20 //damn thing has no rifling. + automatic_burst_overlay = FALSE -/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() - ..() +/obj/item/gun/ballistic/automatic/pistol/antitank/update_overlays() + . = ..() if(magazine) - cut_overlays() - add_overlay("atp-mag") - else - cut_overlays() + . += "atp-mag" + +/obj/item/gun/ballistic/automatic/pistol/antitank/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index a5ed45dd48..6f1fb96af5 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -348,10 +348,10 @@ else to_chat(user, "You need at least ten lengths of cable if you want to make a sling!") -/obj/item/gun/ballistic/revolver/doublebarrel/improvised/update_icon() - ..() +/obj/item/gun/ballistic/revolver/doublebarrel/improvised/update_overlays() + . = ..() if(slung) - icon_state += "sling" + . += "[icon_state]sling" /obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawoff(mob/user) . = ..() diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 873b129c8f..ecf6e538b8 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -164,10 +164,10 @@ else to_chat(user, "You need at least ten lengths of cable if you want to make a sling!") -/obj/item/gun/ballistic/shotgun/boltaction/improvised/update_icon() - ..() +/obj/item/gun/ballistic/shotgun/boltaction/improvised/update_overlays() + . = ..() if(slung) - icon_state += "sling" + . += "[icon_state]sling" /obj/item/gun/ballistic/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" @@ -272,7 +272,7 @@ spread = 2 update_icon() -/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon() +/obj/item/gun/ballistic/shotgun/automatic/combat/compact/update_icon_state() icon_state = "[current_skin ? unique_reskin[current_skin] : "cshotgun"][stock ? "" : "c"]" //Dual Feed Shotgun diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 1f66cfdf8a..e7f26670d4 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -27,9 +27,9 @@ burst_size = 1 fire_delay = 0 actions_types = list() + automatic_burst_overlay = FALSE -/obj/item/gun/ballistic/automatic/toy/pistol/update_icon() - ..() +/obj/item/gun/ballistic/automatic/toy/pistol/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]" /obj/item/gun/ballistic/automatic/toy/pistol/riot diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c2b821dfcf..17dcfa96e6 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -29,7 +29,6 @@ var/charge_sections = 4 ammo_x_offset = 2 var/shaded_charge = FALSE //if this gun uses a stateful charge bar for more detail - var/old_ratio = 0 // stores the gun's previous ammo "ratio" to see if it needs an updated icon var/selfcharge = EGUN_NO_SELFCHARGE // EGUN_SELFCHARGE if true, EGUN_SELFCHARGE_BORG drains the cyborg's cell to recharge its own var/charge_tick = 0 var/charge_delay = 4 @@ -64,10 +63,20 @@ START_PROCESSING(SSobj, src) update_icon() +/obj/item/gun/energy/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + /obj/item/gun/energy/Destroy() STOP_PROCESSING(SSobj, src) return ..() +/obj/item/gun/energy/handle_atom_del(atom/A) + if(A == cell) + cell = null + update_icon() + return ..() + /obj/item/gun/energy/examine(mob/user) . = ..() if(!right_click_overridden) @@ -226,46 +235,47 @@ #undef DECREMENT_OR_WRAP #undef IS_VALID_INDEX -/obj/item/gun/energy/update_icon(force_update) - if(QDELETED(src)) +/obj/item/gun/energy/update_icon_state() + if(initial(item_state)) return ..() + var/ratio = get_charge_ratio() + var/new_item_state = "" + new_item_state = initial(icon_state) + if(modifystate) + var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] + new_item_state += "[shot.select_name]" + new_item_state += "[ratio]" + item_state = new_item_state + +/obj/item/gun/energy/update_overlays() + . = ..() + if(QDELETED(src)) + return if(!automatic_charge_overlays) return - var/ratio = can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 - // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if it's power cell is removed. - // TG issues #5361 & #47908 - if(ratio == old_ratio && !force_update) - return - old_ratio = ratio - cut_overlays() - var/iconState = "[icon_state]_charge" - var/itemState = null - if(!initial(item_state)) - itemState = icon_state + var/overlay_icon_state = "[icon_state]_charge" + var/ratio = get_charge_ratio() if (modifystate) var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] - add_overlay("[icon_state]_[shot.select_name]") - iconState += "_[shot.select_name]" - if(itemState) - itemState += "[shot.select_name]" + . += "[icon_state]_[shot.select_name]" + overlay_icon_state += "_[shot.select_name]" if(ratio == 0) - add_overlay("[icon_state]_empty") + . += "[icon_state]_empty" else if(!shaded_charge) - var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, overlay_icon_state) for(var/i = ratio, i >= 1, i--) charge_overlay.pixel_x = ammo_x_offset * (i - 1) charge_overlay.pixel_y = ammo_y_offset * (i - 1) - add_overlay(charge_overlay) + . += charge_overlay else - add_overlay("[icon_state]_charge[ratio]") - if(itemState) - itemState += "[ratio]" - item_state = itemState - if(ismob(loc)) //forces inhands to update - var/mob/M = loc - M.update_inv_hands() + . += "[icon_state]_charge[ratio]" + +///Used by update_icon_state() and update_overlays() +/obj/item/gun/energy/proc/get_charge_ratio() + return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed. /obj/item/gun/energy/suicide_act(mob/living/user) if (istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 80bb269b21..04eff5afa9 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -207,12 +207,11 @@ to_chat(user,"You switch [src] setting to [setting] mode.") update_icon() -/obj/item/gun/energy/dueling/update_icon(force_update) +/obj/item/gun/energy/dueling/update_overlays(force_update) . = ..() if(setting_overlay) - cut_overlay(setting_overlay) setting_overlay.icon_state = setting_iconstate() - add_overlay(setting_overlay) + . += setting_overlay /obj/item/gun/energy/dueling/Destroy() if(duel) @@ -363,8 +362,7 @@ STR.max_items = 2 STR.can_hold = typecacheof(/obj/item/gun/energy/dueling) -/obj/item/storage/lockbox/dueling/update_icon() - cut_overlays() +/obj/item/storage/lockbox/dueling/update_icon_state() var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED) if(locked) icon_state = "medalbox+l" diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 1b835d35a4..2c9794f391 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -19,17 +19,13 @@ cell_type = /obj/item/stock_parts/cell{charge = 600; maxcharge = 600} ammo_x_offset = 2 charge_sections = 3 + gunlight_state = "mini-light" can_flashlight = 0 // Can't attach or detach the flashlight, and override it's icon update /obj/item/gun/energy/e_gun/mini/Initialize() gun_light = new /obj/item/flashlight/seclite(src) return ..() -/obj/item/gun/energy/e_gun/mini/update_icon() - ..() - if(gun_light && gun_light.on) - add_overlay("mini-light") - /obj/item/gun/energy/e_gun/stun name = "tactical energy gun" desc = "Military issue energy gun, is able to fire stun rounds." @@ -138,15 +134,15 @@ return fail_chance = min(fail_chance + round(15/severity), 100) -/obj/item/gun/energy/e_gun/nuclear/update_icon() - ..() +/obj/item/gun/energy/e_gun/nuclear/update_overlays() + . = ..() if(crit_fail) - add_overlay("[icon_state]_fail_3") + . += "[icon_state]_fail_3" else switch(fail_tick) if(0) - add_overlay("[icon_state]_fail_0") + . += "[icon_state]_fail_0" if(1 to 150) - add_overlay("[icon_state]_fail_1") + . += "[icon_state]_fail_1" if(151 to INFINITY) - add_overlay("[icon_state]_fail_2") + . += "[icon_state]_fail_2" diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 0c723199a1..c1f47ccd1a 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -46,13 +46,6 @@ range = 4 log_override = TRUE -/obj/item/gun/energy/kinetic_accelerator/premiumka/update_icon() - ..() - if(!can_shoot()) - add_overlay("[icon_state]_empty") - else - cut_overlays() - /obj/item/gun/energy/kinetic_accelerator/getinaccuracy(mob/living/user, bonus_spread, stamloss) var/old_fire_delay = fire_delay //It's pretty irrelevant tbh but whatever. fire_delay = overheat_time @@ -186,12 +179,10 @@ update_icon() overheat = FALSE -/obj/item/gun/energy/kinetic_accelerator/update_icon() - ..() +/obj/item/gun/energy/kinetic_accelerator/update_overlays() + . = ..() if(!can_shoot()) - add_overlay("[icon_state]_empty") - else - cut_overlays() + . += "[icon_state]_empty" //Casing /obj/item/ammo_casing/energy/kinetic diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 20e847326e..19ca42022d 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -34,11 +34,11 @@ pin = null ammo_x_offset = 1 -/obj/item/gun/energy/decloner/update_icon() +/obj/item/gun/energy/decloner/update_overlays() ..() var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(!QDELETED(cell) && (cell.charge > shot.e_cost)) - add_overlay("decloner_spin") + . += "decloner_spin" /obj/item/gun/energy/floragun name = "floral somatoray" @@ -134,9 +134,10 @@ tool_behaviour = TOOL_WELDER toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders -/obj/item/gun/energy/plasmacutter/Initialize() +/obj/item/gun/energy/plasmacutter/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 25, 105, 0, 'sound/weapons/plasma_cutter.ogg') + AddElement(/datum/element/update_icon_blocker) /obj/item/gun/energy/plasmacutter/examine(mob/user) . = ..() @@ -166,9 +167,6 @@ /obj/item/gun/energy/plasmacutter/use(amount) return cell.use(amount * 100) -/obj/item/gun/energy/plasmacutter/update_icon() - return - /obj/item/gun/energy/plasmacutter/adv name = "advanced plasma cutter" icon_state = "adv_plasmacutter" @@ -183,11 +181,12 @@ icon_state = "wormhole_projector" pin = null inaccuracy_modifier = 0.25 + automatic_charge_overlays = FALSE var/obj/effect/portal/p_blue var/obj/effect/portal/p_orange var/atmos_link = FALSE -/obj/item/gun/energy/wormhole_projector/update_icon() +/obj/item/gun/energy/wormhole_projector/update_icon_state() icon_state = "[initial(icon_state)][current_firemode_index]" item_state = icon_state @@ -256,8 +255,9 @@ can_charge = 0 use_cyborg_cell = 1 -/obj/item/gun/energy/printer/update_icon() - return +/obj/item/gun/energy/printer/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_blocker) /obj/item/gun/energy/printer/emp_act() return @@ -321,14 +321,14 @@ inaccuracy_modifier = 0.25 cell_type = /obj/item/stock_parts/cell/super ammo_type = list(/obj/item/ammo_casing/energy/emitter) + automatic_charge_overlays = FALSE -/obj/item/gun/energy/emitter/update_icon() - ..() +/obj/item/gun/energy/emitter/update_icon_state() var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(!QDELETED(cell) && (cell.charge > shot.e_cost)) - add_overlay("emitter_carbine_empty") + icon_state = "emitter_carbine_empty" else - add_overlay("emitter_carbine") + icon_state = "emitter_carbine" //the pickle ray /obj/item/gun/energy/pickle_gun diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index fd09aa7f9d..5e250d44e2 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -35,6 +35,7 @@ slowdown = 1 item_flags = NO_MAT_REDEMPTION | SLOWS_WHILE_IN_HAND | NEEDS_PERMIT pin = null + automatic_charge_overlays = FALSE var/aiming = FALSE var/aiming_time = 14 var/aiming_time_fire_threshold = 5 @@ -152,13 +153,13 @@ current_zoom_x = 0 current_zoom_y = 0 -/obj/item/gun/energy/beam_rifle/update_icon() - cut_overlays() +/obj/item/gun/energy/beam_rifle/update_overlays() + . = ..() var/obj/item/ammo_casing/energy/primary_ammo = ammo_type[1] if(!QDELETED(cell) && (cell.charge > primary_ammo.e_cost)) - add_overlay(charged_overlay) + . += charged_overlay else - add_overlay(drained_overlay) + . += drained_overlay /obj/item/gun/energy/beam_rifle/attack_self(mob/user) if(!structure_piercing) diff --git a/code/modules/projectiles/guns/misc/blastcannon.dm b/code/modules/projectiles/guns/misc/blastcannon.dm index 1c8d519ba8..60b7565333 100644 --- a/code/modules/projectiles/guns/misc/blastcannon.dm +++ b/code/modules/projectiles/guns/misc/blastcannon.dm @@ -41,18 +41,16 @@ user.put_in_hands(bomb) user.visible_message("[user] detaches [bomb] from [src].") bomb = null + name = initial(name) + desc = initial(desc) update_icon() return ..() -/obj/item/gun/blastcannon/update_icon() +/obj/item/gun/blastcannon/update_icon_state() if(bomb) icon_state = icon_state_loaded - name = "blast cannon" - desc = "A makeshift device used to concentrate a bomb's blast energy to a narrow wave." else icon_state = initial(icon_state) - name = initial(name) - desc = initial(desc) /obj/item/gun/blastcannon/attackby(obj/O, mob/user) if(istype(O, /obj/item/transfer_valve)) @@ -65,6 +63,8 @@ return FALSE user.visible_message("[user] attaches [T] to [src]!") bomb = T + name = "blast cannon" + desc = "A makeshift device used to concentrate a bomb's blast energy to a narrow wave." update_icon() return TRUE return ..() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c2662a8342..c489edf88e 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -1165,3 +1165,9 @@ random_reagents += R var/picked_reagent = pick(random_reagents) return picked_reagent + +/proc/get_chem_id(chem_name) + for(var/X in GLOB.chemical_reagents_list) + var/datum/reagent/R = GLOB.chemical_reagents_list[X] + if(ckey(chem_name) == ckey(lowertext(R.name))) + return X diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 207325e1b3..32ac7cecba 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -1,5 +1,3 @@ -#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die -#define RANDOM_PILL_STYLE 22 //Dont change this one though /obj/machinery/chem_master name = "ChemMaster 3000" diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index a539897c9d..d22523c4b8 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -36,6 +36,14 @@ for(var/obj/item/stock_parts/matter_bin/B in component_parts) reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating +/obj/machinery/smoke_machine/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, .proc/can_be_rotated)) + AddComponent(/datum/component/plumbing/simple_demand) //this SURELY CANT' LEAD TO BAD THINGS HAPPENING. + +/obj/machinery/smoke_machine/proc/can_be_rotated(mob/user, rotation_type) + return !anchored + /obj/machinery/smoke_machine/update_icon_state() if((!is_operational()) || (!on) || (reagents.total_volume == 0)) if (panel_open) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index a85ac8b085..672127cb11 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -8,6 +8,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if (length(initial(R.name))) .[ckey(initial(R.name))] = t + //Various reagents //Toxin & acid reagents //Hydroponics stuff @@ -52,6 +53,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/metabolizing = FALSE var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME var/value = REAGENT_VALUE_NONE //How much does it sell for in cargo? + var/datum/material/material //are we made of material? + +/datum/reagent/New() + . = ..() + + if(material) + material = SSmaterials.GetMaterialRef(material) + /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() @@ -220,4 +229,3 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) if(blood_change) bloodsuckerdatum.AddBloodVolume(blood_change) - diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a6e78ae98c..18203f1a4c 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -132,8 +132,8 @@ "You're covered in boiling oil!") M.emote("scream") playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE) - var/oil_damage = max((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit - M.adjustFireLoss(oil_damage * max(reac_volume,20)) //Damage caps at 20 + var/oil_damage = min((holder.chem_temp / fry_temperature) * 0.33,1) //Damage taken per unit + M.adjustFireLoss(oil_damage * min(reac_volume,20)) //Damage caps at 20 else ..() return TRUE diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 8bb34c0a82..37010cbbb5 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -515,12 +515,13 @@ overdose_threshold = 30 pH = 2 value = REAGENT_VALUE_UNCOMMON + var/healing = 0.5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) + M.adjustToxLoss(-healing*REM, 0) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) ..() . = 1 @@ -532,6 +533,12 @@ ..() . = 1 +/datum/reagent/medicine/omnizine/protozine + name = "Protozine" + description = "A less environmentally friendly and somewhat weaker variant of omnizine." + color = "#d8c7b7" + healing = 0.2 + /datum/reagent/medicine/calomel name = "Calomel" description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 3433824282..5c01fd8cf6 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -313,6 +313,13 @@ metabolization_rate = 45 * REAGENTS_METABOLISM . = 1 +/datum/reagent/water/hollowwater + name = "Hollow Water" + description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." + color = "#88878777" + taste_description = "emptyiness" + + /datum/reagent/water/holywater name = "Holy Water" description = "Water blessed by some deity." @@ -950,6 +957,7 @@ color = "#1C1300" // rgb: 30, 20, 0 taste_description = "sour chalk" pH = 5 + material = /datum/material/diamond /datum/reagent/carbon/reaction_turf(turf/T, reac_volume) if(!isspaceturf(T)) @@ -1072,6 +1080,7 @@ pH = 6 overdose_threshold = 30 color = "#c2391d" + material = /datum/material/iron /datum/reagent/iron/on_mob_life(mob/living/carbon/C) if((HAS_TRAIT(C, TRAIT_NOMARROW))) @@ -1103,6 +1112,7 @@ reagent_state = SOLID color = "#F7C430" // rgb: 247, 196, 48 taste_description = "expensive metal" + material = /datum/material/gold /datum/reagent/silver name = "Silver" @@ -1110,6 +1120,7 @@ reagent_state = SOLID color = "#D0D0D0" // rgb: 208, 208, 208 taste_description = "expensive yet reasonable metal" + material = /datum/material/silver /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_SILVER)) @@ -1123,6 +1134,7 @@ color = "#B8B8C0" // rgb: 184, 184, 192 taste_description = "the inside of a reactor" pH = 4 + material = /datum/material/uranium /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -1144,6 +1156,7 @@ taste_description = "fizzling blue" pH = 12 value = REAGENT_VALUE_RARE + material = /datum/material/bluespace /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -1182,6 +1195,7 @@ color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 pH = 10 + material = /datum/material/glass /datum/reagent/fuel name = "Welding fuel" @@ -2206,6 +2220,66 @@ color = "#f7685e" metabolization_rate = REAGENTS_METABOLISM * 0.25 +/datum/reagent/wittel + name = "Wittel" + description = "An extremely rare metallic-white substance only found on demon-class planets." + color = "#FFFFFF" // rgb: 255, 255, 255 + taste_mult = 0 // oderless and tasteless + +/datum/reagent/metalgen + name = "Metalgen" + data = list("material"=null) + description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches." + color = "#b000aa" + taste_mult = 0 // oderless and tasteless + var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + var/minumum_material_amount = 100 + +/datum/reagent/metalgen/reaction_obj(obj/O, volume) + metal_morph(O) + return + +/datum/reagent/metalgen/reaction_turf(turf/T, volume) + metal_morph(T) + return + +///turn an object into a special material +/datum/reagent/metalgen/proc/metal_morph(atom/A) + var/metal_ref = data["material"] + if(!metal_ref) + return + var/metal_amount = 0 + + for(var/B in A.custom_materials) //list with what they're made of + metal_amount += A.custom_materials[B] + + if(!metal_amount) + metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist + + var/list/metal_dat = list() + metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf + + A.material_flags = applied_material_flags + A.set_custom_materials(metal_dat) + +/datum/reagent/gravitum + name = "Gravitum" + description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even + color = "#050096" // rgb: 5, 0, 150 + taste_mult = 0 // oderless and tasteless + metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use + var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche + +/datum/reagent/gravitum/reaction_obj(obj/O, volume) + O.AddElement(/datum/element/forced_gravity, 0) + + addtimer(CALLBACK(O, .proc/_RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier) + +/datum/reagent/gravitum/on_mob_add(mob/living/L) + L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless + +/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) + L.RemoveElement(/datum/element/forced_gravity, 0) //body bluids /datum/reagent/consumable/semen @@ -2334,6 +2408,7 @@ datum/reagent/eldritch color = "#E6E6DA" taste_mult = 0 + /datum/reagent/hairball name = "Hairball" description = "A bundle of keratinous bits and fibers, not easily digestible." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 8dca028b4a..07934d9880 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -64,6 +64,7 @@ toxpwr = 3 pH = 4 value = REAGENT_VALUE_RARE //sheets are worth more + material = /datum/material/plasma /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index bb9a951cac..9e0c78d2e6 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -219,6 +219,12 @@ results = list(/datum/reagent/medicine/strange_reagent = 3) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/strange_reagent/alt + name = "Strange Reagent" + id = /datum/reagent/medicine/strange_reagent + results = list(/datum/reagent/medicine/strange_reagent = 2) + required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) + /datum/chemical_reaction/mannitol name = "Mannitol" id = /datum/reagent/medicine/mannitol @@ -345,4 +351,20 @@ /datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) for(var/i = 1, i <= created_volume, i++) - new /obj/item/stack/medical/mesh/advanced(location) \ No newline at end of file + new /obj/item/stack/medical/mesh/advanced(location) + +/datum/chemical_reaction/suture + required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/styptic_powder = 2) + +/datum/chemical_reaction/suture/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/suture/(location) + +/datum/chemical_reaction/mesh + required_reagents = list(/datum/reagent/cellulose = 2, /datum/reagent/medicine/silver_sulfadiazine = 2) + +/datum/chemical_reaction/mesh/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/stack/medical/mesh/(location) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 09b7eabbc1..92861a94ed 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -1,3 +1,34 @@ +/datum/chemical_reaction/metalgen + name = "metalgen" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint + name = "metalgen imprint" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/holywater + name = "Holy Water" + id = /datum/reagent/water/holywater + results = list(/datum/reagent/water/holywater = 1) + required_reagents = list(/datum/reagent/water/hollowwater = 1) + required_catalysts = list(/datum/reagent/water/holywater = 1) + +/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) + for(var/datum/reagent/R in holder.reagent_list) + if(R.material && R.volume >= 40) + MM.data["material"] = R.material + holder.remove_reagent(R.type, 40) + +/datum/chemical_reaction/gravitum + name = "gravitum" + id = /datum/reagent/gravitum + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10) + results = list(/datum/reagent/gravitum = 10) /datum/chemical_reaction/sterilizine name = "Sterilizine" @@ -711,7 +742,7 @@ /datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) new /obj/item/slime_extract/grey(location) - + // Liquid Carpets /datum/chemical_reaction/carpet diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 9b25a80680..926ed27854 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -19,6 +19,10 @@ var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode. var/stream_amount = 10 //the amount of reagents transfered when in stream mode. var/spray_delay = 3 //The amount of sleep() delay between each chempuff step. + /// Last world.time of spray + var/last_spray = 0 + /// Spray cooldown + var/spray_cooldown = CLICK_CD_MELEE var/can_fill_from_container = TRUE amount_per_transfer_from_this = 5 volume = 250 @@ -27,8 +31,6 @@ /obj/item/reagent_containers/spray/afterattack(atom/A, mob/user) . = ..() - if(!user.CheckActionCooldown(CLICK_CD_MELEE)) - return if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) return @@ -49,7 +51,8 @@ to_chat(user, "[src] is empty!") return - spray(A) + if(!spray(A)) + return playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) user.last_action = world.time @@ -64,10 +67,10 @@ if(reagents.has_reagent(/datum/reagent/lube)) message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [ADMIN_VERBOSEJMP(T)].") log_game("[key_name(user)] fired Space lube from \a [src] at [AREACOORD(T)].") - return - /obj/item/reagent_containers/spray/proc/spray(atom/A) + if((last_spray + spray_cooldown) > world.time) + return var/range = clamp(get_dist(src, A), 1, current_range) var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE) @@ -79,10 +82,11 @@ reagents.trans_to(D, amount_per_transfer_from_this, 1/range) D.color = mix_color_from_reagents(D.reagents.reagent_list) var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2) - do_spray(A, wait_step, D, range, puff_reagent_left) + last_spray = world.time + INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left) + return TRUE /obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left) - set waitfor = FALSE var/range_left = range for(var/i=0, i[user.name] [anchored ? "fasten" : "unfasten"] [src]", \ + "You [anchored ? "fasten" : "unfasten"] [src]") + var/datum/component/plumbing/CP = GetComponent(/datum/component/plumbing) + if(anchored) + CP.enable() + else + CP.disable() + +/obj/structure/reagent_dispensers/plumbed/ComponentInitialize() + AddComponent(/datum/component/plumbing/simple_supply) + +/obj/structure/reagent_dispensers/plumbed/storage + name = "stationairy storage tank" + icon_state = "tank_stationairy" + reagent_id = null //start empty + +/obj/structure/reagent_dispensers/plumbed/storage/ComponentInitialize() + AddComponent(/datum/component/plumbing/tank) + ////////////// //Fuel Tanks// ////////////// @@ -271,5 +304,3 @@ icon_state = "bluekeg" reagent_id = /datum/reagent/consumable/ethanol/neurotoxin tank_volume = 100 //2.5x less than the other kegs because it's harder to get - - diff --git a/code/modules/research/designs/machine_desings/machine_designs_medical.dm b/code/modules/research/designs/machine_desings/machine_designs_medical.dm index 329fb7bf6e..84a3ed10d5 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_medical.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_medical.dm @@ -105,3 +105,11 @@ build_path = /obj/item/circuitboard/machine/bloodbankgen departmental_flags = DEPARTMENTAL_FLAG_MEDICAL category = list ("Medical Machinery") + +/datum/design/board/medipen_refiller + name = "Machine Design (Medipen Refiller)" + desc = "The circuit board for a Medipen Refiller." + id = "medipen_refiller" + build_path = /obj/item/circuitboard/machine/medipen_refiller + category = list ("Medical Machinery") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/designs/machine_desings/machine_designs_service.dm b/code/modules/research/designs/machine_desings/machine_designs_service.dm index 5cbff1c66a..af4f650793 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_service.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_service.dm @@ -81,6 +81,14 @@ category = list ("Hydroponics Machinery") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/board/hydroponics/auto + name = "Machine Design (Automatic Hydroponics Tray Board)" + desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN." + id = "autohydrotray" + build_path = /obj/machinery/hydroponics/constructable/automagic + category = list ("Hydroponics Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL + /datum/design/board/monkey_recycler name = "Machine Design (Monkey Recycler Board)" desc = "The circuit board for a monkey recycler." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e1e55f3476..0a9fce2e67 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -961,3 +961,158 @@ build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + + +/datum/design/acclimator + name = "Plumbing Acclimator" + desc = "A heating and cooling device for pipes!" + id = "acclimator" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 15 + build_path = /obj/machinery/plumbing/acclimator + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/disposer + name = "Plumbing Disposer" + desc = "Using the power of Science, dissolves reagents into nothing (almost)." + id = "disposer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 100) + construction_time = 15 + build_path = /obj/machinery/plumbing/disposer + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_filter + name = "Plumbing Filter" + desc = "Filters out chemicals by their NTDB ID." + id = "plumb_filter" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 15 + build_path = /obj/machinery/plumbing/filter + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_synth + name = "Plumbing Synthesizer" + desc = "Using standard mass-energy dynamic autoconverters, generates reagents from power and puts them in a pipe." + id = "plumb_synth" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/plastic = 1000) + construction_time = 15 + build_path = /obj/machinery/plumbing/synthesizer + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_grinder + name = "Plumbing-Linked Autogrinder" + desc = "Automatically extracts reagents from an item by grinding it. Think of the possibilities! Note: does not grind people." + id = "plumb_grinder" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500) + construction_time = 15 + build_path = /obj/machinery/plumbing/grinder_chemical + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/reaction_chamber + name = "Plumbing Reaction Chamber" + desc = "You can set a list of allowed reagents and amounts. Once the chamber has these reagents, will let the products through." + id = "reaction_chamber" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 15 + build_path = /obj/machinery/plumbing/reaction_chamber + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/duct_print + name = "Plumbing Ducts" + desc = "Ducts for plumbing! Now lathed for efficiency." + id = "duct_print" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 400) + construction_time = 1 + build_path = /obj/item/stack/ducts + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_splitter + name = "Plumbing Chemical Splitter" + desc = "A splitter. Has 2 outputs. Can be configured to allow a certain amount through each side." + id = "plumb_splitter" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 750, /datum/material/glass = 250) + construction_time = 15 + build_path = /obj/machinery/plumbing/splitter + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/pill_press + name = "Plumbing Automatic Pill Former" + desc = "Automatically forms pills to the required parameters with piped reagents! A good replacement for those lazy, useless chemists." + id = "pill_press" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 15 + build_path = /obj/machinery/plumbing/pill_press + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_pump + name = "Liquid Extraction Pump" + desc = "Use it for extracting liquids from lavaland's geysers!" + id = "plumb_pump" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500) + construction_time = 15 + build_path = /obj/machinery/plumbing/liquid_pump + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_in + name = "Plumbing Input Device" + desc = "A big piped funnel for putting stuff in the pipe network." + id = "plumb_in" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 400, /datum/material/glass = 400) + construction_time = 15 + build_path = /obj/machinery/plumbing/input + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_out + name = "Plumbing Output Device" + desc = "A big piped funnel for taking stuff out of the pipe network." + id = "plumb_out" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 400, /datum/material/glass = 400) + construction_time = 15 + build_path = /obj/machinery/plumbing/output + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_tank + name = "Plumbed Storage Tank" + desc = "A tank for storing plumbed reagents." + id = "plumb_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 10000, /datum/material/glass = 10000, /datum/material/plastic = 4000) + construction_time = 15 + build_path = /obj/machinery/plumbing/tank + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plumb_rcd + name = "Plumbed Autoconstruction Device" + desc = "A RCD for plumbing machines! Cannot make ducts." + id = "plumb_rcd" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 20000, /datum/material/glass = 10000, /datum/material/plastic = 20000, /datum/material/titanium = 2000, /datum/material/diamond = 800, /datum/material/gold = 2000, /datum/material/silver = 2000) + construction_time = 150 + build_path = /obj/item/construction/plumbing + category = list("Misc","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/nanites/extra_settings/text.dm b/code/modules/research/nanites/extra_settings/text.dm index 56aa3dd07f..d3cad27bcf 100644 --- a/code/modules/research/nanites/extra_settings/text.dm +++ b/code/modules/research/nanites/extra_settings/text.dm @@ -10,6 +10,9 @@ /datum/nanite_extra_setting/text/get_copy() return new /datum/nanite_extra_setting/text(value) +/datum/nanite_extra_setting/text/get_value() + return html_encode(value) + /datum/nanite_extra_setting/text/get_frontend_list(name) return list(list( "name" = name, diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index 3b0d6d0d06..d2aa243fee 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -176,7 +176,7 @@ sent_message = message_setting.get_value() if(host_mob.stat == DEAD) return - to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[sent_message]\"") + to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[html_encode(sent_message)]\"") /datum/nanite_program/comm/hallucination name = "Hallucination" diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 3a9e654b81..150e420c09 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -24,6 +24,23 @@ design_ids = list("defib_decay", "defib_shock", "defib_heal", "defib_speed") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) +/datum/techweb_node/plumbing + id = "plumbing" + display_name = "Reagent Plumbing Technology" + description = "Plastic tubes, and machinery used for manipulating things in them." + prereq_ids = list("base") + design_ids = list("acclimator", "disposer", "plumb_filter", "plumb_synth", "plumb_grinder", "reaction_chamber", "duct_print", "plumb_splitter", "pill_press", "plumb_pump", "plumb_in", "plumb_out", "plumb_tank", "medipen_refiller") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) + + +/datum/techweb_node/advplumbing + id = "advplumbing" + display_name = "Advanced Plumbing Technology" + description = "Plumbing RCD." + prereq_ids = list("plumbing", "adv_engi") + design_ids = list("plumb_rcd", "autohydrotray") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + //////////////////////Cybernetics///////////////////// /datum/techweb_node/surplus_limbs diff --git a/code/modules/ruins/spaceruin_code/clericsden.dm b/code/modules/ruins/spaceruin_code/clericsden.dm index 7d1fda6740..3fe4cad794 100644 --- a/code/modules/ruins/spaceruin_code/clericsden.dm +++ b/code/modules/ruins/spaceruin_code/clericsden.dm @@ -21,7 +21,6 @@ desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke." icon_state = "proteon" icon_living = "proteon" - threat = 0.4 maxHealth = 35 health = 35 melee_damage_lower = 8 diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index f5a11db60f..b3d99f22ab 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He . = ..() internal_shuttle_creator = new() internal_shuttle_creator.owner_rsd = src + desc += " Attention, the max size of the shuttle is [SHUTTLE_CREATOR_MAX_SIZE]." overlay_holder = new() /obj/item/shuttle_creator/Destroy() @@ -237,13 +238,13 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He port.register() - icon_state = "rsd_used" + icon_state = "rsd_empty" //Clear highlights overlay_holder.clear_highlights() GLOB.custom_shuttle_count ++ - message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") - log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles, limit is [CUSTOM_SHUTTLE_LIMIT])") + message_admins("[ADMIN_LOOKUPFLW(user)] created a new shuttle with a [src] at [ADMIN_VERBOSEJMP(user)] ([GLOB.custom_shuttle_count] custom shuttles)") + log_game("[key_name(user)] created a new shuttle with a [src] at [AREACOORD(user)] ([GLOB.custom_shuttle_count] custom shuttles)") return TRUE /obj/item/shuttle_creator/proc/create_shuttle_area(mob/user) @@ -350,7 +351,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He loggedOldArea = get_area(get_turf(user)) loggedTurfs |= turfs overlay_holder.highlight_area(turfs) - //TODO READD THIS SHIT: icon_state = "rsd_used" + //TODO READD THIS SHIT: icon_state = "rsd_empty" to_chat(user, "You add the area into the buffer of the [src], you made add more areas or select an airlock to act as a docking port to complete the shuttle.") return turfs diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm index 59826daf07..9d6d71a89f 100644 --- a/code/modules/spells/spell_types/taeclowndo.dm +++ b/code/modules/spells/spell_types/taeclowndo.dm @@ -42,6 +42,8 @@ return . = ..() + if(!.) + return new /obj/item/grown/bananapeel(target) /obj/effect/proc_holder/spell/aimed/banana_peel/update_icon() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 3d88282937..e90f86bf1c 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -598,7 +598,7 @@ var/datum/species/S = H.dna.species base_bp_icon = S?.icon_limbs || DEFAULT_BODYPART_ICON - species_id = S.limbs_id + species_id = S.mutant_bodyparts["limbs_id"] species_flags_list = H.dna.species.species_traits //body marking memes @@ -613,7 +613,6 @@ if(S.use_skintones) skin_tone = H.skin_tone - base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon else skin_tone = "" @@ -626,13 +625,9 @@ species_color = S.fixed_mut_color else species_color = H.dna.features["mcolor"] - base_bp_icon = (base_bp_icon == DEFAULT_BODYPART_ICON) ? DEFAULT_BODYPART_ICON_ORGANIC : base_bp_icon else species_color = "" - if(base_bp_icon != DEFAULT_BODYPART_ICON) - color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE) - if(S.mutant_bodyparts["legs"]) if(body_zone == BODY_ZONE_L_LEG || body_zone == BODY_ZONE_R_LEG) if(DIGITIGRADE in S.species_traits) @@ -652,11 +647,16 @@ body_markings = "plain" aux_marking = "plain" markings_color = list(colorlist) - else body_markings = null aux_marking = null + if(species_id in GLOB.greyscale_limb_types) //should they have greyscales? + base_bp_icon = DEFAULT_BODYPART_ICON_ORGANIC + + if(base_bp_icon != DEFAULT_BODYPART_ICON) + color_src = mut_colors ? MUTCOLORS : ((H.dna.skin_tone_override && S.use_skintones == USE_SKINTONES_GRAYSCALE_CUSTOM) ? CUSTOM_SKINTONE : SKINTONE) + if(!dropping_limb && H.dna.check_mutation(HULK)) mutation_color = "00aa00" else diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 049fc5b5d4..9172ce00bc 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -265,6 +265,10 @@ var/C = input(owner, "Select Color", "Select color", "#ffffff") as color|null if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user) return + var/list/hsv = ReadHSV(RGBtoHSV(C)) + if(hsv[2] > 125) + to_chat(user, "A color that saturated? Surely not!") + return var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num if(!isnum(range)) return @@ -396,4 +400,4 @@ #undef BLURRY_VISION_ONE #undef BLURRY_VISION_TWO -#undef BLIND_VISION_THREE \ No newline at end of file +#undef BLIND_VISION_THREE diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm index a43e3fc2ce..58cb43996d 100644 --- a/code/modules/uplink/uplink_items/uplink_dangerous.dm +++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm @@ -177,6 +177,7 @@ organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host." item = /obj/item/storage/box/syndie_kit/guardian cost = 15 + limited_stock = 1 // you can only have one holopara apparently? refundable = TRUE cant_discount = TRUE surplus = 0 diff --git a/code/modules/uplink/uplink_items/uplink_explosives.dm b/code/modules/uplink/uplink_items/uplink_explosives.dm index 6cc1c9fe05..f44966fb3b 100644 --- a/code/modules/uplink/uplink_items/uplink_explosives.dm +++ b/code/modules/uplink/uplink_items/uplink_explosives.dm @@ -80,6 +80,7 @@ item = /obj/item/cartridge/virus/syndicate cost = 5 restricted = TRUE + limited_stock = 1 /datum/uplink_item/explosives/emp name = "EMP Grenades and Implanter Kit" diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index dc4f4e9273..a78a4e6ef4 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -36,6 +36,7 @@ /obj/item/clothing/under/misc/keyholesweater = 2, /obj/item/clothing/under/misc/stripper/mankini = 2, /obj/item/clothing/under/costume/jabroni = 2, + /obj/item/clothing/gloves/evening/black = 2, /obj/item/dildo/flared/huge = 3 ) premium = list( diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 34de3b490c..795d35adc4 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -46,7 +46,8 @@ /obj/item/wrench/medical = 1, /obj/item/storage/belt/medolier/full = 2, /obj/item/gun/syringe/dart = 2, - /obj/item/storage/briefcase/medical = 2) + /obj/item/storage/briefcase/medical = 2, + /obj/item/plunger/reinforced = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF diff --git a/html/changelog.html b/html/changelog.html index 43bac219ab..edaf74afca 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,203 @@ -->
+

28 August 2020

+

EmeraldSundisk updated:

+
    +
  • Adds more paper to the library
  • +
  • The law office now has a desk window
  • +
  • Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding areas to accommodate this.
  • +
  • Updates some of CogStation's paperwork
  • +
  • The rat in the morgue turned themselves into a possum. Funniest shit I've ever seen.
  • +
  • Adjusts some area designations so cameras should receive power properly
  • +
  • Cleans up an errant decal
  • +
+

Hatterhat updated:

+
    +
  • Traitor holoparasites can now only be bought once, because apparently you can only have one active holopara.
  • +
  • PDA bombs can now only be bought once per uplink.
  • +
+

lolman360 updated:

+
    +
  • atmos = radiation = chemistry.
  • +
+

shellspeed1 updated:

+
    +
  • Adds slow mode for iv drips
  • +
+

timothyteakettle updated:

+
    +
  • an ancient game over a thousand years old has re-emerged among crewmembers - rock paper scissors
  • +
  • customization features appear in alphabetical order where necessary
  • +
  • bokken do two more stamina damage now
  • +
  • you can now choose a body sprite as an anthromorph or anthromorphic insect, and can choose from aquatic/avian and apid respectively (and obviously back to the defaults too)
  • +
+ +

27 August 2020

+

silicons updated:

+
    +
  • eyebeam lighting can only have 128 maximum HSV saturation now.
  • +
  • no more shotgun stripper clips in boxes.
  • +
  • goliath tentacles now do 20 damage to mechs at 25% ap
  • +
+

timothyteakettle updated:

+
    +
  • changing your character's gender won't randomize its hairstyle and facial hairstyle now
  • +
+ +

26 August 2020

+

ancientpower updated:

+
    +
  • Ghosts can read newscasters by clicking on them.
  • +
+

silicons updated:

+
    +
  • hierophant vortex blasts now have 50% armor penetration vs mecha
  • +
  • ventcrawling now kicks off every attached/buckled mob, even for non humans.
  • +
+ +

25 August 2020

+

Hatterhat updated:

+
    +
  • Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
  • +
+

Literallynotpickles updated:

+
    +
  • You can now equip handheld crew monitors on all medical-related winter coats.
  • +
+

Putnam3145 updated:

+
    +
  • vore now ejects occupants on death
  • +
+

raspy-on-osu updated:

+
    +
  • Thermoelectric Generator power output
  • +
+

timothyteakettle updated:

+
    +
  • I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
  • +
+ +

24 August 2020

+

MrJWhit updated:

+
    +
  • Fixes areas on expanded airlocks
  • +
+

silicons updated:

+
    +
  • wormhole jaunters work
  • +
  • wormhole jaunters no longer get interference from bags of holding
  • +
  • airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
  • +
+

timothyteakettle updated:

+
    +
  • three new items are in the loadout for all donators
  • +
+

zeroisthebiggay updated:

+
    +
  • contraband black evening gloves in kinkvend
  • +
+ +

23 August 2020

+

DeltaFire15 updated:

+
    +
  • silicons and clockies can now access APCs properly
  • +
+

EmeraldSundisk updated:

+
    +
  • Medbay now has a smartfridge for organ storage
  • +
  • Slight enhancements to the station's electrical wiring layout
  • +
  • Very small library renovation
  • +
  • Exterior airlocks have been given proper air systems for safety's sake
  • +
+

Ghommie updated:

+
    +
  • Stops shielded hardsuits from slowly turning the wearer into a big glowing ball of stacked energy shield overlays.
  • +
  • the shielding overlay is merely visual as result. Aim your clicks.
  • +
+

Ludox235 updated:

+
    +
  • no more 10 pop xenos (25pop now)
  • +
+

MrJWhit updated:

+
    +
  • Increases the majority of airlocks by 1 tile.
  • +
  • Minor adjustments to the TEG engine.
  • +
+

Putnam3145 updated:

+
    +
  • Simplemobs no longer count in dynamic.
  • +
  • "Story" storyteller no longer starts at a ludicrously low threat, always.
  • +
  • Blob threat now scales with coverage.
  • +
  • One person with their pref on no longer overpowers 40 people who might not even know there is one.
  • +
  • Negative-weight rulesets are no longer put into the list.
  • +
+

kiwedespars updated:

+
    +
  • removed durathread from armwraps recipe.
  • +
+

lolman360 updated:

+
    +
  • breath mask balaclava
  • +
+

timothyteakettle updated:

+
    +
  • lizards are now a recommended species for mam snouts
  • +
+

zeroisthebiggay updated:

+
    +
  • new sprites for the temporal katana
  • +
  • suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
  • +
  • twilight isnt earrape
  • +
+ +

22 August 2020

+

Time-Green (copypasta'd by lolman360) updated:

+
    +
  • plumbing
  • +
  • automatic hydro trays
  • +
+ +

21 August 2020

+

LetterN updated:

+
    +
  • Updates and adds some of the tips
  • +
+

Putnam3145 updated:

+
    +
  • added reftracking as a compile flag
  • +
+

SmArtKar updated:

+
    +
  • RSD limitation is now 500 tiles
  • +
  • Fixed broken RSD sprites
  • +
  • Removed that shuttle limit
  • +
+

timothyteakettle updated:

+
    +
  • two snouts can once again be chosen in customization
  • +
  • lizard snouts work again
  • +
+ +

20 August 2020

+

DeltaFire15 updated:

+
    +
  • The cooking oil damage formula is no longer scuffed.
  • +
  • Changed the clockie help-link to lead to our own wiki.
  • +
+

Fikou updated:

+
    +
  • admins can now do html in ahelps properly
  • +
+

Hatterhat updated:

+
    +
  • Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
  • +
+

tiramisuapimancer updated:

+
    +
  • Ethereal hair is now their body color instead of accidentally white
  • +
+

18 August 2020

DeltaFire15 updated:

    @@ -1280,160 +1477,6 @@
    • support for custom blood colours implemented, slimes blood colour now equivalent to their body colour
    - -

    27 June 2020

    -

    Detective-Google updated:

    -
      -
    • Lying down is better
    • -
    -

    timothyteakettle updated:

    -
      -
    • felinids now nya when tabled
    • -
    - -

    26 June 2020

    -

    Ghommie updated:

    -
      -
    • Snore spam.
    • -
    • Hostile mobs shouldn't hit their original spawner structures or thoses of the same faction.
    • -
    -

    silicons updated:

    -
      -
    • soap cleans blood again
    • -
    - -

    25 June 2020

    -

    Anonymous updated:

    -
      -
    • Added kepi and orvilike kepi. Available through loadout.
    • -
    -

    Detective Google updated:

    -
      -
    • Medigygax
    • -
    -

    Detective-Google updated:

    -
      -
    • malf AIs can no longer yeet the station while shunted
    • -
    • SMESes can now properly use self charging cells
    • -
    • ghosts now show up when the round ends
    • -
    • away missions
    • -
    -

    Funce updated:

    -
      -
    • Mentor SQL queries are now deleted properly.
    • -
    -

    Linzolle updated:

    -
      -
    • analyze function on chem master is no longer broken
    • -
    • organs now decay inside dead bodies again
    • -
    -

    dapnee updated:

    -
      -
    • wataur bottle item
    • -
    • wataur bottle and overlay
    • -
    - -

    24 June 2020

    -

    DeltaFire15 updated:

    -
      -
    • Choosing a random item in your uplink will no longer sometimes reroll your contract.
    • -
    • Syndicate crate event cannot fire as a random event anymore.
    • -
    -

    Detective-Google updated:

    -
      -
    • singulos no longer succ infinite rods out of the ice
    • -
    • one of the directions for the diag hudpatch was blu instead of orang
    • -
    -

    timothyteakettle updated:

    -
      -
    • bonfires/grills no longer produce infinite quantities of food
    • -
    • slime's alter form ability now updates their hair colour when changing their body colour
    • -
    - -

    22 June 2020

    -

    Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:

    -
      -
    • Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
    • -
    • Added single-order options for several existing products in the Cargo Catalog.
    • -
    • Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
    • -
    • You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
    • -
    • Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
    • -
    • Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
    • -
    -

    kevinz000 updated:

    -
      -
    • Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
    • -
    -

    shellspeed1 updated:

    -
      -
    • Adds IV bags.
    • -
    - -

    21 June 2020

    -

    kevinz000 updated:

    -
      -
    • calculations for punch hit chance has been drastically buffed in favor of the attacker.
    • -
    - -

    20 June 2020

    -

    LetterN updated:

    -
      -
    • Asset cache from tg
    • -
    • Made the map viewer not look bad
    • -
    • Admin matrix right-bracket
    • -
    -

    bunny232 updated:

    -
      -
    • Removed unsavory things from the vent clog event
    • -
    - -

    19 June 2020

    -

    Bhijn updated:

    -
      -
    • Atmos can no longer become completely bricked
    • -
    -

    Funce updated:

    -
      -
    • Square root circuit should now actually work.
    • -
    -

    SmArtKar updated:

    -
      -
    • Fixed my runtimes
    • -
    -

    TheSpaghetti updated:

    -
      -
    • more insectoid insects
    • -
    -

    kevinz000 updated:

    -
      -
    • bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
    • -
    -

    timothyteakettle updated:

    -
      -
    • Adds the brain trauma event, where one player gets a random brain trauma!
    • -
    • Adds the wisdom cow event, where the wisdom cow appears on the station!
    • -
    • Adds the fake virus event, where people get fake virus symptoms.
    • -
    • Adds the stray cargo pod event, where a cargo pod crashes into the station.
    • -
    • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
    • -
    - -

    18 June 2020

    -

    Detective-Google updated:

    -
      -
    • cog is now less the suck
    • -
    • couple little derpy bits
    • -
    • malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
    • -
    -

    SmArtKar updated:

    -
      -
    • Ported shuttles from beestation
    • -
    -

    timothyteakettle updated:

    -
      -
    • embeds got reworked, sticky tape was added, more bullets that ricochet also added
    • -
    • medbots can now be tipped over
    • -
    • added more medbot sounds
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f8749c8dc5..139ca99af0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26998,3 +26998,132 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - refactor: snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter - tweak: meat type and horns can now be selected by any species +2020-08-20: + DeltaFire15: + - bugfix: The cooking oil damage formula is no longer scuffed. + - tweak: Changed the clockie help-link to lead to our own wiki. + Fikou: + - admin: admins can now do html in ahelps properly + Hatterhat: + - balance: Pirate threats are now announced as "business propositions", and their + arrivals are now also announced properly. + tiramisuapimancer: + - bugfix: Ethereal hair is now their body color instead of accidentally white +2020-08-21: + LetterN: + - rscadd: Updates and adds some of the tips + Putnam3145: + - admin: added reftracking as a compile flag + SmArtKar: + - tweak: RSD limitation is now 500 tiles + - bugfix: Fixed broken RSD sprites + - config: Removed that shuttle limit + timothyteakettle: + - bugfix: two snouts can once again be chosen in customization + - bugfix: lizard snouts work again +2020-08-22: + Time-Green (copypasta'd by lolman360): + - rscadd: plumbing + - rscadd: automatic hydro trays +2020-08-23: + DeltaFire15: + - bugfix: silicons and clockies can now access APCs properly + EmeraldSundisk: + - rscadd: Medbay now has a smartfridge for organ storage + - rscadd: Slight enhancements to the station's electrical wiring layout + - rscadd: Very small library renovation + - bugfix: Exterior airlocks have been given proper air systems for safety's sake + Ghommie: + - bugfix: Stops shielded hardsuits from slowly turning the wearer into a big glowing + ball of stacked energy shield overlays. + - tweak: the shielding overlay is merely visual as result. Aim your clicks. + Ludox235: + - tweak: no more 10 pop xenos (25pop now) + MrJWhit: + - tweak: Increases the majority of airlocks by 1 tile. + - tweak: Minor adjustments to the TEG engine. + Putnam3145: + - balance: Simplemobs no longer count in dynamic. + - balance: '"Story" storyteller no longer starts at a ludicrously low threat, always.' + - balance: Blob threat now scales with coverage. + - tweak: One person with their pref on no longer overpowers 40 people who might + not even know there is one. + - bugfix: Negative-weight rulesets are no longer put into the list. + kiwedespars: + - tweak: removed durathread from armwraps recipe. + lolman360: + - rscadd: breath mask balaclava + timothyteakettle: + - bugfix: lizards are now a recommended species for mam snouts + zeroisthebiggay: + - rscadd: new sprites for the temporal katana + - rscadd: suiciding with the temporal katana omae wa mou shinderius you into the + shadow realm + - soundadd: twilight isnt earrape +2020-08-24: + MrJWhit: + - bugfix: Fixes areas on expanded airlocks + silicons: + - bugfix: wormhole jaunters work + - tweak: wormhole jaunters no longer get interference from bags of holding + - bugfix: airlocks now only shock on pulse/wirecutters instead of on tgui panel + open. + timothyteakettle: + - rscadd: three new items are in the loadout for all donators + zeroisthebiggay: + - rscadd: contraband black evening gloves in kinkvend +2020-08-25: + Hatterhat: + - rscadd: Insidious combat gloves have been replaced by insidious guerilla gloves. + They're generally the same, except now you can tackle with them. + Literallynotpickles: + - tweak: You can now equip handheld crew monitors on all medical-related winter + coats. + Putnam3145: + - tweak: vore now ejects occupants on death + raspy-on-osu: + - tweak: Thermoelectric Generator power output + timothyteakettle: + - tweak: I.P.Cs now short their circuits when expressing emotion, causing sparks + to appear around them. +2020-08-26: + ancientpower: + - tweak: Ghosts can read newscasters by clicking on them. + silicons: + - balance: hierophant vortex blasts now have 50% armor penetration vs mecha + - balance: ventcrawling now kicks off every attached/buckled mob, even for non humans. +2020-08-27: + silicons: + - tweak: eyebeam lighting can only have 128 maximum HSV saturation now. + - balance: no more shotgun stripper clips in boxes. + - balance: goliath tentacles now do 20 damage to mechs at 25% ap + timothyteakettle: + - tweak: changing your character's gender won't randomize its hairstyle and facial + hairstyle now +2020-08-28: + EmeraldSundisk: + - rscadd: Adds more paper to the library + - rscadd: The law office now has a desk window + - tweak: Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding + areas to accommodate this. + - tweak: Updates some of CogStation's paperwork + - tweak: The rat in the morgue turned themselves into a possum. Funniest shit I've + ever seen. + - bugfix: Adjusts some area designations so cameras should receive power properly + - bugfix: Cleans up an errant decal + Hatterhat: + - tweak: Traitor holoparasites can now only be bought once, because apparently you + can only have one active holopara. + - balance: PDA bombs can now only be bought once per uplink. + lolman360: + - rscadd: atmos = radiation = chemistry. + shellspeed1: + - rscadd: Adds slow mode for iv drips + timothyteakettle: + - rscadd: an ancient game over a thousand years old has re-emerged among crewmembers + - rock paper scissors + - tweak: customization features appear in alphabetical order where necessary + - tweak: bokken do two more stamina damage now + - rscadd: you can now choose a body sprite as an anthromorph or anthromorphic insect, + and can choose from aquatic/avian and apid respectively (and obviously back + to the defaults too) diff --git a/html/changelogs/AutoChangeLog-pr-13194.yml b/html/changelogs/AutoChangeLog-pr-13194.yml deleted file mode 100644 index 8769abd6d5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13194.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - tweak: "Changed the clockie help-link to lead to our own wiki." diff --git a/html/changelogs/AutoChangeLog-pr-13202.yml b/html/changelogs/AutoChangeLog-pr-13202.yml deleted file mode 100644 index 8713ea2bd9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13202.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tiramisuapimancer" -delete-after: True -changes: - - bugfix: "Ethereal hair is now their body color instead of accidentally white" diff --git a/html/changelogs/AutoChangeLog-pr-13207.yml b/html/changelogs/AutoChangeLog-pr-13207.yml deleted file mode 100644 index 9f354f34bb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - admin: "admins can now do html in ahelps properly" diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 9490595484..8594af8ec2 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 52ef75020c..4ac82ca299 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 916686e63f..60978d55a2 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 989ec8049c..794074bfe4 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 0ca36ad43d..23d80af9ef 100644 Binary files a/icons/mob/inhands/weapons/swords_lefthand.dmi and b/icons/mob/inhands/weapons/swords_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/swords_righthand.dmi b/icons/mob/inhands/weapons/swords_righthand.dmi index 59d7bbce69..702c0299b5 100644 Binary files a/icons/mob/inhands/weapons/swords_righthand.dmi and b/icons/mob/inhands/weapons/swords_righthand.dmi differ diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi index ace37b1f17..4523403344 100644 Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ diff --git a/icons/obj/guns/projectile.dmi b/icons/obj/guns/projectile.dmi index 9c6df36f49..00670916db 100644 Binary files a/icons/obj/guns/projectile.dmi and b/icons/obj/guns/projectile.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 57105cc089..c5aca2394f 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/lavaland/terrain.dmi b/icons/obj/lavaland/terrain.dmi new file mode 100644 index 0000000000..4db51145ee Binary files /dev/null and b/icons/obj/lavaland/terrain.dmi differ diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi new file mode 100644 index 0000000000..300d218d2d Binary files /dev/null and b/icons/obj/machines/medipen_refiller.dmi differ diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/plumbing/fluid_ducts.dmi new file mode 100644 index 0000000000..87d9d2233b Binary files /dev/null and b/icons/obj/plumbing/fluid_ducts.dmi differ diff --git a/icons/obj/plumbing/plumbers.dmi b/icons/obj/plumbing/plumbers.dmi new file mode 100644 index 0000000000..242622e000 Binary files /dev/null and b/icons/obj/plumbing/plumbers.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 4a299f29dd..2b64176878 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 378c70d187..06783df03d 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -7,6 +7,27 @@ category = LOADOUT_CATEGORY_DONATOR ckeywhitelist = list("This entry should never appear with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard +/datum/gear/donator/pet + name = "Pet Beacon" + slot = SLOT_IN_BACKPACK + path = /obj/item/choice_beacon/pet + ckeywhitelist = list() + donator_group_id = DONATOR_GROUP_TIER_1 // can be accessed by all donators + +/datum/gear/donator/carpet + name = "Carpet Beacon" + slot = SLOT_IN_BACKPACK + path = /obj/item/choice_beacon/box/carpet + ckeywhitelist = list() + donator_group_id = DONATOR_GROUP_TIER_1 + +/datum/gear/donator/chameleon_bedsheet + name = "Chameleon Bedsheet" + slot = SLOT_NECK + path = /obj/item/bedsheet/chameleon + ckeywhitelist = list() + donator_group_id = DONATOR_GROUP_TIER_1 + /datum/gear/donator/donortestingbikehorn name = "Donor item testing bikehorn" slot = SLOT_IN_BACKPACK diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm index ffa4724f63..09694ddec7 100644 --- a/modular_citadel/code/modules/client/loadout/gloves.dm +++ b/modular_citadel/code/modules/client/loadout/gloves.dm @@ -9,6 +9,10 @@ /datum/gear/gloves/evening name = "Evening gloves" path = /obj/item/clothing/gloves/evening + +/datum/gear/gloves/midnight + name = "Midnight gloves" + path = /obj/item/clothing/gloves/evening/black /datum/gear/gloves/goldring name = "A gold ring" diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm index 20917c4ba5..4829fd921c 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/handguns.dm @@ -16,13 +16,12 @@ spread = 20 actions_types = list() -/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon() - ..() +/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_overlays() + . = ..() if(magazine) - cut_overlays() - add_overlay("foamsp-magazine") - else - cut_overlays() + . += "foamsp-magazine" + +/obj/item/gun/ballistic/automatic/toy/pistol/stealth/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" /////////RAYGUN MEMES///////// diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm index 8a1310d2f1..c2bf251de9 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/rifles.dm @@ -155,11 +155,15 @@ casing_ejector = 0 spread = 10 recoil = 0.05 + automatic_burst_overlay = FALSE + var/magtype = "flechettegun" -/obj/item/gun/ballistic/automatic/flechette/update_icon() - cut_overlays() +/obj/item/gun/ballistic/automatic/flechette/update_overlays() + . = ..() if(magazine) - add_overlay("flechettegun-magazine") + . += "[magtype]-magazine" + +/obj/item/gun/ballistic/automatic/flechette/update_icon_state() icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" ///unique variant/// @@ -185,12 +189,7 @@ w_class = WEIGHT_CLASS_SMALL spread = 15 recoil = 0.1 - -/obj/item/gun/ballistic/automatic/flechette/shredder/update_icon() - cut_overlays() - if(magazine) - add_overlay("shreddergun-magazine") - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + magtype = "shreddergun" /*///////////////////////////////////////////////////////////// //////////////////////// Zero's Meme ////////////////////////// @@ -218,17 +217,19 @@ burst_size = 4 //Shh. fire_delay = 1 var/body_color = "#3333aa" + automatic_burst_overlay = FALSE -/obj/item/gun/ballistic/automatic/AM4B/update_icon() - ..() +/obj/item/gun/ballistic/automatic/AM4B/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +/obj/item/gun/ballistic/automatic/AM4B/update_overlays() + . = ..() var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "AM4-Body") if(body_color) body_overlay.color = body_color - cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other - add_overlay(body_overlay) - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() + . += body_overlay + /obj/item/gun/ballistic/automatic/AM4B/AltClick(mob/living/user) . = ..() if(!in_range(src, user)) //Basic checks to prevent abuse diff --git a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm index 3c0a47bfd7..c4cf8fc00f 100644 --- a/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm +++ b/modular_citadel/code/modules/projectiles/guns/ballistic/spinfusor.dm @@ -55,8 +55,7 @@ /obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor -/obj/item/gun/ballistic/automatic/spinfusor/update_icon() - ..() +/obj/item/gun/ballistic/automatic/spinfusor/update_icon_state() icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" /obj/item/ammo_box/aspinfusor diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm index 49d48e0000..65609f5830 100644 --- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm @@ -14,16 +14,16 @@ obj/item/gun/energy/e_gun/cx flight_y_offset = 10 var/body_color = "#252528" -obj/item/gun/energy/e_gun/cx/update_icon() - ..() +obj/item/gun/energy/e_gun/cx/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +obj/item/gun/energy/e_gun/cx/update_overlays() + . = ..() var/mutable_appearance/body_overlay = mutable_appearance('modular_citadel/icons/obj/guns/cit_guns.dmi', "cxegun_body") if(body_color) body_overlay.color = body_color - add_overlay(body_overlay) - - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() + . += body_overlay obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user) . = ..() diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm index b864a9fe25..e81c7c18d3 100644 --- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm +++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm @@ -52,13 +52,13 @@ if(has_shot) recharge_newshot(TRUE) -/obj/item/gun/energy/pumpaction/update_icon() //adds racked indicators +/obj/item/gun/energy/pumpaction/update_overlays() //adds racked indicators ..() var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] if(chambered) - add_overlay("[icon_state]_rack_[shot.select_name]") + . += "[icon_state]_rack_[shot.select_name]" else - add_overlay("[icon_state]_rack_empty") + . += "[icon_state]_rack_empty" /obj/item/gun/energy/pumpaction/proc/pump(mob/M) //pumping proc. Checks if the gun is empty and plays a different sound if it is. var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index] diff --git a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi b/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi deleted file mode 100644 index c8d5ceb0a6..0000000000 Binary files a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi and /dev/null differ diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi deleted file mode 100644 index 6098dd3567..0000000000 Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and /dev/null differ diff --git a/sound/music/twilight.ogg b/sound/music/twilight.ogg index 74b811b3e5..635663314d 100644 Binary files a/sound/music/twilight.ogg and b/sound/music/twilight.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index a1d2befab3..5dc4e1b985 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -25,7 +25,7 @@ As the Captain, you have absolute access and control over the station, but this As the Captain, you have a fancy pen that can be used as a holdout dagger or even as a scalpel in surgery! As the Captain, you can purchase a new emergency shuttle using a communications console. Some require credits, while others give you credits in exchange. Keep in mind that purchasing dangerous shuttles will incur the ire of your crew. As the Chief Medical Officer, your hypospray is like the ones that your Medical Doctors can buy, except it comes in a fancy box that can hold several more hypovials than the standard, and already comes preloaded with specially-made high-capacity hypovials that hold double the reagents the standard ones do. -As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and geneticists during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. +As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and paramedics during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. As a Medical Doctor, pester Research for improved surgical tools. They work faster, combine the purposes of several tools in one (scalpel/saw, retractor/hemostat, drill/cautery), and don't cost many materials to boot! As a Medical Doctor, the surgical saw and drill are both powerful weapons, the saw is sharp and can slice and dice, while the drill can quickly blind someone if aimed for the eyes. The laser scalpel is an upgraded version producible with Research's aid, and it has the highest force of most common place weapons, while still remaining sharp. As a Medical Doctor, your belt can hold a full set of surgical tools. Using sterilizine before each attempt during surgery will reduce your failure chance on tricky steps or when using less-than-optimal equipment. @@ -34,11 +34,14 @@ As a Medical Doctor, while both heal toxin damage, the difference between charco As a Medical Doctor, you can surgically implant or extract things from people's chests by performing a cavity implant. This could range from inserting a suicide bomb to embedding the nuke disk into the Captain's chest. As a Medical Doctor, it's of utmost urgency that you tend to anyone who's been hugged by a facehugger. You only have a couple of minutes from the initial attachment to perform organ manipulation to their chest and remove the rapidly developing alien embryo before it bursts out and immediately kills your patient. As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. Using disarm attempt will intentionally fail the surgery step. -As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and aren't usually revivable or cloneable. However it may prove useful to be creative in your revivification techniques with these bodies. +As a Medical Doctor, corpses with the "...and their soul has departed" description no longer have a ghost attached to them and can't be revived. However it may prove useful to be creative in your revivification techniques with these bodies. As a Medical Doctor, treating plasmamen is not impossible! Salbutamol and epinephrine stops them from suffocating due to lack of internals and showers stop them from burning alive. You can even perform surgery on them by doing the procedure on a roller bed under a shower. As a Medical Doctor, you can point your penlight at people to create a medical hologram. This lets them know that you're coming to treat them. As a Medical Doctor, you can extract implants by holding an empty implant case in your offhand while performing the extraction step. As a Medical Doctor, clone scanning people will implant them with a health tracker that displays their vitals in the clone records. Useful to check on crew members that didn't activate suit sensors! +As a Medical Doctor, you can deal with patients who have absurd amounts of wounds by putting them in cryo. This will slowly treat all of their wounds simultaneously, but is much slower than direct treatment. +As a Medical Doctor, Critical Slash wounds are one of the most dangerous conditions someone can have. Apply gauze, epipens, sutures, cauteries, whatever you can, as soon as possible! +As a Medical Doctor, Saline-Glucose not only acts as a temporary boost to a patient's blood level, it also speeds regeneration! Perfect for drained patients! As a Medical Doctor, medical gauze is an incredibly underrated tool. It can be used to entirely halt a limb from bleeding or sling one that's been shattered until it can be given proper attention. This even works on the dead, too! Be sure to stop someone's bleeding whether they're in critical condition or a corpse, as dragging someone whom is bleeding will rapidly deplete them of all their blood. As a Chemist, there are dozens of chemicals that can heal, and even more that can cause harm. See which chemicals have the best synergy, both in healing, and in harming. Experiment! As a Chemist, some chemicals can only be synthesized by heating up the contents in the chemical heater. @@ -135,10 +138,10 @@ As a Security Officer, examining someone while wearing your security HUDglasses As a Security Officer, you can take out the power cell on your baton to replace it with a better or fully charged one. Just use a screwdriver on your baton to remove the old cell. As a Security Officer, you can just about any firearm on your vest, this even works with other non-standard armor-substitutes like security winter coats! As the Detective, people leave fingerprints everywhere and on everything. With the exception of white latex, gloves will hide them. All is not lost, however, as gloves leave fibers specific to their kind such as black or nitrile, pointing to a general department. -As the Detective, you can use your forensics scanner from a distance. +As the Detective, you can use your forensics scanner from a distance. Use this to scan boxes or other storage containers. As the Detective, your revolver can be loaded with .357 ammunition. Use a screwdriver to permanently modify your revolver into using this type of ammunition, be warned however, firing it has a decent chance to cause the revolver to misfire and shoot you in the foot. As the Lawyer, try to negotiate with the Warden if sentences seem too high for the crime. -As the Lawyer, you can try to convince the captain and Head of Security to hold trials for prisoners in the courtroom. +As the Lawyer, you can try to convince the Captain and Head of Security to hold trials for prisoners in the courtroom. As the Head of Personnel, you are not higher ranking than other heads of staff, even though you are expected to take the Captain's place first should he go missing. If the situation seems too rough for you, consider allowing another head to become temporary Captain. As the Head of Personnel, you are just as large a target as the Captain because of the potential power your ID and computer can hand out and your comparative vulnerability. As the Mime, your invisible wall power blocks people as well as projectiles. You can use it in a pinch to delay your pursuer. @@ -187,7 +190,7 @@ As a Shaft Miner, every monster on Lavaland has a pattern you can exploit to min As a Shaft Miner, you can harvest goliath plates from goliaths and upgrade your explorer's suit, mining hardsuits as well as Firefighter APLUs with them, greatly reducing incoming melee damage. As a Shaft Miner, always have a GPS on you, so a fellow miner or cyborg can come to save you if you die. As a Shaft Miner, you can craft a variety of equipment from the local fauna. Bone axes, lava boats and ash drake armour are just a few of them! -As a Traitor, the cryptographic sequencer (emag) can not only open doors, but also lockers, crates, APCs and more. It can hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you may just be able to create some difficult to obtain substances, or contact your employers to request special objectives! Experiment! +As a Traitor, the cryptographic sequencer (emag) can not only open lockers, crates, APCs and more. It can also do things like hack cyborgs, and even cause bots to go berserk. Use it on the right machines, and you can even contact the Syndicate. Experiment! As a Traitor, subverting the AI to serve you can make it an extremely powerful ally. However, be careful of the wording in the laws you give it, as it may use your poorly written laws against you! As a Traitor, the Captain and the Head of Security are two of the most difficult to kill targets on the station. If either one is your target, plan carefully. As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool if you manage to nab an autolathe for yourself. @@ -235,6 +238,7 @@ As a Changeling, absorbing someone will give you their full memory. This can inc As a Changeling, absorbing another Changeling will permanently boost your chemical reserve, allow you to pick more abilities, and make the victim unable to revive. Be careful when exposing your identity to other Changelings, as they may be out of those wonderful benefits. As a Changeling, BZ gas will dramatically slow down or even halt your natural chemical regeneration, be sure to avoid it at all costs as some lunatics may try and flood portions of the station to deal with you. As a Changeling, death is not the end for you! You can revive after two minutes from being dead by triggering your stasis ability, and then waiting for the prompt to resurrect yourself to show up. +As a Changeling, your Regenerate Limbs power will quickly heal all of your wounds, but they'll still leave scars. Changelings can use Fleshmend to get rid of scars, or you can ingest Carpotoxin to get rid of them like a normal person. As a Cultist, do not cause too much chaos before your objective is completed. If the shuttle gets called too soon, you may not have enough time to win. As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face. As a Cultist, the Blood Boil rune will deal massive amounts of brute damage to non-cultists, stamina damage to Ratvarian scum, and some damage to fellow cultists of Nar-Sie nearby, but will create a fire where the rune stands on use. @@ -281,12 +285,17 @@ As a Devil, you gain power for every three souls you control, however you also b As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed. At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth. You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other. -When hacking doors, cutting and mending the "test light wire" will restore power to the door. -When hacking, remote singulars pulse when attached to a wire and pinged. This can allow you to hack things or set traps from far away. +When hacking doors, cutting and mending a "test light wire" will restore power to the door. When crafting most items, you can either manually combine parts or use the crafting menu. Suit storage units not only remove blood and dirt from clothing, but also radiation! -Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. Remote devices will work when used through cameras. For example: Bluespace RPEDs and door remotes. +You can light a cigar on a supermatter crystal. +Using sticky tape on items can make them stick to people and walls! Be careful, grenades might stick to your hand during the moment of truth! +In a pinch, stripping yourself naked will give you a sizeable resistance to being tackled. What do you value more, your freedom or your dignity? +Wearing riot armor makes you significantly more effective at performing tackle takedowns, but will use extra stamina with each leap! It will also significantly protect you from other tackles! +Epipens contain a powerful coagulant that drastically reduces bleeding on all bleeding wounds. If you don't have time to properly treat someone with lots of slashes or piercings, stick them with a pen to buy some time! +Anything you can light a cigarette with, you can use to cauterize a bleeding wound. Technically, that includes the supermatter. +Suit storage units entirely purge radiation from any carbon mob put inside of them when cycling, at the cost of some horrific burns, this is a very effective strategy to clean someone up after they bathed in the engine. Laser pointers can be upgraded by replacing its micro laser with a better one from RnD! Use a screwdriver on it to remove the old laser. Upgrading the laser pointer gives you better odds of stunning a cyborg, and even blinding people with sunglasses. Being out of combat mode makes makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by resting. Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode. diff --git a/strings/traumas.json b/strings/traumas.json index 58170bd55a..f8fed95c98 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -131,7 +131,8 @@ "@pick(semicolon)*weh", "@pick(semicolon)My balls finally feel full, again.", "@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)", - ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP" + ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP", + "@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!" ], "mutations": [ @@ -199,7 +200,7 @@ "abdoocters", "revinent" ], - + "bug": [ "", "IS TIS A BUG??", @@ -207,7 +208,7 @@ "BUG!!!", "HUE, FEATURE!!" ], - + "semicolon": [ "", ";", @@ -271,7 +272,7 @@ "arrdee", "sek" ], - + "cargo": [ "GUNS", "HATS", @@ -279,7 +280,7 @@ "MEMES", "GLOWY CYSTAL" ], - + "s_roles": [ "ert", "shadowlig", diff --git a/tgstation.dme b/tgstation.dme index 61a7eec79e..de6ee1a6bf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -81,6 +81,7 @@ #include "code\__DEFINES\networks.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" +#include "code\__DEFINES\plumbing.dm" #include "code\__DEFINES\pool.dm" #include "code\__DEFINES\power.dm" #include "code\__DEFINES\preferences.dm" @@ -95,6 +96,7 @@ #include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" #include "code\__DEFINES\robots.dm" +#include "code\__DEFINES\rockpaperscissors.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\say.dm" @@ -301,6 +303,7 @@ #include "code\controllers\subsystem\events.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" +#include "code\controllers\subsystem\fluid.dm" #include "code\controllers\subsystem\garbage.dm" #include "code\controllers\subsystem\holodeck.dm" #include "code\controllers\subsystem\icon_smooth.dm" @@ -376,6 +379,7 @@ #include "code\datums\datumvars.dm" #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" +#include "code\datums\ductnet.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\explosion.dm" @@ -489,6 +493,11 @@ #include "code\datums\components\fantasy\affix.dm" #include "code\datums\components\fantasy\prefixes.dm" #include "code\datums\components\fantasy\suffixes.dm" +#include "code\datums\components\plumbing\_plumbing.dm" +#include "code\datums\components\plumbing\chemical_acclimator.dm" +#include "code\datums\components\plumbing\filter.dm" +#include "code\datums\components\plumbing\reaction_chamber.dm" +#include "code\datums\components\plumbing\splitter.dm" #include "code\datums\components\storage\storage.dm" #include "code\datums\components\storage\ui.dm" #include "code\datums\components\storage\concrete\_concrete.dm" @@ -1282,6 +1291,7 @@ #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" #include "code\game\objects\structures\icemoon\cave_entrance.dm" +#include "code\game\objects\structures\lavaland\geyser.dm" #include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\signs\_signs.dm" #include "code\game\objects\structures\signs\signs_departments.dm" @@ -1394,6 +1404,7 @@ #include "code\modules\admin\view_variables\mark_datum.dm" #include "code\modules\admin\view_variables\mass_edit_variables.dm" #include "code\modules\admin\view_variables\modify_variables.dm" +#include "code\modules\admin\view_variables\reference_tracking.dm" #include "code\modules\admin\view_variables\topic.dm" #include "code\modules\admin\view_variables\topic_basic.dm" #include "code\modules\admin\view_variables\topic_list.dm" @@ -2858,6 +2869,21 @@ #include "code\modules\photography\photos\album.dm" #include "code\modules\photography\photos\frame.dm" #include "code\modules\photography\photos\photo.dm" +#include "code\modules\plumbing\ducts.dm" +#include "code\modules\plumbing\plumbers\_plumb_machinery.dm" +#include "code\modules\plumbing\plumbers\acclimator.dm" +#include "code\modules\plumbing\plumbers\autohydro.dm" +#include "code\modules\plumbing\plumbers\bottler.dm" +#include "code\modules\plumbing\plumbers\destroyer.dm" +#include "code\modules\plumbing\plumbers\fermenter.dm" +#include "code\modules\plumbing\plumbers\filter.dm" +#include "code\modules\plumbing\plumbers\grinder_chemical.dm" +#include "code\modules\plumbing\plumbers\medipenrefill.dm" +#include "code\modules\plumbing\plumbers\pill_press.dm" +#include "code\modules\plumbing\plumbers\pumps.dm" +#include "code\modules\plumbing\plumbers\reaction_chamber.dm" +#include "code\modules\plumbing\plumbers\splitters.dm" +#include "code\modules\plumbing\plumbers\synthesizer.dm" #include "code\modules\pool\pool_controller.dm" #include "code\modules\pool\pool_drain.dm" #include "code\modules\pool\pool_effects.dm"