diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index 63e6770e42..beb93b319e 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -2372,7 +2372,7 @@ }, /area/awaymission/BMPship/Midship) "hh" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating/airless, /area/awaymission/BMPship/Midship) "hi" = ( diff --git a/_maps/RandomZLevels/away_mission/Academy.dmm b/_maps/RandomZLevels/away_mission/Academy.dmm index 37b0098fd2..9b61f50600 100644 --- a/_maps/RandomZLevels/away_mission/Academy.dmm +++ b/_maps/RandomZLevels/away_mission/Academy.dmm @@ -2710,7 +2710,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 diff --git a/_maps/RandomZLevels/away_mission/SnowCabin.dmm b/_maps/RandomZLevels/away_mission/SnowCabin.dmm index 844a134d27..fbb83899fd 100644 --- a/_maps/RandomZLevels/away_mission/SnowCabin.dmm +++ b/_maps/RandomZLevels/away_mission/SnowCabin.dmm @@ -312,7 +312,7 @@ /obj/structure/janitorialcart, /obj/item/mop, /obj/item/reagent_containers/glass/bucket, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/cabin) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index bb372563cf..b81f55be21 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -69,35 +69,18 @@ /turf/closed/wall/r_wall, /area/security/prison) "aaj" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, /obj/structure/cable{ icon_state = "4-8" }, -/turf/closed/wall/r_wall, -/area/security/prison) -"aak" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) -"aal" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/prison) "aam" = ( /obj/structure/cable{ icon_state = "0-2" }, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/security/prison) @@ -115,11 +98,17 @@ /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/grass, /area/security/prison) "aap" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/carrot, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/grass, /area/security/prison) "aaq" = ( @@ -140,17 +129,29 @@ /obj/structure/sink{ pixel_y = 20 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/prison) "aar" = ( /obj/machinery/hydroponics/soil, /obj/item/seeds/glowshroom, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/grass, /area/security/prison) "aas" = ( /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/prison) "aat" = ( @@ -5666,6 +5667,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "akw" = ( @@ -5845,10 +5849,13 @@ /area/science/xenobiology) "akQ" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/closed/wall, -/area/security/brig) +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "akR" = ( /obj/machinery/camera{ c_tag = "Security Office"; @@ -6108,7 +6115,7 @@ "alq" = ( /obj/machinery/door/airlock/security/glass{ name = "Evidence Storage"; - req_access_txt = "4" + req_one_access_txt = "4;1" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -6142,25 +6149,11 @@ /turf/open/floor/plasteel, /area/security/brig) "alt" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/cable{ + icon_state = "1-2" }, /turf/open/floor/plasteel, /area/security/brig) @@ -6180,16 +6173,11 @@ /area/ai_monitored/nuke_storage) "alv" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, +/obj/structure/cable, /turf/open/floor/plating, /area/security/brig) "alw" = ( @@ -6272,6 +6260,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel, /area/security/brig) "alB" = ( @@ -6572,9 +6563,6 @@ /turf/open/floor/engine, /area/science/xenobiology) "amm" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/structure/cable{ icon_state = "0-4" }, @@ -6609,6 +6597,9 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel, /area/security/brig) "amq" = ( @@ -6661,9 +6652,6 @@ icon_state = "0-8" }, /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/brig) @@ -6763,6 +6751,12 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plasteel, /area/security/brig) "amJ" = ( @@ -6853,25 +6847,15 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) -"amR" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/brig) "amS" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/turf/closed/wall/r_wall, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, /area/security/brig) "amT" = ( /obj/structure/cable{ @@ -7271,9 +7255,11 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plating, /area/security/brig) "anQ" = ( @@ -7281,9 +7267,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/security/brig) "anR" = ( @@ -7514,14 +7497,13 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/structure/cable, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-8" }, /turf/open/floor/plating, /area/security/brig) @@ -7755,13 +7737,13 @@ /area/security/brig) "aoZ" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Brig Control"; name = "brig shutters" }, +/obj/structure/cable{ + icon_state = "0-4" + }, /turf/open/floor/plating, /area/security/warden) "apa" = ( @@ -7780,6 +7762,9 @@ /area/science/xenobiology) "apc" = ( /obj/structure/chair/office/dark, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apd" = ( @@ -7933,6 +7918,12 @@ pixel_x = 6; pixel_y = 3 }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apw" = ( @@ -8052,6 +8043,12 @@ pixel_y = -24; req_access_txt = "2" }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "apI" = ( @@ -8133,9 +8130,6 @@ req_access_txt = "63" }, /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -8158,14 +8152,19 @@ /turf/open/floor/plating, /area/maintenance/fore) "apT" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Cell Interior Shutters"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-8" }, /obj/structure/cable{ - icon_state = "1-8" + icon_state = "0-4" }, -/turf/closed/wall/r_wall, -/area/security/warden) +/turf/open/floor/plating, +/area/security/brig) "apU" = ( /turf/open/floor/plating, /area/security/vacantoffice/b) @@ -8181,20 +8180,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"apX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Brig Control"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/security/warden) "apY" = ( /obj/machinery/light/small{ dir = 1 @@ -8406,13 +8391,11 @@ /area/crew_quarters/fitness/pool) "aqt" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Brig Control"; name = "brig shutters" }, +/obj/structure/cable, /turf/open/floor/plating, /area/security/warden) "aqu" = ( @@ -8858,6 +8841,9 @@ c_tag = "Brig Control"; dir = 1 }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "arz" = ( @@ -11044,18 +11030,12 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/maintenance/port/fore) -"axo" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) "axp" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "axq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -11454,10 +11434,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"ayC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/fore) "ayD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, @@ -14269,10 +14245,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/fore) -"aGh" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/maintenance/fore) "aGi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, @@ -29648,10 +29620,10 @@ /turf/open/floor/plasteel/white, /area/science/robotics/lab) "bsU" = ( -/mob/living/simple_animal/hostile/retaliate/ghost, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/mob/living/simple_animal/hostile/retaliate/ghost, /turf/open/floor/wood, /area/maintenance/port/fore) "bsV" = ( @@ -45293,7 +45265,7 @@ /area/maintenance/aft) "cfq" = ( /obj/structure/mopbucket, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/aft) "cfr" = ( @@ -52616,9 +52588,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/security/brig) "cLS" = ( @@ -53367,7 +53336,7 @@ }, /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "ddM" = ( /obj/structure/sign/poster/official/the_owl{ pixel_x = 32 @@ -53519,11 +53488,23 @@ }, /turf/closed/wall, /area/science/circuit) +"dxF" = ( +/obj/machinery/gear_painter, +/turf/open/floor/wood, +/area/maintenance/bar) "dyE" = ( /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-4" }, -/turf/open/floor/plasteel, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/security/brig) "dyS" = ( /obj/effect/turf_decal/tile/green{ @@ -53583,9 +53564,6 @@ /turf/open/space, /area/space/nearstation) "dCV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -53746,7 +53724,7 @@ dir = 1 }, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "edA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54942,7 +54920,7 @@ "gKG" = ( /obj/structure/bedsheetbin/towel, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "gLz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54994,11 +54972,11 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/security/brig) "gOZ" = ( @@ -56220,7 +56198,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "jJF" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable{ @@ -56342,15 +56320,15 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/security/brig) "kcx" = ( @@ -56531,6 +56509,10 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"kqy" = ( +/obj/machinery/gear_painter, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "kqI" = ( /obj/structure/window, /turf/open/floor/wood, @@ -56869,9 +56851,6 @@ /turf/open/floor/plasteel, /area/security/brig) "laq" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/structure/cable{ icon_state = "2-4" }, @@ -57013,7 +56992,7 @@ dir = 8 }, /turf/closed/wall, -/area/maintenance/fore) +/area/maintenance/port/fore) "lzt" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/stripes/line, @@ -57160,7 +57139,7 @@ /area/maintenance/starboard/aft) "lZn" = ( /obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; + id_tag = null; name = "Brig Infirmary"; req_access_txt = "2" }, @@ -57605,7 +57584,7 @@ }, /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "nbT" = ( /obj/structure/cable{ icon_state = "0-8" @@ -58195,9 +58174,6 @@ /area/hallway/primary/central) "ovv" = ( /obj/structure/table, -/obj/structure/cable{ - icon_state = "0-2" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -58540,9 +58516,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -58586,6 +58559,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) "pqR" = ( @@ -58671,9 +58645,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -58681,7 +58652,10 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plasteel, /area/security/brig) @@ -58809,9 +58783,6 @@ /turf/open/floor/plating, /area/crew_quarters/fitness) "pQr" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 8 @@ -59081,7 +59052,7 @@ dir = 8 }, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "qIw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59498,9 +59469,6 @@ /area/maintenance/bar) "rCl" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, @@ -59544,20 +59512,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"rJv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/security/brig) "rJw" = ( /obj/structure/table/glass, /obj/item/hemostat, @@ -59689,12 +59643,6 @@ }, /turf/open/floor/plasteel/dark, /area/medical/paramedic) -"rWw" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) "rXl" = ( /obj/structure/chair/office/light, /obj/machinery/firealarm{ @@ -59764,9 +59712,6 @@ }, /area/crew_quarters/fitness) "seP" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/structure/cable{ icon_state = "0-8" }, @@ -59817,7 +59762,7 @@ dir = 8 }, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "sqg" = ( /obj/structure/table/wood, /obj/item/clothing/under/misc/pj/red, @@ -60254,7 +60199,7 @@ dir = 8 }, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "trb" = ( /obj/machinery/light{ dir = 4 @@ -60672,7 +60617,7 @@ /obj/structure/girder, /obj/structure/grille, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "ugu" = ( /obj/structure/cable{ icon_state = "1-4" @@ -61092,6 +61037,9 @@ /area/maintenance/starboard/aft) "uXt" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "vae" = ( @@ -61332,13 +61280,13 @@ /area/crew_quarters/dorms) "vyK" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "0-8" - }, /obj/machinery/door/poddoor/preopen{ id = "Secure Gate"; name = "brig shutters" }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, /area/security/brig) "vzp" = ( @@ -82474,7 +82422,7 @@ lZN amC jIW ddI -arP +alU fgG rqW aGD @@ -82725,13 +82673,13 @@ amC htu alU edj -rWw +ygb gKG -arP -aqR -awb +alU +amC +ntt ugq -arP +alU rPU fne aGr @@ -82984,11 +82932,11 @@ alU tqG spR qGw -arP -aGh -awb -axo -arP +alU +aFJ +ntt +aAY +alU aCh pIf kCo @@ -83238,14 +83186,14 @@ ali ali ali alU -arP +alU lzk -arP -arP -arP -avZ +alU +alU +alU +atO axp -ayC +aue azH eEe aGv @@ -86395,7 +86343,7 @@ oKh oKh iiW iiW -iiW +dxF izv nfm bCq @@ -88087,7 +88035,7 @@ aaa aaa aag aaa -aak +aam aap saX aaD @@ -88344,7 +88292,7 @@ aaa aaa aag aaf -aaj +aai aao aax aaC @@ -88370,7 +88318,7 @@ alz cZe alg plS -dyE +afM pQr aou aqC @@ -88601,7 +88549,7 @@ aaa aaa aag aaa -aal +aam aar uGI aaF @@ -88858,7 +88806,7 @@ aaa aaa aag aaf -aaj +aai aaq dyS aaE @@ -88883,10 +88831,10 @@ agj agM sAk akp -akQ +agj amB amn -amS +aiX anz anz aov @@ -89115,8 +89063,8 @@ aaa aaa aag aaa -aal -aat +aam +aaj aat aat aat @@ -89143,7 +89091,7 @@ akM amm gyr anM -rJv +xal aqC anz aox @@ -89372,7 +89320,7 @@ aaa aaa aag aaf -aaj +aai aas aat aat @@ -89395,12 +89343,12 @@ akU afM lBz alA -ene -alg +alt +amS kbm -dyE +afM cKC -seP +dyE aqC anR aow @@ -89630,7 +89578,7 @@ aaa aag aaa aam -aav +akQ aav aav aav @@ -89657,7 +89605,7 @@ akT gNE gLz anB -amR +seP aqC anz aov @@ -89911,10 +89859,10 @@ fxx ako ene amj -akQ +agj amB amn -amS +aiX anz anz aov @@ -90171,7 +90119,7 @@ amk amm gyr mos -rJv +xal aqC anz aov @@ -90424,11 +90372,11 @@ akF aiy akv uXt -alg +amS pAK -dyE +afM anQ -seP +dyE aqC anz aov @@ -90685,7 +90633,7 @@ akT amx any arD -amR +seP aqC anz aov @@ -90939,10 +90887,10 @@ ajc akz ene als -akQ -amB +agj +apT amn -amS +aiX aqD anz aov @@ -91196,7 +91144,7 @@ ajc akz ene alg -alt +alw amp aot apR @@ -91455,7 +91403,7 @@ itD alg vyK amI -alg +amS alv aqE anS @@ -91970,7 +91918,7 @@ agn agn amN aoZ -apT +agn anw anz cXU @@ -92227,7 +92175,7 @@ akY alE amU apH -apX +aqt aqC anz gfC @@ -98410,7 +98358,7 @@ awB att azh fHG -fHG +kqy kxf ufD alP diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index a62dfcf0a2..6f5bab0498 100644 --- a/_maps/map_files/CogStation/CogStation.dmm +++ b/_maps/map_files/CogStation/CogStation.dmm @@ -3643,7 +3643,7 @@ lootcount = 2; name = "2maintenance loot spawner" }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/construction) "ajb" = ( @@ -4579,7 +4579,7 @@ /turf/open/floor/plasteel, /area/security/processing) "alk" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/construction/secondary) "all" = ( @@ -6034,12 +6034,15 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor, /obj/item/flashlight/lamp, /obj/machinery/door/window/westright{ name = "Security Checkpoint"; req_access_txt = "1" }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, /turf/open/floor/plasteel, /area/security/checkpoint) "aoB" = ( @@ -9593,12 +9596,15 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/door/firedoor, /obj/item/folder/red, /obj/machinery/door/window/westleft{ name = "Security Checkpoint"; req_access_txt = "1" }, +/obj/machinery/door/firedoor/border_only{ + dir = 8; + name = "west facing firelock" + }, /turf/open/floor/plasteel, /area/security/checkpoint) "awu" = ( @@ -23201,7 +23207,25 @@ /area/hallway/primary/port/fore) "aYW" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, +/obj/item/pen/blue, +/obj/machinery/camera{ + c_tag = "Customs - Fore"; + dir = 4 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPFore"; + name = "HoP Fore Desk Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) +"aYX" = ( +/obj/structure/table/reinforced, /obj/machinery/door/window/northright{ name = "Customs Desk"; req_access_txt = "57" @@ -23210,16 +23234,9 @@ id = "HoPFore"; name = "HoP Fore Desk Shutters" }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) -"aYX" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/flashlight/lamp, -/obj/structure/window/reinforced/spawner/north, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPFore"; - name = "HoP Fore Desk Shutters" +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) @@ -23323,19 +23340,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, -/obj/item/caution{ +/obj/item/clothing/suit/caution{ pixel_x = 6; pixel_y = 3 }, @@ -25051,15 +25068,15 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload_foyer) "bcZ" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, /obj/structure/cable{ icon_state = "0-2" }, +/obj/machinery/power/smes{ + charge = 5e+006 + }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai_upload_foyer) "bda" = ( @@ -25410,7 +25427,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bdM" = ( /turf/open/floor/plasteel, /area/quartermaster/office) @@ -25688,7 +25705,7 @@ /area/security/courtroom) "bey" = ( /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bez" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -25764,7 +25781,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "beI" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment, @@ -25778,7 +25795,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "beJ" = ( /turf/open/floor/plasteel, /area/hallway/primary/central) @@ -25967,7 +25984,7 @@ icon_state = "0-4" }, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bfi" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 10 @@ -25985,13 +26002,13 @@ icon_state = "0-4" }, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bfk" = ( /obj/structure/cable{ icon_state = "2-8" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bfl" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -26793,7 +26810,7 @@ /area/quartermaster/sorting) "bgP" = ( /obj/item/analyzer, -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/disposal) "bgQ" = ( @@ -26841,9 +26858,6 @@ /turf/open/floor/plating, /area/crew_quarters/heads/hor) "bgY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/status_display, /turf/closed/wall/r_wall, /area/hallway/primary/central) @@ -26943,7 +26957,7 @@ icon_state = "2-4" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bhm" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/engine, @@ -27017,11 +27031,12 @@ /turf/open/floor/plasteel, /area/engine/secure_construction) "bht" = ( -/obj/structure/grille, /obj/structure/cable, /obj/structure/cable{ icon_state = "0-4" }, +/obj/machinery/power/terminal, +/obj/structure/grille, /obj/structure/window/reinforced/spawner, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) @@ -27313,7 +27328,7 @@ icon_state = "4-8" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bia" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -27399,7 +27414,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bik" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -27415,7 +27430,7 @@ "bil" = ( /obj/structure/window/reinforced/spawner, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/server/compcore) "bim" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -27513,7 +27528,7 @@ dir = 5 }, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/server/compcore) "bix" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/delivery, @@ -27576,7 +27591,7 @@ dir = 10 }, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/server/compcore) "biF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -27615,7 +27630,7 @@ icon_state = "1-2" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "biI" = ( /obj/machinery/light{ dir = 4; @@ -27638,6 +27653,9 @@ /area/quartermaster/office) "biK" = ( /obj/structure/closet/firecloset, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 10 + }, /turf/open/floor/plasteel, /area/science/mixing) "biL" = ( @@ -28416,7 +28434,7 @@ }, /obj/machinery/photocopier, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bku" = ( /obj/structure/closet, /turf/open/floor/plasteel, @@ -28455,7 +28473,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bkA" = ( /obj/machinery/light_switch{ pixel_y = -24 @@ -28566,7 +28584,7 @@ pixel_y = 24 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bkK" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -28674,7 +28692,7 @@ /area/maintenance/department/eva) "bkW" = ( /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bkX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, @@ -28918,25 +28936,26 @@ "blv" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "blw" = ( /obj/structure/cable{ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "blx" = ( /obj/structure/cable{ icon_state = "0-8" }, /obj/machinery/power/apc{ + areastring = "/area/science/server/compcore"; dir = 1; name = "Computer Core APC"; pixel_y = 24 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bly" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29001,7 +29020,7 @@ light_color = "#e8eaff" }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "blE" = ( /obj/machinery/light{ dir = 8 @@ -29216,7 +29235,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bma" = ( /obj/structure/chair{ dir = 8 @@ -29522,7 +29541,7 @@ icon_state = "1-2" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bmG" = ( /turf/open/floor/engine, /area/gateway) @@ -29593,13 +29612,14 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bmM" = ( -/obj/structure/grille, /obj/structure/cable{ icon_state = "0-2" }, /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/power/terminal, +/obj/structure/grille, /obj/structure/window/reinforced/spawner, /turf/open/floor/plating, /area/ai_monitored/turret_protected/ai) @@ -30215,7 +30235,7 @@ pixel_y = 1 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bnT" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -30228,7 +30248,7 @@ dir = 9 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bnU" = ( /obj/structure/rack, /obj/item/clothing/suit/space/fragile, @@ -30280,18 +30300,16 @@ /area/engine/teg) "bnZ" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/pen/blue, -/obj/machinery/camera{ - c_tag = "Customs - Fore"; - dir = 4 - }, +/obj/item/flashlight/lamp, /obj/structure/window/reinforced/spawner/north, /obj/machinery/door/poddoor/shutters/preopen{ id = "HoPFore"; name = "HoP Fore Desk Shutters" }, -/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "boa" = ( @@ -30314,24 +30332,22 @@ /area/crew_quarters/heads/chief) "bod" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/obj/machinery/camera{ + c_tag = "Customs - Aft"; dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - name = "Primary Tool Storage Desk"; - req_access_txt = "11" - }, -/obj/item/folder/yellow, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) "boe" = ( /obj/machinery/door/airlock/vault{ name = "Vault Door"; @@ -30351,7 +30367,7 @@ req_access = list(16) }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bog" = ( /obj/machinery/atmospherics/pipe/simple/supply/visible, /obj/machinery/door/airlock/engineering/glass{ @@ -30380,7 +30396,7 @@ dir = 5 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "boj" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30451,7 +30467,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "boq" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -30464,7 +30480,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bor" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -30503,7 +30519,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bou" = ( /obj/effect/turf_decal/plaque{ icon_state = "L2" @@ -30637,8 +30653,11 @@ /turf/open/floor/plating, /area/quartermaster/miningoffice) "boL" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/turf/open/floor/plasteel, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, +/turf/open/floor/plating, /area/science/mixing) "boM" = ( /obj/machinery/mineral/ore_redemption{ @@ -30859,7 +30878,7 @@ }, /obj/item/book/manual/wiki/robotics_cyborgs, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bpi" = ( /obj/machinery/firealarm{ pixel_y = 26 @@ -31095,7 +31114,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bpL" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -31105,7 +31124,7 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bpM" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, @@ -31116,7 +31135,7 @@ }, /obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bpO" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -31164,7 +31183,7 @@ /obj/effect/turf_decal/tile/green, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bpW" = ( /obj/structure/cable{ icon_state = "1-2" @@ -31350,7 +31369,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bqu" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -31546,7 +31565,7 @@ }, /obj/item/storage/box/disks, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bqP" = ( /obj/machinery/camera{ c_tag = "Engine Room - Port Quarter"; @@ -33585,6 +33604,10 @@ /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, +/obj/item/kirbyplants{ + icon_state = "plant-20"; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "bvu" = ( @@ -33778,7 +33801,7 @@ /turf/open/floor/plasteel/dark, /area/chapel/office) "bvU" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/warning/biohazard{ pixel_x = -32 @@ -34882,7 +34905,7 @@ }, /obj/structure/window/reinforced/spawner, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/server/compcore) "byf" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Telecommunications Mainframe"; @@ -35576,7 +35599,7 @@ "bzN" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bzO" = ( /obj/machinery/conveyor_switch/oneway{ id = "recycler"; @@ -35605,7 +35628,7 @@ }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bzS" = ( /obj/structure/table, /obj/machinery/light/small{ @@ -35651,7 +35674,9 @@ name = "Toxins Launch Room"; req_access_txt = "7;8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/science/mixing) "bzY" = ( @@ -35785,7 +35810,6 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bAm" = ( @@ -35924,7 +35948,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/holopad, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bAz" = ( /obj/structure/disposalpipe/junction/flip{ dir = 1 @@ -36026,7 +36050,6 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bAH" = ( @@ -36037,7 +36060,7 @@ }, /obj/structure/window/reinforced/spawner, /turf/open/floor/plasteel/dark, -/area/science/server) +/area/science/server/compcore) "bAI" = ( /obj/machinery/photocopier, /obj/machinery/requests_console{ @@ -36116,6 +36139,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "bAQ" = ( @@ -36143,10 +36169,16 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "bAV" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/mixing) "bAW" = ( @@ -36545,7 +36577,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/rnd/server, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bBT" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -36623,10 +36655,10 @@ name = "RD Server Lockup" }, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bCb" = ( /turf/open/floor/circuit/green, -/area/science/server) +/area/science/server/compcore) "bCc" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable{ @@ -36998,7 +37030,7 @@ "bCW" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/circuit/green, -/area/science/server) +/area/science/server/compcore) "bCX" = ( /obj/machinery/rnd/production/circuit_imprinter/department/science, /obj/item/reagent_containers/glass/beaker/sulphuric, @@ -37355,10 +37387,11 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "bDL" = ( +/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 + dir = 10 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "bDM" = ( /obj/structure/table/reinforced, @@ -38170,12 +38203,7 @@ /turf/open/floor/plasteel, /area/science/xenobiology) "bFp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "bFq" = ( @@ -38771,9 +38799,9 @@ /turf/open/floor/plasteel/freezer, /area/crew_quarters/toilet/restrooms) "bGv" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plasteel, -/area/science/server) +/area/science/server/compcore) "bGw" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -38897,7 +38925,7 @@ /obj/item/circuitboard/machine/rdserver, /obj/item/disk/tech_disk, /turf/open/floor/circuit/green, -/area/science/server) +/area/science/server/compcore) "bGL" = ( /obj/structure/chair{ dir = 1 @@ -38912,10 +38940,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/item/kirbyplants{ - icon_state = "plant-20"; - pixel_y = 3 - }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) "bGN" = ( @@ -38946,7 +38971,7 @@ /obj/machinery/light, /obj/structure/disposalpipe/segment, /turf/open/floor/circuit/green, -/area/science/server) +/area/science/server/compcore) "bGQ" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -39522,7 +39547,7 @@ network = list("minisat") }, /turf/open/floor/circuit/green, -/area/science/server) +/area/science/server/compcore) "bIh" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery/white, @@ -40062,7 +40087,7 @@ icon_state = "1-4" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bJo" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -40124,9 +40149,6 @@ /area/space/nearstation) "bJw" = ( /obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/science/mixing) "bJx" = ( @@ -40233,7 +40255,7 @@ icon_state = "0-4" }, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bJG" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -32 @@ -40328,9 +40350,7 @@ /turf/open/floor/plating, /area/maintenance/disposal) "bJT" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel/white, /area/science/mixing) "bJU" = ( @@ -40574,7 +40594,7 @@ icon_state = "1-8" }, /turf/closed/wall/r_wall, -/area/science/server) +/area/science/server/compcore) "bKt" = ( /obj/structure/cable{ icon_state = "1-4" @@ -40980,7 +41000,7 @@ dir = 1; pixel_y = -26 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/item/shovel, /obj/item/stack/tile/plasteel{ pixel_x = 10; @@ -42597,7 +42617,7 @@ icon_state = "0-2" }, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bOA" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -42646,9 +42666,6 @@ light_color = "#e8eaff" }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 4 - }, /turf/open/floor/plasteel, /area/science/mixing) "bOF" = ( @@ -42830,18 +42847,23 @@ /area/science/xenobiology) "bOY" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/obj/machinery/camera{ - c_tag = "Customs - Aft"; - dir = 4 +/obj/item/clipboard, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/stamp, +/obj/machinery/door/window/southright{ + name = "Customs Desk"; + req_access_txt = "57" }, -/obj/structure/window/reinforced/spawner, /obj/machinery/door/poddoor/shutters/preopen{ id = "HoPAft"; name = "HoP Aft Desk Shutters" }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, /turf/open/floor/plasteel/dark, /area/security/checkpoint/customs) "bOZ" = ( @@ -43300,9 +43322,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/camera/motion{ c_tag = "AI Foyer"; network = list("minisat"); @@ -43320,7 +43339,7 @@ dir = 6 }, /turf/open/floor/plasteel, -/area/ai_monitored/turret_protected/ai) +/area/ai_monitored/turret_protected/ai_upload_foyer) "bQc" = ( /obj/structure/bodycontainer/morgue{ dir = 8 @@ -43383,9 +43402,6 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/supplymain/hidden, /turf/open/floor/plasteel, /area/ai_monitored/turret_protected/ai_upload_foyer) @@ -43756,9 +43772,7 @@ /turf/open/floor/plating, /area/router) "bQX" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, /turf/open/floor/plasteel/white, /area/science/mixing) "bQY" = ( @@ -44254,9 +44268,6 @@ /area/science/robotics/lab) "bRW" = ( /obj/effect/turf_decal/bot, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/status_display/ai{ pixel_y = 32 }, @@ -44384,9 +44395,6 @@ /area/science/xenobiology) "bSk" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -44439,7 +44447,7 @@ }, /obj/structure/cable, /turf/open/floor/plating, -/area/science/server) +/area/science/server/compcore) "bSp" = ( /obj/machinery/conveyor_switch/oneway{ id = "cargoload" @@ -44473,9 +44481,6 @@ /turf/open/floor/plasteel, /area/quartermaster/storage) "bSr" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 @@ -44483,18 +44488,12 @@ /turf/open/floor/mineral/titanium/blue, /area/ai_monitored/turret_protected/ai_upload_foyer) "bSs" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, /turf/open/floor/mineral/titanium/blue, /area/ai_monitored/turret_protected/ai_upload_foyer) "bSt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/light{ dir = 1 }, @@ -44696,9 +44695,6 @@ /area/science/lab) "bSO" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -45219,9 +45215,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/status_display/ai{ pixel_y = 32 }, @@ -45319,9 +45312,6 @@ /obj/machinery/light_switch{ pixel_y = 24 }, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/supplymain/hidden{ dir = 4 }, @@ -46094,9 +46084,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "bVF" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -46307,26 +46294,17 @@ /area/engine/atmos) "bVY" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/item/flashlight/lamp, +/obj/structure/window/reinforced/spawner, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "HoPAft"; + name = "HoP Aft Desk Shutters" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southright{ - name = "Primary Tool Storage Desk"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/storage/primary) +/turf/open/floor/plasteel/dark, +/area/security/checkpoint/customs) "bVZ" = ( /obj/machinery/power/apc{ name = "Cargo Bay APC"; @@ -46455,9 +46433,6 @@ /area/science/mixing) "bWm" = ( /obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/door/airlock/engineering{ name = "AI SMES Access"; req_one_access_txt = "10;24" @@ -46559,9 +46534,6 @@ /turf/open/floor/plasteel/white, /area/science/mixing) "bWv" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 8 }, @@ -48793,7 +48765,7 @@ /turf/open/floor/engine, /area/science/storage) "cbh" = ( -/obj/machinery/rnd/experimentor, +/obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/science/explab) "cbi" = ( @@ -49146,6 +49118,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "cbQ" = ( @@ -49637,13 +49612,11 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "ccL" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" +/obj/effect/turf_decal/stripes/line, +/obj/machinery/computer/rdconsole/experiment{ + dir = 1 }, -/obj/machinery/rnd/bepis, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/science/explab) "ccM" = ( /obj/structure/disposalpipe/segment{ @@ -51474,8 +51447,8 @@ /area/quartermaster/warehouse) "cgt" = ( /obj/structure/rack, -/obj/item/caution, -/obj/item/caution, +/obj/item/clothing/suit/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/quartermaster/warehouse) @@ -51557,7 +51530,6 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable, /obj/structure/cable{ icon_state = "0-2" }, @@ -51950,9 +51922,6 @@ /turf/open/floor/plasteel, /area/engine/atmos) "chy" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden{ dir = 10 }, @@ -52060,24 +52029,16 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, /turf/open/floor/plasteel, /area/engine/atmos) "chM" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engine/atmos) "chN" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/orange/hidden, /turf/closed/wall/r_wall, /area/engine/teg/hotloop) @@ -52907,7 +52868,7 @@ dir = 4; pixel_x = -28 }, -/obj/item/kirbyplants/random, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/quartermaster/office) "cjB" = ( @@ -54609,26 +54570,26 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cmT" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/item/folder/red, -/obj/machinery/atmospherics/pipe/simple/cyan/hidden, -/obj/machinery/door/window/northright{ - name = "Security Checkpoint"; - req_access_txt = "1" +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/full, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, /turf/open/floor/plasteel, -/area/security/checkpoint/supply) +/area/engine/workshop) "cmU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -55042,6 +55003,9 @@ /obj/item/target/alien, /obj/item/target, /obj/item/target/clown, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, /turf/open/floor/plasteel, /area/science/mixing) "cnM" = ( @@ -55085,9 +55049,6 @@ /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 }, @@ -55112,7 +55073,8 @@ /turf/open/floor/plating, /area/maintenance/solars/starboard/aft) "cnT" = ( -/obj/machinery/atmospherics/pipe/manifold/cyan/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/open/floor/plasteel, /area/science/mixing) "cnU" = ( @@ -56727,9 +56689,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cqS" = ( -/obj/machinery/computer/rdconsole/experiment{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /obj/machinery/requests_console{ department = "Science"; @@ -56738,6 +56697,8 @@ pixel_x = -30; receive_ore_updates = 1 }, +/obj/structure/table, +/obj/item/book/manual/wiki/experimentor, /turf/open/floor/plasteel, /area/science/explab) "cqT" = ( @@ -57988,20 +57949,25 @@ /turf/open/floor/plasteel, /area/engine/atmos) "ctl" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable{ + icon_state = "1-2" + }, /obj/structure/window/reinforced/spawner/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" + }, /turf/open/floor/plasteel, /area/engine/workshop) "ctm" = ( @@ -58202,21 +58168,17 @@ /turf/open/floor/plating, /area/medical/virology) "ctE" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 +/obj/structure/table/reinforced, +/obj/machinery/door/window/southleft{ + name = "Workshop Desk"; + req_access_txt = "11" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/window/reinforced/spawner/north, /turf/open/floor/plasteel, /area/engine/workshop) "ctF" = ( @@ -59567,34 +59529,38 @@ /area/science/xenobiology) "cvZ" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/clipboard, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/stamp, /obj/machinery/door/window/southright{ - name = "Customs Desk"; - req_access_txt = "57" + name = "Workshop Desk"; + req_access_txt = "11" }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPAft"; - name = "HoP Aft Desk Shutters" +/obj/item/folder/yellow, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/turf/open/floor/plasteel, +/area/engine/workshop) "cwa" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/flashlight/lamp, -/obj/structure/window/reinforced/spawner, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "HoPAft"; - name = "HoP Aft Desk Shutters" +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/security/checkpoint/customs) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/window/southleft{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/item/folder/yellow, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/storage/primary) "cwb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60704,6 +60670,7 @@ pixel_y = 24 }, /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet/restrooms"; dir = 4; name = "Restrooms APC"; pixel_x = 24 @@ -61860,7 +61827,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 }, @@ -62959,7 +62926,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/machinery/atmospherics/pipe/manifold4w/orange/hidden, /obj/structure/cable{ icon_state = "4-8" @@ -67102,8 +67069,8 @@ /turf/open/floor/plasteel, /area/engine/gravity_generator) "cJH" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -67708,11 +67675,6 @@ /obj/machinery/atmospherics/pipe/simple/green/visible, /turf/open/floor/plating, /area/engine/atmos) -"cLc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/yellow/visible, -/turf/open/floor/plating, -/area/engine/atmos) "cLd" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -68133,14 +68095,14 @@ /turf/open/floor/plating, /area/engine/storage) "cMa" = ( -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4 }, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_x = -8; + pixel_y = 24 + }, /turf/open/floor/engine/vacuum, /area/engine/atmos) "cMb" = ( @@ -68280,17 +68242,22 @@ pixel_x = -40; pixel_y = 8 }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, +/obj/machinery/button/ignition/incinerator/atmos{ + pixel_x = -24; + pixel_y = -9 + }, /turf/open/floor/plasteel, /area/engine/atmos) "cMw" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, /turf/open/floor/plasteel, /area/engine/atmos) "cMx" = ( @@ -68408,10 +68375,13 @@ /turf/open/floor/plasteel/dark, /area/engine/atmos) "cMI" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/supplymain/visible{ + dir = 4 }, -/turf/closed/wall/r_wall, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel, /area/engine/atmos) "cMJ" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ @@ -68449,10 +68419,8 @@ /turf/open/floor/plating, /area/engine/atmos) "cMO" = ( +/obj/machinery/atmospherics/pipe/layer_manifold, /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 4 - }, /turf/open/floor/plating, /area/engine/atmos) "cMP" = ( @@ -68681,6 +68649,30 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/router/air) +"cNm" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/window/southright{ + name = "Primary Tool Storage Desk"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/firedoor/border_only{ + name = "south facing firelock" + }, +/turf/open/floor/plasteel, +/area/storage/primary) "cNn" = ( /obj/machinery/conveyor/auto{ dir = 8; @@ -68693,26 +68685,28 @@ /area/engine/workshop) "cNp" = ( /obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southleft{ - name = "Workshop Desk"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel, -/area/engine/workshop) -"cNq" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/southright{ - name = "Workshop Desk"; - req_access_txt = "11" +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/folder/red, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/machinery/door/window/northright{ + name = "Security Checkpoint"; + req_access_txt = "1" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1; + name = "north facing firelock" }, -/obj/item/folder/yellow, /turf/open/floor/plasteel, -/area/engine/workshop) +/area/security/checkpoint/supply) "cNr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -70777,6 +70771,13 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/plasteel, /area/engine/atmos) +"dnN" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "dpO" = ( /obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ dir = 4 @@ -70796,6 +70797,14 @@ }, /turf/open/floor/plating, /area/router) +"dSZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold, +/turf/open/floor/plating, +/area/engine/atmos) "dVR" = ( /obj/machinery/atmospherics/pipe/simple/violet/visible, /turf/open/floor/plasteel, @@ -70807,13 +70816,19 @@ }, /turf/open/floor/engine, /area/science/storage) +"ebG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/turf/open/floor/plating, +/area/science/mixing) "eCy" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ + pixel_x = -25; + pixel_y = 7 + }, /turf/open/floor/plasteel, /area/engine/atmos) "eIh" = ( @@ -70831,6 +70846,10 @@ dir = 1 }, /area/engine/atmos) +"eJy" = ( +/obj/machinery/rnd/experimentor, +/turf/open/floor/engine, +/area/science/explab) "eKM" = ( /obj/machinery/atmospherics/pipe/manifold/supplymain/visible, /turf/open/floor/plasteel, @@ -70991,6 +71010,13 @@ /obj/machinery/atmospherics/pipe/manifold/orange/visible, /turf/open/space/basic, /area/space/nearstation) +"iCa" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/science/mixing) "iQY" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 4 @@ -71016,6 +71042,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"jAv" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "kzb" = ( /obj/machinery/atmospherics/pipe/manifold/orange/hidden{ dir = 4 @@ -71052,6 +71085,10 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"mqE" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/atmos) "mxW" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supplymain/visible{ @@ -71059,6 +71096,13 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mDW" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/atmos) "mEa" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8; @@ -71201,8 +71245,8 @@ /turf/open/space/basic, /area/space/nearstation) "rUl" = ( -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 6 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -71213,6 +71257,13 @@ }, /turf/open/floor/plating/airless, /area/router/aux) +"stP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/plasteel, +/area/quartermaster/office) "sAm" = ( /obj/structure/plasticflaps, /obj/machinery/door/poddoor{ @@ -71230,6 +71281,10 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plasteel, /area/engine/atmos) +"sSg" = ( +/obj/machinery/rnd/bepis, +/turf/open/floor/engine, +/area/science/explab) "sVC" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -71278,8 +71333,8 @@ /turf/open/floor/plasteel, /area/engine/atmos) "tZC" = ( -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 }, /turf/open/floor/plasteel, /area/engine/atmos) @@ -71305,6 +71360,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"uYy" = ( +/obj/structure/grille, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/orange/hidden, +/turf/open/floor/plating/airless, +/area/space/nearstation) "vcb" = ( /obj/machinery/atmospherics/pipe/simple/brown/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -90809,10 +90872,10 @@ bOv bfo blI bfo -bWS -bcw -bcw -bcw +bXg +ebG +ebG +iCa bcy cbu csR @@ -91321,9 +91384,9 @@ boJ fuR bzX bAl -boL +bdf bAG -cnT +bdf boQ cKJ bAP @@ -91576,11 +91639,11 @@ bcy bcy bcy bcy -bcy +bWS bgC bdf boR -bDL +bdf boQ cKJ bAP @@ -91833,11 +91896,11 @@ bQe aaU aaU aaU -bcw +boL bdf bdf bpM -bFp +bvj bvj cKK bAU @@ -92090,7 +92153,7 @@ aye aaU aaU aaU -bcw +bDL cnL bdf bpR @@ -92116,7 +92179,7 @@ cHj cqS cav cav -ccL +ctb caX caX caX @@ -92349,8 +92412,8 @@ abp abp bcy biK -bdf -bpR +bFp +cnT bJT bLl cKM @@ -92370,13 +92433,13 @@ aVF caw caA cHk -caP +ccL caT caX -caX +eJy caX cbh -caX +sSg caX cbx cav @@ -94872,11 +94935,11 @@ aUV aYB bbg bcH -bnZ +aYW bqi bIl bcJ -bOY +bod bdr beJ beJ @@ -95129,11 +95192,11 @@ bcN aYJ aNL aVJ -aYW +aYX baF bIr bcx -cvZ +bOY bdr beJ beT @@ -95386,11 +95449,11 @@ bcQ aUC aNL aVJ -aYX +bnZ baD bIV bKg -cwa +bVY bdr beJ bfd @@ -105699,7 +105762,7 @@ cgD cdV chy chN -bWQ +uYy bWQ cdo aPg @@ -107000,7 +107063,7 @@ cvb cvd cvd cNa -cNp +ctE ber cIQ cgB @@ -107257,7 +107320,7 @@ cuV cyv cuV cNb -cNq +cvZ beW cIM cgB @@ -108022,7 +108085,7 @@ cqs cqG crt cdm -ctl +cmT cuL cvd cAp @@ -108279,7 +108342,7 @@ bxz bwP cBn cBH -ctE +ctl cuM cvg cBa @@ -111626,7 +111689,7 @@ ciL cLr cwQ bPx -bod +cwa beW bXX cIM @@ -111883,7 +111946,7 @@ con coo cwR bPy -bVY +cNm bWn bYO cJc @@ -114200,7 +114263,7 @@ ckq bgf beB cxC -bgq +stP cjA biy bjN @@ -117286,7 +117349,7 @@ bdM cNA bhb ciE -cmT +cNp cnB csh cHV @@ -118800,7 +118863,7 @@ bNE cww cpO bYP -cRg +cMI cMH cww cMb @@ -119577,7 +119640,7 @@ chn eCy chL cMv -cMI +cMJ anr aaa aaa @@ -119834,7 +119897,7 @@ chp chx chM gDY -jiZ +mqE anr aaa aaa @@ -120088,7 +120151,7 @@ uVD mqB dpO tZC -qWY +cwB rUl cMw cfs @@ -120602,8 +120665,8 @@ sRD nAF cgz cJH -cwB -cMl +qWY +cJH cMx cMJ cxc @@ -121366,7 +121429,7 @@ bSb cKS cKY bQO -cLc +cMO eIh bYd tXV @@ -121376,7 +121439,7 @@ cwB cMc cMm cMy -cML +dSZ cLa cKY cLu @@ -122394,7 +122457,7 @@ bTH cKU cKY cLa -cLc +cMO fgS car cwB @@ -122404,7 +122467,7 @@ cwB cMg cMq cMB -cML +dSZ cMQ cKY cLw @@ -123175,8 +123238,8 @@ cLs cLs cMs cME -cMN -aaU +mDW +dnN bZR caJ bpq @@ -123422,7 +123485,7 @@ bTK cKW cKY bQV -cLc +cMO cLk ctk prx @@ -123433,7 +123496,7 @@ prx iQY cMF cMO -cMS +jAv cMT cLy blM diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index e907602d59..07902b28b1 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -3535,9 +3535,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "ajL" = ( @@ -3823,6 +3821,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "akn" = ( @@ -79384,6 +79385,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 3ff364fa5c..408efad32f 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -48007,8 +48007,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/closet/wardrobe/mixed, /obj/machinery/light/small, +/obj/effect/turf_decal/delivery, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/crew_quarters/locker) "bzo" = ( @@ -48767,7 +48768,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "bAA" = ( -/obj/structure/table, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -48777,11 +48777,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/storage/backpack{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/backpack, /obj/machinery/firealarm{ dir = 8; pixel_x = 26 @@ -49398,6 +49393,7 @@ dir = 1; name = "recreation camera" }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bBy" = ( @@ -54797,11 +54793,6 @@ /area/hallway/secondary/exit/departure_lounge) "bKn" = ( /obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -54810,6 +54801,11 @@ /obj/machinery/airalarm{ pixel_y = 22 }, +/obj/item/storage/backpack{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/backpack, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "bKo" = ( @@ -55425,6 +55421,12 @@ pixel_x = 28; pixel_y = 22 }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "bLd" = ( @@ -60844,6 +60846,11 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/table, +/obj/item/toy/figure/assistant{ + pixel_x = 8; + pixel_y = 6 + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTD" = ( @@ -61021,6 +61028,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{ dir = 10 }, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bTO" = ( @@ -61259,19 +61272,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, -/obj/item/toy/figure/assistant{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/hallway/secondary/entry) "bUi" = ( @@ -71325,15 +71327,16 @@ icon_gib = "magicarp_gib"; icon_living = "magicarp"; icon_state = "magicarp"; - maxHealth = 200; max_co2 = 5; max_tox = 2; + maxHealth = 200; melee_damage_lower = 15; melee_damage_upper = 20; min_oxy = 5; name = "Lia"; real_name = "Lia"; - response_help = "pets"; + response_help_continuous = "pets"; + response_help_simple = "pet"; turns_per_move = 10 }, /turf/open/floor/plasteel/dark, diff --git a/_maps/map_files/LambdaStation/dorms.dmm b/_maps/map_files/LambdaStation/dorms.dmm index a38d2b9e1d..0ed1b0203c 100644 --- a/_maps/map_files/LambdaStation/dorms.dmm +++ b/_maps/map_files/LambdaStation/dorms.dmm @@ -10679,7 +10679,7 @@ light_color = "#e8eaff" }, /obj/machinery/vending/wardrobe/jani_wardrobe{ - products = list(/obj/item/clothing/under/rank/civilian/janitor = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, /obj/item/caution = 10, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, /obj/item/clothing/shoes/galoshes = 2, /obj/item/watertank/janitor = 2, /obj/item/storage/belt/janitor = 2) + products = list(/obj/item/clothing/under/rank/civilian/janitor = 2, /obj/item/cartridge/janitor = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, /obj/item/clothing/suit/caution = 10, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap/nanotrasen = 2, /obj/item/storage/bag/trash = 2, /obj/item/clothing/shoes/galoshes = 2, /obj/item/watertank/janitor = 2, /obj/item/storage/belt/janitor = 2) }, /turf/open/floor/plating, /area/janitor) @@ -13637,7 +13637,7 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "IX" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ @@ -13764,6 +13764,7 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/locker) "Jp" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 3c160180da..958ab2dc5a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4826,6 +4826,7 @@ /obj/machinery/light{ dir = 4 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "aiU" = ( @@ -12681,7 +12682,7 @@ /turf/open/floor/wood, /area/crew_quarters/dorms) "axL" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -23177,6 +23178,9 @@ }, /obj/machinery/light, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/newscaster{ + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/crew_quarters/locker) "aTy" = ( @@ -23190,17 +23194,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"aTz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light, -/obj/machinery/newscaster{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) "aTA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -39921,9 +39914,6 @@ /turf/open/floor/plasteel/dark, /area/bridge) "bzU" = ( -/obj/structure/chair/comfy/teal{ - dir = 4 - }, /obj/structure/chair/comfy/black{ dir = 4 }, @@ -52010,19 +52000,23 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bZV" = ( -/obj/item/storage/toolbox/emergency, -/obj/item/hand_labeler, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/storage/box/lights/mixed, /turf/open/floor/plating, /area/maintenance/port/aft) "bZW" = ( -/obj/item/cigbutt, +/obj/item/cigbutt{ + pixel_x = 6; + pixel_y = -6 + }, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/item/storage/toolbox/emergency, +/obj/item/hand_labeler, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "bZX" = ( @@ -53085,7 +53079,6 @@ }, /area/maintenance/port/aft) "cbG" = ( -/obj/item/storage/box/lights/mixed, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -53178,8 +53171,6 @@ network = list("ss13","medbay") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -55173,7 +55164,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/bloodbankgen, +/obj/vehicle/ridden/wheelchair, /turf/open/floor/plasteel/dark, /area/medical/sleeper) "cfL" = ( @@ -55715,7 +55706,6 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/port/aft) "cgM" = ( @@ -56421,35 +56411,29 @@ /turf/closed/wall, /area/medical/surgery) "cib" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/white/corner, /area/medical/surgery) "cic" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 + dir = 10 }, -/turf/closed/wall, -/area/medical/surgery) -"cid" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/turf/open/floor/plasteel/white/side{ dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/area/medical/surgery) +"cid" = ( +/obj/structure/curtain{ + icon_state = "closed" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "cie" = ( /obj/machinery/firealarm{ dir = 4; pixel_x = -24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -57093,56 +57077,65 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cjw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjx" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/light_switch{ + pixel_x = -26 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjy" = ( -/obj/item/cigbutt, -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/vending/wallmed{ + pixel_y = 29 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white/corner, /area/medical/surgery) "cjz" = ( -/obj/structure/chair, -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"cjA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/closet/secure_closet/medical2, +/turf/open/floor/plasteel/white/corner{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/area/medical/surgery) +"cjA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, /area/medical/surgery) "cjB" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, +/obj/machinery/iv_drip, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/firealarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "cjC" = ( -/obj/structure/chair, -/turf/open/floor/plasteel/dark, +/obj/structure/table, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_y = 22 + }, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/suit/apron/surgical, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "cjD" = ( -/obj/structure/chair, -/obj/machinery/light/small{ - dir = 1 +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = 5 + }, +/obj/machinery/light_switch{ + pixel_x = 28 + }, +/obj/machinery/vending/wallmed{ + pixel_y = 29 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cjE" = ( /obj/structure/bed/roller, @@ -57153,9 +57146,6 @@ name = "Station Intercom (Medbay)"; pixel_x = -30 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, /obj/machinery/camera{ c_tag = "Medbay Sleepers"; dir = 4; @@ -57171,12 +57161,7 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjG" = ( @@ -57188,7 +57173,6 @@ /area/medical/sleeper) "cjH" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/sleeper) "cjI" = ( @@ -57790,71 +57774,66 @@ /turf/open/floor/plasteel/dark, /area/aisat) "ckU" = ( -/obj/structure/chair, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 +/obj/machinery/computer/operating{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"ckV" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/surgery) -"ckW" = ( -/obj/machinery/holopad, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckX" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckY" = ( -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "ckZ" = ( -/obj/structure/disposalpipe/segment, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white/side{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Observation" - }, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cla" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/medical/surgery) "clb" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, /area/medical/surgery) "clc" = ( -/obj/item/cigbutt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/computer/operating{ dir = 8 }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 }, -/obj/effect/landmark/blobstart, -/turf/open/floor/plasteel/dark, /area/medical/surgery) "cld" = ( /obj/machinery/sleeper{ @@ -57894,6 +57873,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel/white, /area/medical/sleeper) "clg" = ( @@ -57974,6 +57954,9 @@ /area/medical/medbay/central) "cln" = ( /obj/effect/turf_decal/tile/blue, +/obj/vehicle/ridden/wheelchair{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "clo" = ( @@ -58441,26 +58424,32 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cmk" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, +/obj/structure/table/optable, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, /area/medical/surgery) "cml" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, /area/medical/surgery) "cmm" = ( -/obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, /area/medical/surgery) "cmn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Observation" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, /area/medical/surgery) "cmo" = ( /obj/effect/spawner/structure/window, @@ -58903,78 +58892,30 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cnm" = ( -/obj/structure/table, -/obj/item/hemostat, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/floor/plasteel, -/area/medical/surgery) -"cnn" = ( -/obj/structure/table, -/obj/item/surgicaldrill, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side, -/area/medical/surgery) -"cno" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/turf/open/floor/plasteel/white/side, +/obj/structure/sign/poster/official/cleanliness, +/turf/closed/wall, /area/medical/surgery) "cnp" = ( -/obj/structure/table, -/obj/item/cautery{ - pixel_x = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/razor{ - pixel_y = 5 +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Theatre"; + req_access_txt = "45" }, -/turf/open/floor/plasteel/white/side, +/turf/open/floor/plasteel/white, /area/medical/surgery) "cnq" = ( -/obj/structure/table, -/obj/item/retractor, -/turf/open/floor/plasteel, +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, /area/medical/surgery) "cnr" = ( -/obj/machinery/computer/med_data{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27 - }, -/turf/open/floor/plasteel/white/side, -/area/medical/surgery) -"cns" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white/side, +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, /area/medical/surgery) "cnt" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1485; - listening = 0; - name = "Station Intercom (Medbay)"; - pixel_x = 30 - }, -/obj/structure/bedsheetbin{ - pixel_x = 2 - }, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/mask/muzzle, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/glasses/sunglasses/blindfold, -/obj/item/clothing/ears/earmuffs, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/gun/syringe/dart, -/turf/open/floor/plasteel/white/side, +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, /area/medical/surgery) "cnu" = ( /obj/machinery/power/apc{ @@ -59637,89 +59578,96 @@ }, /area/maintenance/port/aft) "coy" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 +/obj/structure/chair{ + dir = 1 }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/vomit/old{ + pixel_x = -2; + pixel_y = 7 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coA" = ( -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coC" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/surgery"; - dir = 4; - name = "Surgery APC"; - pixel_x = 26 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/structure/table, -/obj/item/surgical_drapes, -/turf/open/floor/plasteel/white/side{ - dir = 8 +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coD" = ( -/obj/structure/bed/roller, -/obj/machinery/light/small{ - dir = 8 +/obj/item/cigbutt{ + pixel_x = -8; + pixel_y = 12 }, -/obj/machinery/iv_drip, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 +/obj/structure/chair{ + dir = 1 }, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coF" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/item/trash/popcorn{ + pixel_x = -5; + pixel_y = -4 }, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, /area/medical/surgery) "coG" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/table/optable, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, -/turf/open/floor/plating, /area/medical/surgery) "coH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/cryo) "coI" = ( @@ -60439,96 +60387,90 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cpT" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance"; - req_access_txt = "45" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"cpU" = ( -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpW" = ( -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Operating Theatre"; - req_access_txt = "45" - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpY" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"cpZ" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/holopad, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"cpT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/white, /area/medical/surgery) +"cpW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) +"cpX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) +"cpZ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) "cqa" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/turf/open/floor/plasteel/dark/side{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, /area/medical/surgery) "cqb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ name = "Surgery Observation" }, /turf/open/floor/plasteel/white, /area/medical/surgery) "cqc" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/medical/cryo) "cqd" = ( @@ -61165,66 +61107,36 @@ }, /area/maintenance/port/aft) "crj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, /obj/machinery/light_switch{ - pixel_x = -28 + pixel_x = -26 }, -/turf/open/floor/plasteel/white/side{ +/turf/open/floor/plasteel/white/corner, +/area/medical/surgery) +"crl" = ( +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"crm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) +"crn" = ( +/obj/machinery/light{ dir = 4 }, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) -"crk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"cro" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"crl" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"crm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) -"crn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/surgery) -"cro" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/surgery) "crq" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/light_switch{ - pixel_x = 26 - }, -/turf/open/floor/plasteel/white, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white/side, /area/medical/surgery) "crr" = ( /obj/machinery/airalarm{ @@ -61669,23 +61581,46 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "csj" = ( -/obj/structure/closet/secure_closet/medical2, /obj/structure/sign/warning/nosmoking{ pixel_x = -28 }, -/turf/open/floor/plasteel, +/obj/machinery/limbgrower, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, /area/medical/surgery) "csk" = ( +/obj/machinery/light, +/obj/machinery/bloodbankgen, +/turf/open/floor/plasteel/white, +/area/medical/surgery) +"csl" = ( /obj/machinery/airalarm{ dir = 1; pixel_y = -22 }, -/turf/open/floor/plasteel/white/side{ - dir = 1 +/obj/structure/window/reinforced{ + dir = 8 }, +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/door/window/northleft{ + name = "Surgery Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, /area/medical/surgery) -"csl" = ( -/obj/machinery/light, +"csm" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/obj/machinery/door/window/northright{ + name = "Surgery Supplies"; + red_alert_access = 1; + req_access_txt = "5" + }, /obj/machinery/camera{ c_tag = "Medbay Surgery"; dir = 1; @@ -61693,72 +61628,38 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"csm" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/surgery) "csn" = ( -/obj/item/radio/intercom{ - broadcasting = 1; - frequency = 1485; - listening = 0; - name = "Station Intercom (Medbay)"; - pixel_y = -30 - }, -/obj/structure/closet/crate/freezer/blood, -/turf/open/floor/plasteel, -/area/medical/surgery) -"cso" = ( -/obj/structure/bed/roller, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/chair/office/light{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/surgery) -"csp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"cso" = ( +/obj/item/bedsheet/medical{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/bed{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/surgery) +"csp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, /turf/open/floor/plasteel/white, /area/medical/surgery) "csq" = ( /obj/structure/bed, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, /obj/item/bedsheet/medical, -/obj/machinery/newscaster{ - pixel_y = -32 +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 }, -/obj/machinery/camera{ - c_tag = "Medbay Recovery Room"; - dir = 1; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/turf/open/floor/plasteel/white/side{ dir = 8 }, -/turf/open/floor/plasteel/white, /area/medical/surgery) "csr" = ( /obj/machinery/door/airlock/maintenance{ @@ -62325,8 +62226,12 @@ /turf/open/floor/plating, /area/maintenance/aft) "ctr" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/medical{ + dir = 1 + }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/machinery/airalarm{ dir = 4; @@ -62376,6 +62281,16 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/patients_rooms/room_a) "ctv" = ( @@ -62458,7 +62373,7 @@ "ctD" = ( /obj/structure/sign/directions/evac, /turf/closed/wall, -/area/medical/genetics) +/area/medical/paramedic) "ctE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -62728,29 +62643,38 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cui" = ( -/obj/structure/closet/crate, -/obj/item/coin/silver, -/obj/item/reagent_containers/spray/weedspray, -/obj/item/paper, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +/obj/structure/table/reinforced, +/obj/structure/bedsheetbin{ + pixel_x = 2 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/glasses/sunglasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/item/clothing/glasses/eyepatch, +/obj/item/gun/syringe/dart, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/surgery) "cuj" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable/yellow{ - icon_state = "0-2" +/obj/structure/sign/poster/official/medical_green_cross{ + pixel_y = -32 }, -/obj/machinery/power/apc{ - areastring = "/area/maintenance/port/aft"; - dir = 1; - name = "Port Quarter Maintenance APC"; - pixel_y = 24 +/obj/structure/bed{ + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/item/bedsheet/medical{ + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/medical/surgery) "cuk" = ( /obj/structure/table, /obj/item/folder/white{ @@ -62936,14 +62860,16 @@ }, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, /obj/item/storage/pill_bottle/mutadone, -/obj/item/storage/pill_bottle/mannitol, +/obj/item/storage/pill_bottle/mannitol{ + pixel_x = 5 + }, /obj/structure/table/glass, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62981,10 +62907,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = -5 + }, /turf/open/floor/plasteel/dark, /area/medical/genetics) "cuw" = ( -/obj/structure/filingcabinet/chestdrawer, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -62994,51 +62922,41 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cux" = ( -/obj/structure/noticeboard{ - desc = "A board for pinning important notices upon. Probably helpful for keeping track of requests."; - name = "requests board"; - pixel_x = -32; - pixel_y = 32 +/obj/machinery/computer/crew, +/obj/machinery/vending/wallmed{ + pixel_x = -25 }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cux" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cuy" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "genetics_shutters"; - name = "genetics shutters" +/obj/structure/table/glass, +/obj/item/flashlight/lamp{ + pixel_x = -1; + pixel_y = 11 }, -/turf/open/floor/plating, -/area/medical/genetics) -"cuz" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 +/obj/effect/spawner/lootdrop/cig_packs{ + pixel_x = 5; + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cuA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/blue{ @@ -63047,6 +62965,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cuB" = ( @@ -63346,8 +63267,8 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cvn" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -63528,72 +63449,61 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cvC" = ( -/obj/machinery/firealarm{ - dir = 4; +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/power/apc{ + areastring = "/area/medical/paramedic"; + dir = 8; + name = "Paramedic Station APC"; pixel_x = -24 }, -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "0-4" }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cvD" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, /obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/geneticist, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-8" }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 14 + }, +/obj/effect/landmark/start/paramedic, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cvE" = ( -/obj/structure/table/reinforced, +/obj/structure/table/glass, /obj/item/folder/white{ pixel_x = 4; - pixel_y = -3 + pixel_y = 4 }, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastright{ - dir = 8; - name = "Genetics Desk"; - req_access_txt = "5;9" +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 3 }, -/obj/machinery/door/window/southleft{ - dir = 4; - name = "Outer Window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "genetics_shutters"; - name = "genetics shutters" - }, -/turf/open/floor/plating, -/area/medical/genetics) -"cvF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) +"cvF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/paramedic) "cvG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -63853,7 +63763,14 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cwj" = ( -/obj/item/cigbutt, +/obj/structure/closet/crate, +/obj/item/coin/silver, +/obj/item/reagent_containers/spray/weedspray, +/obj/item/paper, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "cwm" = ( @@ -63865,12 +63782,10 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cwn" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/sunglasses, -/obj/item/flashlight/pen, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/surgery) "cwo" = ( /obj/machinery/light/small{ dir = 8 @@ -64061,20 +63976,15 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cwD" = ( -/obj/item/storage/box/disks{ - pixel_x = 2; - pixel_y = 2 - }, /obj/item/radio/intercom{ name = "Station Intercom (General)"; pixel_x = -29 }, /obj/machinery/camera{ - c_tag = "Genetics Desk"; + c_tag = "Paramedics Office"; dir = 4; network = list("ss13","medbay") }, -/obj/structure/table/glass, /obj/effect/turf_decal/tile/blue{ dir = 1 }, @@ -64082,26 +63992,15 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cwE" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/structure/disposalpipe/segment, -/obj/machinery/button/door{ - id = "genetics_shutters"; - name = "genetics shutters control"; - pixel_x = 28; - req_access_txt = "9" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/medical/paramedic) "cwF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -64109,6 +64008,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cwG" = ( @@ -64333,11 +64233,28 @@ }, /area/maintenance/port/aft) "cxc" = ( -/obj/item/trash/chips, -/turf/open/floor/plating, -/area/maintenance/port/aft) +/obj/machinery/newscaster{ + pixel_y = -32 + }, +/obj/machinery/camera{ + c_tag = "Medbay Recovery Room"; + dir = 1; + network = list("ss13","medbay") + }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/structure/sign/poster/official/love_ian{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/medical/surgery) "cxd" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/rack, +/obj/item/clothing/glasses/sunglasses, +/obj/item/flashlight/pen, +/obj/effect/spawner/lootdrop/maintenance, /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -64383,6 +64300,16 @@ req_access_txt = "5" }, /obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxi" = ( @@ -64491,12 +64418,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "cxu" = ( @@ -64513,57 +64440,62 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cxv" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/medical/genetics) -"cxw" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/stack/packageWrap, -/obj/item/pen, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cxx" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, +/obj/effect/landmark/start/paramedic, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, -/area/medical/genetics) -"cxy" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, +/area/medical/paramedic) +"cxw" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/paramedic, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxx" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light, +/obj/structure/closet/secure_closet/paramedic, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxy" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cxz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cxz" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; location = "10-Aft-To-Central" @@ -64571,6 +64503,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxA" = ( @@ -64580,6 +64518,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxB" = ( @@ -64710,17 +64651,36 @@ }, /area/maintenance/port/aft) "cxR" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/trash/chips, /turf/open/floor/plating, /area/maintenance/port/aft) "cxS" = ( -/obj/item/latexballon, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/oil/streak, /turf/open/floor/plating, /area/maintenance/port/aft) "cxT" = ( -/obj/item/clothing/suit/ianshirt, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "cxU" = ( @@ -64885,6 +64845,7 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/genetics) "cyh" = ( @@ -64892,67 +64853,74 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "cyi" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - id_tag = "AuxGenetics"; - name = "Genetics Lab"; - req_access_txt = "9" +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/paramedic) +"cyk" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/medical/paramedic) +"cyl" = ( +/turf/closed/wall, +/area/medical/paramedic) +"cym" = ( +/obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyj" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cyl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"cym" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, /obj/machinery/door/airlock/research{ id_tag = "AuxGenetics"; name = "Genetics Access"; req_access_txt = "9" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/medical/genetics) "cyn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -26 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cyo" = ( @@ -65278,13 +65246,6 @@ /turf/open/floor/plasteel/white, /area/medical/genetics) "cza" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -65292,65 +65253,66 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "czb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/machinery/camera{ + c_tag = "Genetics Lab"; + dir = 6; + network = list("ss13","medbay") + }, /turf/open/floor/plasteel, /area/medical/genetics) "czc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/light/small{ + dir = 1 }, /turf/open/floor/plasteel, /area/medical/genetics) "czd" = ( -/obj/machinery/light_switch{ - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel, /area/medical/genetics) "cze" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/closed/wall, +/obj/machinery/door/airlock/research{ + id_tag = "AuxGenetics"; + name = "Genetics Access"; + req_access_txt = "9" + }, +/turf/open/floor/plasteel, /area/medical/genetics) "czf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -26 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czg" = ( @@ -65363,9 +65325,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "czh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/button/door{ id = "Skynet_launch"; name = "Mech Bay Door Control"; @@ -65374,6 +65333,7 @@ req_one_access_txt = "29" }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czi" = ( @@ -65928,6 +65888,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/medical/genetics) "cAh" = ( @@ -67855,9 +67818,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEd" = ( @@ -67876,28 +67837,21 @@ pixel_y = -3 }, /obj/item/clothing/gloves/color/latex, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, -/area/medical/morgue) -"cEf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/turf/open/floor/plasteel/dark/side{ + dir = 1 }, +/area/medical/surgery) +"cEf" = ( /turf/closed/wall, /area/hallway/primary/aft) "cEg" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 @@ -67908,13 +67862,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cEi" = ( @@ -68343,12 +68295,18 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEX" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEY" = ( @@ -68357,9 +68315,15 @@ name = "Morgue"; req_access_txt = "6" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cEZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cFa" = ( @@ -68840,6 +68804,9 @@ /area/medical/morgue) "cFY" = ( /obj/structure/closet, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) "cFZ" = ( @@ -68848,6 +68815,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cGa" = ( @@ -72322,17 +72292,14 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cMo" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/machinery/power/apc{ + areastring = "/area/maintenance/port/aft"; + dir = 1; + name = "Port Quarter Maintenance APC"; + pixel_y = 24 }, /obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 + icon_state = "0-8" }, /turf/open/floor/plating, /area/maintenance/port/aft) @@ -72899,10 +72866,16 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cNg" = ( -/obj/structure/rack, -/obj/item/flashlight, -/obj/effect/spawner/lootdrop/maintenance, -/obj/machinery/light/small, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/cigbutt, /turf/open/floor/plating, /area/maintenance/port/aft) "cNh" = ( @@ -75895,8 +75868,12 @@ /turf/closed/wall/r_wall, /area/science/xenobiology) "cUH" = ( -/obj/structure/table/optable, -/turf/open/floor/plasteel/white, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, /area/medical/surgery) "cUL" = ( /obj/docking_port/stationary/random{ @@ -79639,9 +79616,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -80246,6 +80220,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/power/apc{ + areastring = "/area/medical/surgery"; + name = "Surgery APC"; + pixel_y = -26 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "dwj" = ( @@ -81359,6 +81341,27 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"foN" = ( +/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, +/obj/machinery/gear_painter, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/locker) +"fpa" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = -30 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "fpY" = ( /turf/closed/wall, /area/crew_quarters/cryopod) @@ -81457,6 +81460,32 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"gtn" = ( +/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/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/dark, +/area/medical/genetics) +"gwW" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gEk" = ( /obj/structure/cable/yellow{ icon_state = "2-8" @@ -81519,6 +81548,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/security/vacantoffice) +"hny" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/curtain, +/turf/open/floor/plasteel/white/side, +/area/medical/surgery) "hyP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two" @@ -81766,6 +81800,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"kgN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Theatre"; + req_access_txt = "45" + }, +/turf/open/floor/plasteel/white, +/area/medical/surgery) "krD" = ( /turf/closed/wall, /area/science/circuit) @@ -81939,6 +81982,16 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"lFR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "lGS" = ( /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, @@ -81982,8 +82035,22 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "lWL" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/item/radio/intercom{ + broadcasting = 1; + frequency = 1485; + listening = 0; + name = "Station Intercom (Medbay)"; + pixel_y = -30 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, /area/medical/surgery) "lWY" = ( /obj/machinery/door/airlock/hatch{ @@ -82057,6 +82124,10 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) +"mqC" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/maintenance/port/aft) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -82110,6 +82181,10 @@ icon_state = "panelscorched" }, /area/maintenance/port/aft) +"nho" = ( +/obj/item/latexballon, +/turf/open/floor/plating, +/area/maintenance/port/aft) "nhy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -82265,6 +82340,12 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"oeQ" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ohj" = ( /obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, @@ -82519,6 +82600,16 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"qee" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "qhe" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -82627,6 +82718,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) +"reM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "roa" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -82650,6 +82751,13 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"rvd" = ( +/obj/structure/rack, +/obj/item/flashlight, +/obj/effect/spawner/lootdrop/maintenance, +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/maintenance/port/aft) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -82759,6 +82867,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"sos" = ( +/obj/structure/mirror, +/turf/closed/wall, +/area/medical/surgery) "sqe" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/open/space/basic, @@ -82780,6 +82892,17 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) +"sBC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/medical/paramedic) +"sCN" = ( +/obj/item/clothing/suit/ianshirt, +/turf/open/floor/plating, +/area/maintenance/port/aft) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82954,6 +83077,13 @@ /obj/item/flashlight, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"umv" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "upN" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -83074,6 +83204,14 @@ }, /turf/open/floor/wood, /area/security/vacantoffice) +"vwZ" = ( +/obj/machinery/atmospherics/pipe/manifold4w/general{ + color = "#0000ff" + }, +/turf/open/floor/plasteel/dark/side{ + dir = 1 + }, +/area/medical/surgery) "vxG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -97423,7 +97561,7 @@ blU aiT bEs bHJ -aiT +lFR iSt mcS alK @@ -100807,7 +100945,7 @@ cwi dux dux dux -aaa +dux aaa cBR cCK @@ -101062,10 +101200,10 @@ cuf cvk cwh bXE +bXE dvq dux aaa -aaa cBR cBR cDE @@ -101318,10 +101456,10 @@ chZ chZ cvl cbx +cfD ceu dux -dux -aaf +mqC aaa aaa cBR @@ -101568,7 +101706,7 @@ cia cia cia cia -cpT +cDP cia cia cia @@ -101576,11 +101714,11 @@ ceu dyg dvt bXE +bXE dvE dux aaf aaf -aaf dBN cDG cEJ @@ -101823,21 +101961,21 @@ cia cjw ckU cmk -cnm +cnt coy -cpU +cUH crj csj cia cug dyg +bXE dDw bXE -cNg +rvd dux aaa aaa -aaa cBR cDH cEK @@ -102076,25 +102214,25 @@ bXE cer dux dwb -cib -cjx -ckV +cia +cjC +cla cml -cnn +cnt coz -coz -crk +cUH +crq csk cia cuh cvm cDK -cxc +ceu cxR +oeQ dux aaa aaa -aaa dBN cDI cEL @@ -102333,11 +102471,11 @@ bXE bYJ dux dwe +cia +cjB +cpT cic -cjy -ckW -cmk -cno +cnr coA cUH crl @@ -102346,12 +102484,12 @@ cia ceu ceu dyg +ceu dux dux dux aaa aaa -aaa cBR cDJ cEM @@ -102590,25 +102728,25 @@ dvt dux dux dwb -cic +cia cjz ckX cmm cnp coB -coB +vwZ crm csm cia -cui +dux cwj -dyg +cNg +ceu dux -cxS +nho dux aaf aaf -aaf cBR cBR cBR @@ -102847,23 +102985,23 @@ cdi dux cdl dwb -cic -cjA -ckY -cmk +cia +cnm +sos +cid cnq coC cpW crn csn -cia -cdl -cMm -cMo +cui dux -cxT +cxS +cNf +fpa +dux +sCN dux -aaa aaa aaa aaf @@ -103104,25 +103242,25 @@ dux dux cfD dwb -cic cia +cib ckZ -cia -cia -cia +cjA +kgN +coB cpX cia lWL cia -ceu +cia dyg +bXE dyw dux -cxS +nho dux aaa aaa -aaa aaf aaa aaa @@ -103361,20 +103499,20 @@ cdj cse cdj cgL -cid +cia cjB -cla -cmk +cro +ckY cnr coD -cpY -cro +cqa +cnt cso +cuj cia -cfD dyj ceu -dux +ceu dux dux dux @@ -103618,18 +103756,18 @@ cdk ceu cfE dwi -cic +cia cjC clb cmn -cns +cnt coE cpZ -coB +hny csp +cwn csr -duH -dyg +cxT ceu cMm cwm @@ -103875,17 +104013,17 @@ dux dux cfF dwj -cic +cia cjD clc -cmk +coG cnt coF -cqa -crq +cEe +cnt csq +cxc cia -dux diM cwm cNf @@ -104132,20 +104270,20 @@ cdl cev cev cgO -cic cia cia cia cia -coG +cia +cia cqb cia cia cia -cuj -cbx +cia +cMo dDw -bXE +gwW cxU cxU czN @@ -104401,7 +104539,7 @@ csr duH bXE cvn -cwn +dvE cxd cxU cyN @@ -104655,9 +104793,9 @@ coI cqd crs css -dux -dux -dux +cvp +cvp +cvp cxU cxU cxU @@ -108773,7 +108911,7 @@ cvA cwB cxt cyg -cyZ +reM cAd ctA dbr @@ -109285,10 +109423,10 @@ ctA ctA ctA ctA -cxv -cyi ctA ctA +cym +ctA ctA cCi cCW @@ -109538,12 +109676,12 @@ coV cqt cga cKJ -ctB +cyl cuw cvC cwD cxw -cyj +cyl czb cAf cBc @@ -110052,18 +110190,18 @@ coX cnL cga cbC -ctB +cyl cuy cvE -ctB +cxv cxy cyl czd -cAg +gtn ctB cCe cCe -cEe +cCe cEY cCe cCe @@ -110310,11 +110448,11 @@ coY cga csI ctD -cuz cvF -ctB -ctB -cym +sBC +cyl +cyi +cyl cze ctB cBd @@ -110825,18 +110963,18 @@ crG csK ctF car -car +czg car cxA car -czg +car cAi ctF car car -czg -cFb car +cFb +czg car cHO cIF @@ -111082,7 +111220,7 @@ crH csL ctG cgc -cvG +qee chh cxB cyo @@ -111093,7 +111231,7 @@ cCm cpa cEh cFc -chh +umv chh cvG cIG @@ -118481,8 +118619,8 @@ aOD aPK aQV aOu -aTz -aUM +aTt +foN aUM aYe dnh diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 74f7f95c2c..f4d798511f 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -15268,6 +15268,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "axG" = ( @@ -19618,9 +19621,6 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "aEL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, /obj/machinery/status_display{ pixel_y = -32 }, @@ -19635,6 +19635,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel/dark, /area/crew_quarters/dorms) "aEM" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 0356dd1d07..3fb2661cea 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -511,10 +511,10 @@ /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "abi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 10 }, +/obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) "abj" = ( @@ -24603,7 +24603,7 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "beS" = ( -/obj/item/caution, +/obj/item/clothing/suit/caution, /turf/open/floor/plating, /area/maintenance/department/cargo) "beU" = ( @@ -59138,6 +59138,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/engine) +"qAx" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "qAM" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/item/cigbutt, @@ -60933,6 +60940,10 @@ /obj/effect/turf_decal/plaque, /turf/open/floor/plating, /area/maintenance/department/engine) +"uNA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness/recreation) "uQR" = ( /obj/item/ammo_casing/shotgun/beanbag, /turf/open/floor/plating, @@ -104126,8 +104137,8 @@ aaY awB abe abi -axw -axw +uNA +qAx axw axw aBX diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index bf0e1dc797..7506fbdca3 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -10524,6 +10524,10 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"yl" = ( +/obj/machinery/gear_painter, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "yn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, @@ -43992,7 +43996,7 @@ NS Nd ZL NS -NS +yl Nd CU NS diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm index 9639e37852..51a14594fb 100644 --- a/_maps/shuttles/emergency_nature.dmm +++ b/_maps/shuttles/emergency_nature.dmm @@ -33,8 +33,8 @@ "bg" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical{ - pixel_y = 8; - pixel_x = -2 + pixel_x = -2; + pixel_y = 8 }, /obj/item/storage/toolbox/electrical, /obj/effect/turf_decal/stripes/line, @@ -43,8 +43,8 @@ "bS" = ( /obj/structure/table/reinforced, /obj/item/storage/box/lights/mixed{ - pixel_y = 9; - pixel_x = -5 + pixel_x = -5; + pixel_y = 9 }, /obj/item/storage/box/matches{ pixel_y = 5 @@ -413,8 +413,8 @@ pixel_y = 4 }, /obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy{ - pixel_y = 5; - pixel_x = 6 + pixel_x = 6; + pixel_y = 5 }, /turf/open/floor/plasteel/white, /area/shuttle/escape) @@ -494,8 +494,8 @@ /area/shuttle/escape) "rg" = ( /obj/item/clothing/glasses/welding{ - pixel_y = 8; - pixel_x = 3 + pixel_x = 3; + pixel_y = 8 }, /obj/item/weldingtool/largetank{ pixel_x = -3 @@ -882,8 +882,8 @@ }, /obj/structure/table/glass, /obj/item/storage/box/monkeycubes{ - pixel_y = 10; - pixel_x = 5 + pixel_x = 5; + pixel_y = 10 }, /obj/item/reagent_containers/food/snacks/cube/monkey{ pixel_x = 5 @@ -1156,8 +1156,8 @@ }, /obj/structure/table/glass, /obj/item/clothing/suit/monkeysuit{ - pixel_y = 4; - pixel_x = -2 + pixel_x = -2; + pixel_y = 4 }, /obj/item/clothing/mask/gas/monkeymask{ pixel_x = 5; @@ -1169,6 +1169,7 @@ /obj/machinery/door/airlock/titanium{ name = "Emergency Shuttle Airlock" }, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "ST" = ( @@ -1319,6 +1320,7 @@ name = "Emergency Shuttle Airlock" }, /obj/docking_port/mobile/emergency, +/obj/structure/fans/tiny, /turf/open/floor/plasteel/white, /area/shuttle/escape) "Yu" = ( diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 7fe5fa4876..ecd043a66a 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -55,6 +55,9 @@ //donator items #define LOADOUT_CATEGORY_DONATOR "Donator" +//unlockable items +#define LOADOUT_CATEGORY_UNLOCKABLE "Unlockable" + //how many prosthetics can we have #define MAXIMUM_LOADOUT_PROSTHETICS 2 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 153a82ad5e..8e7cf8763b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -61,7 +61,7 @@ #define BODYPART_NANITES 4 #define HYBRID_BODYPART_DAMAGE_THRESHHOLD 25 //How much damage has to be suffered until the damage threshhold counts as passed -#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 15 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage. +#define HYBRID_BODYPART_THESHHOLD_MINDAMAGE 10 //Which damage value this limb cannot be healed out of via easy nonsurgical means if the threshhold has been passed, state resets if damage value goes below mindamage. #define BODYPART_NOT_DISABLED 0 #define BODYPART_DISABLED_DAMAGE 1 diff --git a/code/__DEFINES/species.dm b/code/__DEFINES/species.dm index efd715b85a..74ca459fa1 100644 --- a/code/__DEFINES/species.dm +++ b/code/__DEFINES/species.dm @@ -5,6 +5,7 @@ #define SPECIES_ANDROID "android" #define SPECIES_ANGEL "angel" #define SPECIES_MAMMAL "mammal" + #define SPECIES_MAMMAL_SYNTHETIC "mammal_synthetic" #define SPECIES_ARACHNID "arachnid" #define SPECIES_INSECT "insect" #define SPECIES_DULLAHAN "dullahan" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index d6db35e68d..e2ace84156 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -40,6 +40,9 @@ #define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded +#define STATUS_EFFECT_MANTRA /datum/status_effect/mantra // a toggled self buff that makes you stronger and more resilient, but drains stamina over time +#define STATUS_EFFECT_ASURA /datum/status_effect/asura // like a weaker version of mantra, drains HP instead of stamina and has no armor + ///////////// // DEBUFFS // ///////////// @@ -102,10 +105,6 @@ #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus -#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk. - -#define STATUS_EFFECT_PENIS_ENLARGEMENT /datum/status_effect/chem/penis_enlarger //More applied slowdown, just like the above. - #define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it #define STATUS_EFFECT_MESMERIZE /datum/status_effect/mesmerize //Just reskinned no_combat_mode diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 583427cab7..76ca97cd3a 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -86,10 +86,6 @@ if (CONFIG_GET(flag/log_attack)) WRITE_LOG(GLOB.world_attack_log, "ATTACK: [text]") -/proc/log_wounded(text) - if (CONFIG_GET(flag/log_attack)) - WRITE_LOG(GLOB.world_attack_log, "WOUND: [text]") - /proc/log_manifest(ckey, datum/mind/mind,mob/body, latejoin = FALSE) if (CONFIG_GET(flag/log_manifest)) WRITE_LOG(GLOB.world_manifest_log, "[ckey] \\ [body.real_name] \\ [mind.assigned_role] \\ [mind.special_role ? mind.special_role : "NONE"] \\ [latejoin ? "LATEJOIN":"ROUNDSTART"]") diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index e4a2e6521a..a860a8cd3f 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -238,8 +238,11 @@ CHECK_TICK SSdbcore.SetRoundEnd() //Collects persistence features - if(mode.allow_persistence_save) - SSpersistence.CollectData() + if(mode.station_was_nuked) + SSpersistence.station_was_destroyed = TRUE + if(!mode.allow_persistence_save) + SSpersistence.station_persistence_save_disabled = TRUE + SSpersistence.CollectData() //stop collecting feedback during grifftime SSblackbox.Seal() diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 794a495ae3..d95c89d19e 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -271,7 +271,7 @@ Turf and target are separate in case you want to teleport some distance from a t if(skip_mindless && (!M.mind && !M.ckey)) if(!isbot(M) && !iscameramob(M) && !ismegafauna(M)) continue - if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins + if(M.client?.holder?.fakekey && isobserver(M)) continue var/name = avoid_assoc_duplicate_keys(M.name, namecounts) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 0444e42e91..7fad1690e6 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -275,7 +275,7 @@ GLOBAL_LIST_INIT(wisdoms, world.file2list("strings/wisdoms.txt")) //LANGUAGE CHARACTER CUSTOMIZATION GLOBAL_LIST_INIT(speech_verbs, list("default","says","gibbers", "states", "chitters", "chimpers", "declares", "bellows", "buzzes" ,"beeps", "chirps", "clicks", "hisses" ,"poofs" , "puffs", "rattles", "mewls" ,"barks", "blorbles", "squeaks", "squawks", "flutters", "warbles")) -GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc)) +GLOBAL_LIST_INIT(roundstart_tongues, list("default","human tongue" = /obj/item/organ/tongue, "lizard tongue" = /obj/item/organ/tongue/lizard, "skeleton tongue" = /obj/item/organ/tongue/bone, "fly tongue" = /obj/item/organ/tongue/fly, "ipc tongue" = /obj/item/organ/tongue/robot/ipc, "xeno tongue" = /obj/item/organ/tongue/alien)) //SPECIES BODYPART LISTS //locked parts are those that your picked species requires to have diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 0f0ac52214..4a61a94dc7 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -9,5 +9,6 @@ GLOBAL_LIST_INIT(loadout_categories, list( LOADOUT_CATEGORY_SHOES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLOVES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLASSES = LOADOUT_SUBCATEGORIES_NONE, - LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE + LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE, + LOADOUT_CATEGORY_UNLOCKABLE = LOADOUT_SUBCATEGORIES_NONE )) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 694e913d53..b41b7356a8 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/effect/spawner/lootdrop/welder_tools = 3, /obj/effect/spawner/lootdrop/low_tools = 5, /obj/item/relic = 3, - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 2, + /obj/item/weaponcrafting/receiver = 2, /obj/item/clothing/head/cone = 2, /obj/item/grenade/smokebomb = 2, /obj/item/geiger_counter = 3, diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 67e4a97894..dc8e9e1859 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -566,3 +566,20 @@ config_entry_value = 0.333 min_val = 0 integer = FALSE + +/// Amount of dirtyness tiles need to spawn dirt. +/datum/config_entry/number/turf_dirt_threshold + config_entry_value = 100 + min_val = 1 + integer = TRUE + +/// Alpha dirt starts at +/datum/config_entry/number/dirt_alpha_starting + config_entry_value = 127 + max_val = 255 + min_val = 0 + integer = TRUE + +/// Dirtyness multiplier for making turfs dirty +/datum/config_entry/number/turf_dirty_multiplier + config_entry_value = 1 diff --git a/code/controllers/configuration/entries/persistence.dm b/code/controllers/configuration/entries/persistence.dm new file mode 100644 index 0000000000..2444034b86 --- /dev/null +++ b/code/controllers/configuration/entries/persistence.dm @@ -0,0 +1,20 @@ +/// Whether or not to use the persistence system for cleanable objects +/datum/config_entry/flag/persistent_debris + config_entry_value = FALSE + +/// Whether or not to nuke all roundstart debris that isn't due to persistence if the above is true +/datum/config_entry/flag/persistent_debris_only + config_entry_value = TRUE + +/// Max amount of objects to store, total +/datum/config_entry/number/persistent_debris_global_max + config_entry_value = 10000 + integer = TRUE + +/// Max amount of objects to store per type +/datum/config_entry/number/persistent_debris_type_max + config_entry_value = 2000 + integer = TRUE + +/// Wipe dirty stuff on nuke +/datum/config_entry/flag/persistent_debris_wipe_on_nuke diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 51d56545b6..da3bb24a2f 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -115,18 +115,22 @@ SUBSYSTEM_DEF(garbage) lastlevel = level - for (var/refID in queue) - if (!refID) + //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. + //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. + for (var/i in 1 to length(queue)) + var/list/L = queue[i] + if (length(L) < 2) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = queue[refID] + var/GCd_at_time = L[1] if(GCd_at_time > cut_off_time) break // Everything else is newer, skip them count++ + var/refID = L[2] var/datum/D D = locate(refID) @@ -202,10 +206,7 @@ SUBSYSTEM_DEF(garbage) D.gc_destroyed = gctime var/list/queue = queues[level] - if (queue[refid]) - queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list. - - queue[refid] = gctime + queue[++queue.len] = list(gctime, refid) // not += for byond reasons #ifdef LEGACY_REFERENCE_TRACKING /datum/controller/subsystem/garbage/proc/add_type_to_findref(type) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4963e33cc3..779ee2fbac 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -698,6 +698,8 @@ SUBSYSTEM_DEF(job) if(polychromic && istype(polychromic)) var/list/polychromic_entry = polychromic.colors_by_atom[I] if(polychromic_entry) + if(polychromic.suits_with_helmet_typecache[I.type]) //is this one of those toggleable hood/helmet things? + polychromic.connect_helmet(I,i[LOADOUT_COLOR]) polychromic.colors_by_atom[I] = i[LOADOUT_COLOR] I.update_icon() else diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 2ea3b29c91..90908bbde0 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -41,6 +41,8 @@ SUBSYSTEM_DEF(mapping) var/datum/space_level/transit var/datum/space_level/empty_space var/num_of_res_levels = 1 + /// Lookup for zlevel to station z. text = num. + var/list/z_to_station_z_index var/stat_map_name = "Loading..." @@ -259,6 +261,16 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") return parsed_maps +/datum/controller/subsystem/mapping/proc/setup_station_z_index() + z_to_station_z_index = list() + var/sz = 1 + var/cz = station_start + if(islist(config.map_file)) + for(var/map in config.map_file) + z_to_station_z_index["[cz++]"] = sz++ + else + z_to_station_z_index["[station_start]"] = 1 + /datum/controller/subsystem/mapping/proc/loadWorld() //if any of these fail, something has gone horribly, HORRIBLY, wrong var/list/FailedZs = list() @@ -271,6 +283,8 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") LoadGroup(FailedZs, "Station", config.map_path, config.map_file, config.traits, ZTRAITS_STATION, FALSE, config.orientation) + setup_station_z_index() + if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") query_round_map_name.Execute() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm similarity index 51% rename from code/controllers/subsystem/persistence.dm rename to code/controllers/subsystem/persistence/_persistence.dm index e39242aac3..741d1dd72a 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -5,18 +5,14 @@ SUBSYSTEM_DEF(persistence) name = "Persistence" init_order = INIT_ORDER_PERSISTENCE flags = SS_NO_FIRE - var/list/satchel_blacklist = list() //this is a typecache - var/list/new_secret_satchels = list() //these are objects - var/list/old_secret_satchels = list() + + /// Marks if the station got horribly destroyed + var/station_was_destroyed = FALSE + /// Marks if persistence save should be disabled + var/station_persistence_save_disabled = FALSE var/list/obj/structure/chisel_message/chisel_messages = list() var/list/saved_messages = list() - var/list/saved_modes = list(1,2,3) - var/list/saved_dynamic_rules = list(list(),list(),list()) - var/list/saved_storytellers = list("foo","bar","baz") - var/list/average_dynamic_threat = 50 - var/list/saved_maps - var/list/saved_trophies = list() var/list/spawned_objects = list() var/list/antag_rep = list() var/list/antag_rep_change = list() @@ -28,62 +24,81 @@ SUBSYSTEM_DEF(persistence) var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() - LoadSatchels() - LoadPoly() - LoadChiselMessages() - LoadTrophies() - LoadRecentModes() - LoadRecentStorytellers() - LoadRecentRulesets() - LoadRecentMaps() - LoadPhotoPersistence() + LoadServerPersistence() + LoadGamePersistence() + var/map_persistence_path = get_map_persistence_path() + if(map_persistence_path) + LoadMapPersistence() + return ..() + +/** + * Gets the persistence path of the current map. + */ +/datum/controller/subsystem/persistence/proc/get_map_persistence_path() + ASSERT(SSmapping.config) + if(!SSmapping.config.persistence_key || (SSmapping.config.persistence_key == "NO_PERSIST")) + return null + return "data/persistence/[ckey(SSmapping.config.persistence_key)]" + +/datum/controller/subsystem/persistence/proc/CollectData() + SaveServerPersistence() + if(station_persistence_save_disabled) + return + SaveGamePersistence() + var/map_persistence_path = get_map_persistence_path() + if(map_persistence_path) + SaveMapPersistence() + +/** + * Loads persistent data relevant to the server: Configurations, past gamemodes, votes, antag rep, etc + */ +/datum/controller/subsystem/persistence/proc/LoadServerPersistence() for(var/client/C in GLOB.clients) LoadSavedVote(C.ckey) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() - LoadPanicBunker() - return ..() -/datum/controller/subsystem/persistence/proc/LoadSatchels() - var/placed_satchel = 0 - var/path +/** + * Saves persistent data relevant to the server: Configurations, past gamemodes, votes, antag rep, etc + */ +/datum/controller/subsystem/persistence/proc/SaveServerPersistence() + if(CONFIG_GET(flag/use_antag_rep)) + CollectAntagReputation() + SaveRandomizedRecipes() - var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") - var/list/json = list() - if(fexists(json_file)) - json = json_decode(file2text(json_file)) +/** + * Loads persistent data relevant to the game in general: Photos, etc + * + * Legacy map persistence systems also use this. + */ +/datum/controller/subsystem/persistence/proc/LoadGamePersistence() + LoadChiselMessages() + LoadPhotoPersistence() + LoadPaintings() - old_secret_satchels = json["data"] - var/obj/item/storage/backpack/satchel/flat/F - if(old_secret_satchels && old_secret_satchels.len >= 10) //guards against low drop pools assuring that one player cannot reliably find his own gear. - var/pos = rand(1, old_secret_satchels.len) - F = new() - old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len) - F.x = old_secret_satchels[pos]["x"] - F.y = old_secret_satchels[pos]["y"] - F.z = SSmapping.station_start - path = text2path(old_secret_satchels[pos]["saved_obj"]) +/** + * Saves persistent data relevant to the game in general: Photos, etc + * + * Legacy map persistence systems also use this. + */ +/datum/controller/subsystem/persistence/proc/SaveGamePersistence() + CollectChiselMessages() + SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. + SavePaintings() + SaveScars() - if(F) - if(isfloorturf(F.loc) && !isplatingturf(F.loc)) - F.hide(1) - if(ispath(path)) - var/spawned_item = new path(F) - spawned_objects[spawned_item] = TRUE - placed_satchel++ - var/free_satchels = 0 - for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only - if(isfloorturf(T) && !isplatingturf(T)) - new /obj/item/storage/backpack/satchel/flat/secret(T) - free_satchels++ - if((free_satchels + placed_satchel) == 10) //ten tiles, more than enough to kill anything that moves - break +/** + * Loads persistent data relevant to the current map: Objects, etc. + */ +/datum/controller/subsystem/persistence/proc/LoadMapPersistence() + return -/datum/controller/subsystem/persistence/proc/LoadPoly() - for(var/mob/living/simple_animal/parrot/Poly/P in GLOB.alive_mob_list) - twitterize(P.speech_buffer, "polytalk") - break //Who's been duping the bird?! +/** + * Saves persistent data relevant to the current map: Objects, etc. + */ +/datum/controller/subsystem/persistence/proc/SaveMapPersistence() + return /datum/controller/subsystem/persistence/proc/LoadChiselMessages() var/list/saved_messages = list() @@ -130,63 +145,6 @@ SUBSYSTEM_DEF(persistence) log_world("Loaded [saved_messages.len] engraved messages on map [SSmapping.config.map_name]") -/datum/controller/subsystem/persistence/proc/LoadTrophies() - if(fexists("data/npc_saves/TrophyItems.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/TrophyItems.sav") - var/saved_json - S >> saved_json - if(!saved_json) - return - saved_trophies = json_decode(saved_json) - fdel("data/npc_saves/TrophyItems.sav") - else - var/json_file = file("data/npc_saves/TrophyItems.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_trophies = json["data"] - SetUpTrophies(saved_trophies.Copy()) - -/datum/controller/subsystem/persistence/proc/LoadRecentModes() - var/json_file = file("data/RecentModes.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_modes = json["data"] - -/datum/controller/subsystem/persistence/proc/LoadRecentRulesets() - var/json_file = file("data/RecentRulesets.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_dynamic_rules = json["data"] - -/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers() - var/json_file = file("data/RecentStorytellers.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_storytellers = json["data"] - if(saved_storytellers.len > 3) - average_dynamic_threat = saved_storytellers[4] - saved_storytellers.len = 3 - -/datum/controller/subsystem/persistence/proc/LoadRecentMaps() - var/json_file = file("data/RecentMaps.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - saved_maps = json["maps"] /datum/controller/subsystem/persistence/proc/LoadAntagReputation() var/json = file2text(FILE_ANTAG_REP) @@ -207,59 +165,6 @@ SUBSYSTEM_DEF(persistence) return saved_votes[ckey] = json["data"] -/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) - for(var/A in GLOB.trophy_cases) - var/obj/structure/displaycase/trophy/T = A - if (T.showpiece) - continue - T.added_roundstart = TRUE - - var/trophy_data = pick_n_take(trophy_items) - - if(!islist(trophy_data)) - continue - - var/list/chosen_trophy = trophy_data - - if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed - continue - - var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null - if(!path) - continue - - T.showpiece = new /obj/item/showpiece_dummy(T, path) - T.trophy_message = chosen_trophy["message"] - T.placer_key = chosen_trophy["placer_key"] - T.update_icon() - -/datum/controller/subsystem/persistence/proc/CollectData() - CollectChiselMessages() - CollectSecretSatchels() - CollectTrophies() - CollectRoundtype() - if(istype(SSticker.mode, /datum/game_mode/dynamic)) - var/datum/game_mode/dynamic/mode = SSticker.mode - CollectStoryteller(mode) - CollectRulesets(mode) - RecordMaps() - SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. - if(CONFIG_GET(flag/use_antag_rep)) - CollectAntagReputation() - SaveRandomizedRecipes() - SavePanicBunker() - SavePaintings() - SaveScars() - -/datum/controller/subsystem/persistence/proc/LoadPanicBunker() - var/bunker_path = file("data/bunker_passthrough.json") - if(fexists(bunker_path)) - var/list/json = json_decode(file2text(bunker_path)) - GLOB.bunker_passthrough = json["data"] - for(var/ckey in GLOB.bunker_passthrough) - if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) - GLOB.bunker_passthrough -= ckey - /datum/controller/subsystem/persistence/proc/GetPhotoAlbums() var/album_path = file("data/photo_albums.json") if(fexists(album_path)) @@ -329,35 +234,6 @@ SUBSYSTEM_DEF(persistence) WRITE_FILE(frame_path, frame_json) -/datum/controller/subsystem/persistence/proc/CollectSecretSatchels() - satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar)) - var/list/satchels_to_add = list() - for(var/A in new_secret_satchels) - var/obj/item/storage/backpack/satchel/flat/F = A - if(QDELETED(F) || F.z != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM) - continue - var/list/savable_obj = list() - for(var/obj/O in F) - if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1)) - continue - if(O.persistence_replacement) - savable_obj += O.persistence_replacement - else - savable_obj += O.type - if(isemptylist(savable_obj)) - continue - var/list/data = list() - data["x"] = F.x - data["y"] = F.y - data["saved_obj"] = pick(savable_obj) - satchels_to_add += list(data) - - var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") - var/list/file_data = list() - fdel(json_file) - file_data["data"] = old_secret_satchels + satchels_to_add - WRITE_FILE(json_file, json_encode(file_data)) - /datum/controller/subsystem/persistence/proc/CollectChiselMessages() var/json_file = file("data/npc_saves/ChiselMessages[SSmapping.config.map_name].json") @@ -373,84 +249,6 @@ SUBSYSTEM_DEF(persistence) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) saved_messages += list(M.pack()) // dm eats one list - -/datum/controller/subsystem/persistence/proc/CollectTrophies() - var/json_file = file("data/npc_saves/TrophyItems.json") - var/list/file_data = list() - file_data["data"] = remove_duplicate_trophies(saved_trophies) - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/SavePanicBunker() - var/json_file = file("data/bunker_passthrough.json") - var/list/file_data = list() - file_data["data"] = GLOB.bunker_passthrough - fdel(json_file) - WRITE_FILE(json_file,json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) - var/list/ukeys = list() - . = list() - for(var/trophy in trophies) - var/tkey = "[trophy["path"]]-[trophy["message"]]" - if(ukeys[tkey]) - continue - else - . += list(trophy) - ukeys[tkey] = TRUE - -/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) - if(!T.added_roundstart && T.showpiece) - var/list/data = list() - data["path"] = T.showpiece.type - data["message"] = T.trophy_message - data["placer_key"] = T.placer_key - saved_trophies += list(data) - -/datum/controller/subsystem/persistence/proc/CollectRoundtype() - saved_modes[3] = saved_modes[2] - saved_modes[2] = saved_modes[1] - saved_modes[1] = SSticker.mode.config_tag - var/json_file = file("data/RecentModes.json") - var/list/file_data = list() - file_data["data"] = saved_modes - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) - saved_storytellers.len = 3 - saved_storytellers[3] = saved_storytellers[2] - saved_storytellers[2] = saved_storytellers[1] - saved_storytellers[1] = mode.storyteller.name - average_dynamic_threat = (mode.max_threat + average_dynamic_threat) / 2 - var/json_file = file("data/RecentStorytellers.json") - var/list/file_data = list() - file_data["data"] = saved_storytellers + average_dynamic_threat - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode) - saved_dynamic_rules[3] = saved_dynamic_rules[2] - saved_dynamic_rules[2] = saved_dynamic_rules[1] - saved_dynamic_rules[1] = list() - for(var/r in mode.executed_rules) - var/datum/dynamic_ruleset/rule = r - saved_dynamic_rules[1] += rule.config_tag - var/json_file = file("data/RecentRulesets.json") - var/list/file_data = list() - file_data["data"] = saved_dynamic_rules - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/datum/controller/subsystem/persistence/proc/RecordMaps() - saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") - var/json_file = file("data/RecentMaps.json") - var/list/file_data = list() - file_data["maps"] = saved_maps - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - - /datum/controller/subsystem/persistence/proc/CollectAntagReputation() var/ANTAG_REP_MAXIMUM = CONFIG_GET(number/antag_rep_maximum) diff --git a/code/controllers/subsystem/persistence/cleanable_debris.dm b/code/controllers/subsystem/persistence/cleanable_debris.dm new file mode 100644 index 0000000000..a0817c460b --- /dev/null +++ b/code/controllers/subsystem/persistence/cleanable_debris.dm @@ -0,0 +1,177 @@ +/** + * Persistence for cleanable debris. + */ +/datum/controller/subsystem/persistence + /// tracks if we already loaded debris. Unlike everything else, this can actually be a major problem if some badmin procs it twice. + var/loaded_debris = FALSE + +/datum/controller/subsystem/persistence/LoadMapPersistence() + . = ..() + if(CONFIG_GET(flag/persistent_debris)) + LoadMapDebris() + +/datum/controller/subsystem/persistence/SaveMapPersistence() + . = ..() + if(CONFIG_GET(flag/persistent_debris)) + SaveMapDebris() + +/datum/controller/subsystem/persistence/proc/LoadMapDebris() + if(CONFIG_GET(flag/persistent_debris_only)) + wipe_existing_debris() + if(!fexists("[get_map_persistence_path()]/debris.json")) + return + if(loaded_debris) + return + loaded_debris = TRUE + var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space) + var/list/allowed_z_cache = list() + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + allowed_z_cache[num2text(z)] = TRUE + var/list/data = json_decode(file2text("[get_map_persistence_path()]/debris.json")) + var/list/z_lookup = list() + var/loaded = 0 + var/list/loaded_by_type = list() + var/nopath = 0 + var/badloc = 0 + var/noturf = 0 + /// reverse it + for(var/z in SSmapping.z_to_station_z_index) + var/sz = SSmapping.z_to_station_z_index[z] + z_lookup[num2text(sz)] = text2num(z) + for(var/z in data) + var/actual_z = z_lookup[z] + var/list/L1 = data[z] + for(var/x in L1) + var/list/L2 = data[z][x] + for(var/y in L2) + var/turf/tile = locate(text2num(x), text2num(y), actual_z) + if(!tile) + noturf++ + continue + var/list/objects = data[z][x][y] + for(var/_L in objects) + var/list/objdata + var/path + if(islist(_L)) + objdata = _L + path = text2path(objdata["__PATH__"]) + else + path = text2path(_L) + objdata = objects[_L] + if(!path) + nopath++ + continue + if(!IsValidDebrisLocation(tile, allowed_turf_typecache, allowed_z_cache, path, TRUE)) + badloc++ + continue + var/obj/effect/decal/cleanable/instantiated = new path(tile) + loaded_by_type[path] += 1 + loaded++ + if(objdata) + instantiated.PersistenceLoad(objdata) + var/list/bytype = list() + for(var/path in loaded_by_type) + bytype += "[path] - [loaded_by_type[path]]" + subsystem_log( + {"Debris loading completed: + Errors: + No path: [nopath] + Invalid location: [badloc] + No turf on map: [noturf] + Total loaded: [loaded] + By type: + [bytype.Join("\n")]"} + ) + +/datum/controller/subsystem/persistence/proc/SaveMapDebris() + if(fexists("[get_map_persistence_path()]/debris.json")) + fdel("[get_map_persistence_path()]/debris.json") + if(CONFIG_GET(flag/persistent_debris_wipe_on_nuke) && station_was_destroyed) + return // local janitor cheers on nukeop team to save some work + var/list/data = list() + var/list/z_lookup = SSmapping.z_to_station_z_index + var/list/debris = RelevantPersistentDebris() + var/obj/effect/decal/cleanable/saving + var/global_max = CONFIG_GET(number/persistent_debris_global_max) + var/type_max = CONFIG_GET(number/persistent_debris_type_max) + var/stored = 0 + var/list/stored_by_type = list() + for(var/i in debris) + saving = i + var/list/serializing = list() + var/path = saving.PersistenceSave(serializing) + if(!path) + continue + if(stored_by_type[path] > type_max) + continue + var/text_z = num2text(z_lookup[num2text(saving.z)]) + var/text_y = num2text(saving.y) + var/text_x = num2text(saving.x) + LAZYINITLIST(data[text_z]) + LAZYINITLIST(data[text_z][text_x]) + LAZYINITLIST(data[text_z][text_x][text_y]) + if(saving.persistence_allow_stacking) + serializing["__PATH__"] = path + data[text_z][text_x][text_y] += list(serializing) + else + data[text_z][text_x][text_y][path] = serializing + stored++ + if(stored > global_max) + var/w = "Persistent debris saving globally aborted due to global max >= [global_max]. Either janitors never do their jobs or something is wrong." + message_admins(w) + subsystem_log(w) + return + stored_by_type[path] = stored_by_type[path]? stored_by_type[path] + 1 : 1 + if(stored_by_type[path] > type_max) + var/w = "Persistent debris saving aborted for type [path] due to type max >= [global_max]. Either janitors never do their jobs or something is wrong." + message_admins(w) + subsystem_log(w) + + var/list/bytype = list() + for(var/path in stored_by_type) + bytype += "[path] - [stored_by_type[path]]" + subsystem_log( + {"Debris saving completed: + Total: [stored] + By type: + [bytype.Join("\n")]"} + ) + WRITE_FILE(file("[get_map_persistence_path()]/debris.json"), json_encode(data)) + +/datum/controller/subsystem/persistence/proc/IsValidDebrisLocation(turf/tile, list/allowed_typecache, list/allowed_zcache, obj/effect/decal/cleanable/type, loading = FALSE) + if(!allowed_typecache[tile.type]) + return FALSE + var/area/A = tile.loc + if(!A.persistent_debris_allowed) + return FALSE + if(!allowed_zcache[num2text(tile.z)]) + return FALSE + if(loading) + if(!initial(type.persistence_allow_stacking)) + var/obj/effect/decal/cleanable/C = locate(type) in tile + if(!QDELETED(C)) + return FALSE + // Saving verifies allow stacking in the save proc. + for(var/obj/structure/window/W in tile) + if(W.fulltile) + return FALSE + return TRUE + +/datum/controller/subsystem/persistence/proc/wipe_existing_debris() + var/list/existing = RelevantPersistentDebris() + QDEL_LIST(existing) + +/datum/controller/subsystem/persistence/proc/RelevantPersistentDebris() + var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space) + var/list/allowed_z_cache = list() + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + allowed_z_cache[num2text(z)] = TRUE + . = list() + for(var/obj/effect/decal/cleanable/C in world) + if(!C.loc || QDELETED(C)) + continue + if(!C.persistent) + continue + if(!IsValidDebrisLocation(C.loc, allowed_turf_typecache, allowed_z_cache, C.type, FALSE)) + continue + . += C diff --git a/code/controllers/subsystem/persistence/panic_bunker.dm b/code/controllers/subsystem/persistence/panic_bunker.dm new file mode 100644 index 0000000000..93ada2835c --- /dev/null +++ b/code/controllers/subsystem/persistence/panic_bunker.dm @@ -0,0 +1,26 @@ +/** + * Persists panic bunker whitelisting for a configured period of time + */ +/datum/controller/subsystem/persistence/LoadServerPersistence() + . = ..() + LoadPanicBunker() + +/datum/controller/subsystem/persistence/SaveServerPersistence() + . = ..() + SavePanicBunker() + +/datum/controller/subsystem/persistence/proc/LoadPanicBunker() + var/bunker_path = file("data/bunker_passthrough.json") + if(fexists(bunker_path)) + var/list/json = json_decode(file2text(bunker_path)) + GLOB.bunker_passthrough = json["data"] + for(var/ckey in GLOB.bunker_passthrough) + if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) + GLOB.bunker_passthrough -= ckey + +/datum/controller/subsystem/persistence/proc/SavePanicBunker() + var/json_file = file("data/bunker_passthrough.json") + var/list/file_data = list() + file_data["data"] = GLOB.bunker_passthrough + fdel(json_file) + WRITE_FILE(json_file,json_encode(file_data)) diff --git a/code/controllers/subsystem/persistence/poly_parrot.dm b/code/controllers/subsystem/persistence/poly_parrot.dm new file mode 100644 index 0000000000..64743e9623 --- /dev/null +++ b/code/controllers/subsystem/persistence/poly_parrot.dm @@ -0,0 +1,11 @@ +/** + * Persists poly messages across rounds + */ +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadPoly() + +/datum/controller/subsystem/persistence/proc/LoadPoly() + for(var/mob/living/simple_animal/parrot/Poly/P in GLOB.alive_mob_list) + twitterize(P.speech_buffer, "polytalk") + break //Who's been duping the bird?! diff --git a/code/controllers/subsystem/persistence/recent_votes_etc.dm b/code/controllers/subsystem/persistence/recent_votes_etc.dm new file mode 100644 index 0000000000..f1b902d6ab --- /dev/null +++ b/code/controllers/subsystem/persistence/recent_votes_etc.dm @@ -0,0 +1,107 @@ +/** + * Stores recently played gamemodes, maps, etc. + */ +/datum/controller/subsystem/persistence + var/list/saved_modes = list(1,2,3) + var/list/saved_dynamic_rules = list(list(),list(),list()) + var/list/saved_storytellers = list("foo","bar","baz") + var/list/average_dynamic_threat = 50 + var/list/saved_maps + +/datum/controller/subsystem/persistence/SaveServerPersistence() + . = ..() + CollectRoundtype() + if(istype(SSticker.mode, /datum/game_mode/dynamic)) + var/datum/game_mode/dynamic/mode = SSticker.mode + CollectStoryteller(mode) + CollectRulesets(mode) + RecordMaps() + +/datum/controller/subsystem/persistence/LoadServerPersistence() + . = ..() + LoadRecentModes() + LoadRecentStorytellers() + LoadRecentRulesets() + LoadRecentMaps() + +/datum/controller/subsystem/persistence/proc/CollectRoundtype() + saved_modes[3] = saved_modes[2] + saved_modes[2] = saved_modes[1] + saved_modes[1] = SSticker.mode.config_tag + var/json_file = file("data/RecentModes.json") + var/list/file_data = list() + file_data["data"] = saved_modes + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) + saved_storytellers.len = 3 + saved_storytellers[3] = saved_storytellers[2] + saved_storytellers[2] = saved_storytellers[1] + saved_storytellers[1] = mode.storyteller.name + average_dynamic_threat = (mode.max_threat + average_dynamic_threat) / 2 + var/json_file = file("data/RecentStorytellers.json") + var/list/file_data = list() + file_data["data"] = saved_storytellers + average_dynamic_threat + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/CollectRulesets(var/datum/game_mode/dynamic/mode) + saved_dynamic_rules[3] = saved_dynamic_rules[2] + saved_dynamic_rules[2] = saved_dynamic_rules[1] + saved_dynamic_rules[1] = list() + for(var/r in mode.executed_rules) + var/datum/dynamic_ruleset/rule = r + saved_dynamic_rules[1] += rule.config_tag + var/json_file = file("data/RecentRulesets.json") + var/list/file_data = list() + file_data["data"] = saved_dynamic_rules + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/RecordMaps() + saved_maps = saved_maps?.len ? list("[SSmapping.config.map_name]") | saved_maps : list("[SSmapping.config.map_name]") + var/json_file = file("data/RecentMaps.json") + var/list/file_data = list() + file_data["maps"] = saved_maps + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/LoadRecentModes() + var/json_file = file("data/RecentModes.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_modes = json["data"] + +/datum/controller/subsystem/persistence/proc/LoadRecentRulesets() + var/json_file = file("data/RecentRulesets.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_dynamic_rules = json["data"] + +/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers() + var/json_file = file("data/RecentStorytellers.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_storytellers = json["data"] + if(saved_storytellers.len > 3) + average_dynamic_threat = saved_storytellers[4] + saved_storytellers.len = 3 + +/datum/controller/subsystem/persistence/proc/LoadRecentMaps() + var/json_file = file("data/RecentMaps.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_maps = json["maps"] diff --git a/code/controllers/subsystem/persistence/secret_satchels.dm b/code/controllers/subsystem/persistence/secret_satchels.dm new file mode 100644 index 0000000000..fa2a445317 --- /dev/null +++ b/code/controllers/subsystem/persistence/secret_satchels.dm @@ -0,0 +1,79 @@ +/** + * Secret satchel persistence - allows storing of items in underfloor satchels that's loaded later. + */ +/datum/controller/subsystem/persistence + var/list/satchel_blacklist = list() //this is a typecache + var/list/new_secret_satchels = list() //these are objects + var/list/old_secret_satchels = list() + +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadSatchels() + +/datum/controller/subsystem/persistence/SaveGamePersistence() + . = ..() + CollectSecretSatchels() + +/datum/controller/subsystem/persistence/proc/LoadSatchels() + var/placed_satchel = 0 + var/path + + var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") + var/list/json = list() + if(fexists(json_file)) + json = json_decode(file2text(json_file)) + + old_secret_satchels = json["data"] + var/obj/item/storage/backpack/satchel/flat/F + if(old_secret_satchels && old_secret_satchels.len >= 10) //guards against low drop pools assuring that one player cannot reliably find his own gear. + var/pos = rand(1, old_secret_satchels.len) + F = new() + old_secret_satchels.Cut(pos, pos+1 % old_secret_satchels.len) + F.x = old_secret_satchels[pos]["x"] + F.y = old_secret_satchels[pos]["y"] + F.z = SSmapping.station_start + path = text2path(old_secret_satchels[pos]["saved_obj"]) + + if(F) + if(isfloorturf(F.loc) && !isplatingturf(F.loc)) + F.hide(1) + if(ispath(path)) + var/spawned_item = new path(F) + spawned_objects[spawned_item] = TRUE + placed_satchel++ + var/free_satchels = 0 + for(var/turf/T in shuffle(block(locate(TRANSITIONEDGE,TRANSITIONEDGE,SSmapping.station_start), locate(world.maxx-TRANSITIONEDGE,world.maxy-TRANSITIONEDGE,SSmapping.station_start)))) //Nontrivially expensive but it's roundstart only + if(isfloorturf(T) && !isplatingturf(T)) + new /obj/item/storage/backpack/satchel/flat/secret(T) + free_satchels++ + if((free_satchels + placed_satchel) == 10) //ten tiles, more than enough to kill anything that moves + break + +/datum/controller/subsystem/persistence/proc/CollectSecretSatchels() + satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar)) + var/list/satchels_to_add = list() + for(var/A in new_secret_satchels) + var/obj/item/storage/backpack/satchel/flat/F = A + if(QDELETED(F) || F.z != SSmapping.station_start || F.invisibility != INVISIBILITY_MAXIMUM) + continue + var/list/savable_obj = list() + for(var/obj/O in F) + if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1)) + continue + if(O.persistence_replacement) + savable_obj += O.persistence_replacement + else + savable_obj += O.type + if(isemptylist(savable_obj)) + continue + var/list/data = list() + data["x"] = F.x + data["y"] = F.y + data["saved_obj"] = pick(savable_obj) + satchels_to_add += list(data) + + var/json_file = file("data/npc_saves/SecretSatchels[SSmapping.config.map_name].json") + var/list/file_data = list() + fdel(json_file) + file_data["data"] = old_secret_satchels + satchels_to_add + WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/controllers/subsystem/persistence/trophies.dm b/code/controllers/subsystem/persistence/trophies.dm new file mode 100644 index 0000000000..770ca99125 --- /dev/null +++ b/code/controllers/subsystem/persistence/trophies.dm @@ -0,0 +1,84 @@ +/** + * Stores trophies in curator display cases + */ +/datum/controller/subsystem/persistence + var/list/saved_trophies = list() + +/datum/controller/subsystem/persistence/LoadGamePersistence() + . = ..() + LoadTrophies() + +/datum/controller/subsystem/persistence/SaveGamePersistence() + . = ..() + CollectTrophies() + +/datum/controller/subsystem/persistence/proc/LoadTrophies() + if(fexists("data/npc_saves/TrophyItems.sav")) //legacy compatability to convert old format to new + var/savefile/S = new /savefile("data/npc_saves/TrophyItems.sav") + var/saved_json + S >> saved_json + if(!saved_json) + return + saved_trophies = json_decode(saved_json) + fdel("data/npc_saves/TrophyItems.sav") + else + var/json_file = file("data/npc_saves/TrophyItems.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_trophies = json["data"] + SetUpTrophies(saved_trophies.Copy()) + +/datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) + for(var/A in GLOB.trophy_cases) + var/obj/structure/displaycase/trophy/T = A + if (T.showpiece) + continue + T.added_roundstart = TRUE + + var/trophy_data = pick_n_take(trophy_items) + + if(!islist(trophy_data)) + continue + + var/list/chosen_trophy = trophy_data + + if(!chosen_trophy || isemptylist(chosen_trophy)) //Malformed + continue + + var/path = text2path(chosen_trophy["path"]) //If the item no longer exist, this returns null + if(!path) + continue + + T.showpiece = new /obj/item/showpiece_dummy(T, path) + T.trophy_message = chosen_trophy["message"] + T.placer_key = chosen_trophy["placer_key"] + T.update_icon() + +/datum/controller/subsystem/persistence/proc/CollectTrophies() + var/json_file = file("data/npc_saves/TrophyItems.json") + var/list/file_data = list() + file_data["data"] = remove_duplicate_trophies(saved_trophies) + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) + var/list/ukeys = list() + . = list() + for(var/trophy in trophies) + var/tkey = "[trophy["path"]]-[trophy["message"]]" + if(ukeys[tkey]) + continue + else + . += list(trophy) + ukeys[tkey] = TRUE + +/datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) + if(!T.added_roundstart && T.showpiece) + var/list/data = list() + data["path"] = T.showpiece.type + data["message"] = T.trophy_message + data["placer_key"] = T.placer_key + saved_trophies += list(data) diff --git a/code/datums/action.dm b/code/datums/action.dm index 284df6adda..9e25d0e3f3 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -2,6 +2,7 @@ #define AB_CHECK_STUN 2 #define AB_CHECK_LYING 4 #define AB_CHECK_CONSCIOUS 8 +#define AB_CHECK_ALIVE 16 /datum/action var/name = "Generic Action" @@ -115,6 +116,9 @@ if(check_flags & AB_CHECK_CONSCIOUS) if(owner.stat) return FALSE + if(check_flags & AB_CHECK_ALIVE) + if(owner.stat == DEAD) + return FALSE return TRUE /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index deab5e9b69..33db660c54 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -2,6 +2,12 @@ /obj/item/weaponcrafting icon = 'icons/obj/improvised.dmi' +/obj/item/weaponcrafting/receiver + name = "modular receiver" + desc = "A prototype modular receiver and trigger assembly for a firearm." + icon = 'icons/obj/improvised.dmi' + icon_state = "receiver" + /obj/item/weaponcrafting/stock name = "rifle stock" desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood." @@ -12,41 +18,3 @@ name = "wound thread" desc = "A long piece of thread with some resemblance to cable coil." icon_state = "durastring" - -//////////////////////////////// -// IMPROVISED WEAPON PARTS// -//////////////////////////////// - -/obj/item/weaponcrafting/improvised_parts - name = "Debug Improvised Gun Part" - desc = "A badly coded gun part. You should report coders if you see this." - icon = 'icons/obj/guns/gun_parts.dmi' - icon_state = "palette" - -// RECEIVERS - -/obj/item/weaponcrafting/improvised_parts/rifle_receiver - name = "rifle receiver" - desc = "A crudely constructed receiver to create an improvised bolt-action breechloaded rifle." // removed some text implying that the item had more uses than it does - icon_state = "receiver_rifle" - w_class = WEIGHT_CLASS_SMALL - - -/obj/item/weaponcrafting/improvised_parts/shotgun_receiver - name = "shotgun reciever" - desc = "An improvised receiver to create a break-action breechloaded shotgun." // removed some text implying that the item had more uses than it does - icon_state = "receiver_shotgun" - w_class = WEIGHT_CLASS_SMALL - -// MISC - -/obj/item/weaponcrafting/improvised_parts/trigger_assembly - name = "firearm trigger assembly" - desc = "A modular trigger assembly with a firing pin, this can be used to make a whole bunch of improvised firearss." - icon_state = "trigger_assembly" - w_class = WEIGHT_CLASS_SMALL - -/obj/item/weaponcrafting/improvised_parts/wooden_body - name = "wooden firearm body" - desc = "A crudely fashioned wooden body to help keep higher calibre improvised weapons from blowing themselves apart." - icon_state = "wooden_body" diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 14987bac44..1f4a47c474 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -172,11 +172,11 @@ /////////////////// /datum/crafting_recipe/upgraded_gauze - name = "Improved Gauze" + name = "Sterilized Gauze" result = /obj/item/stack/medical/gauze/adv/one time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, - /datum/reagent/space_cleaner/sterilizine = 10) + /datum/reagent/space_cleaner/sterilizine = 5) category = CAT_MISC subcategory = CAT_TOOL @@ -184,7 +184,7 @@ name = "Suture Pack" result = /obj/item/stack/medical/suture/five time = 1 - reqs = list(/obj/item/stack/medical/gauze = 1, + reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/styptic_powder = 10) category = CAT_MISC subcategory = CAT_TOOL @@ -193,7 +193,7 @@ name = "Regenerative Mesh" result = /obj/item/stack/medical/mesh/five time = 1 - reqs = list(/obj/item/stack/medical/gauze = 1, + reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) category = CAT_MISC subcategory = CAT_TOOL diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index 753adf7ff4..0135cab77f 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -72,6 +72,52 @@ category = CAT_WEAPONRY subcategory = CAT_MELEE +/datum/crafting_recipe/bokken + name = "Training Bokken" + result = /obj/item/melee/bokken + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/bokken_blade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 1) + time = 60 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/bokken_steelwood + name = "Training Steelwood Bokken" + result = /obj/item/melee/bokken/steelwood + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/bokken_steelblade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/leather = 1) + time = 60 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/wakibokken + name = "Training Wakizashi Bokken" + result = /obj/item/melee/bokken/waki + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/wakibokken_blade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + +/datum/crafting_recipe/wakibokken_steelwood + name = "Training Wakizashi Steelwood Bokken" + result = /obj/item/melee/bokken/waki/steelwood + tools = list(TOOL_SCREWDRIVER) + reqs = list(/obj/item/wakibokken_steelblade = 1, + /obj/item/bokken_hilt = 1, + /obj/item/stack/sheet/cloth = 1) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + /datum/crafting_recipe/bola name = "Bola" result = /obj/item/restraints/legcuffs/bola @@ -248,33 +294,18 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/ishotgun +/datum/crafting_recipe/ishotgun name = "Improvised Shotgun" result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised - reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, - /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, - /obj/item/weaponcrafting/stock = 1, - /obj/item/stack/packageWrap = 5) - tools = list(TOOL_SCREWDRIVER) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/irifle // larger and less versatile gun, but a bit easier to make - name = "Improvised Rifle (7.62mm)" - result = /obj/item/gun/ballistic/shotgun/boltaction/improvised - reqs = list(/obj/item/pipe = 2, // above - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 1, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 1, - /obj/item/weaponcrafting/improvised_parts/wooden_body = 1, + reqs = list(/obj/item/pipe = 1, + /obj/item/weaponcrafting/receiver = 1, /obj/item/weaponcrafting/stock = 1, /obj/item/stack/packageWrap = 5) tools = list(TOOL_SCREWDRIVER) time = 100 category = CAT_WEAPONRY subcategory = CAT_WEAPON +//the Improvised Rifle will not be missed. Rest in Pieces 2019-2021 ////////////////// ///AMMO CRAFTING// @@ -403,34 +434,50 @@ // PARTS CRAFTING // //////////////////// -// RECEIVERS +// BOKKEN CRAFTING -/datum/crafting_recipe/rifle_receiver - name = "Improvised Rifle Receiver" - result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver - reqs = list(/obj/item/stack/sheet/metal = 15) - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) - time = 25 - category = CAT_WEAPONRY - subcategory = CAT_PARTS - -/datum/crafting_recipe/shotgun_receiver - name = "Improvised Shotgun Receiver" - result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver - reqs = list(/obj/item/stack/sheet/metal = 10) // shotgun does less damage than the rifle and can't 1shot but is more portable - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) +/datum/crafting_recipe/bokken_blade + name = "Training Bokken Blade" + result = /obj/item/bokken_blade + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 5) time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS -// MISC - -/datum/crafting_recipe/trigger_assembly - name = "Trigger Assembly" - result = /obj/item/weaponcrafting/improvised_parts/trigger_assembly - reqs = list(/obj/item/stack/sheet/metal = 3, - /obj/item/assembly/igniter = 1) - tools = list(TOOL_SCREWDRIVER, TOOL_WELDER) +/datum/crafting_recipe/wakibokken_blade + name = "Training Wakizashi Bokken Blade" + result = /obj/item/wakibokken_blade + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 2) + time = 20 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/bokken_steelblade + name = "Training Ironwood Bokken Blade" + result = /obj/item/bokken_steelblade + tools = list(/obj/item/hatchet, TOOL_WELDER) + reqs = list(/obj/item/grown/log/steel = 2) + time = 20 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/wakibokken_steelblade + name = "Training Wakizashi Ironwood Bokken Blade" + result = /obj/item/wakibokken_steelblade + tools = list(/obj/item/hatchet, TOOL_WELDER) + reqs = list(/obj/item/grown/log/steel = 1) + time = 20 + category = CAT_WEAPONRY + subcategory = CAT_PARTS + +/datum/crafting_recipe/bokken_hilt + name = "Training Bokken hilt" + result = /obj/item/bokken_hilt + tools = list(/obj/item/hatchet) + reqs = list(/obj/item/stack/sheet/mineral/wood = 5, + /obj/item/stack/sheet/cloth = 2) time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm new file mode 100644 index 0000000000..602c93fab3 --- /dev/null +++ b/code/datums/elements/bed_tucking.dm @@ -0,0 +1,60 @@ +/// Tucking element, for things that can be tucked into bed. +/datum/element/bed_tuckable + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + /// our pixel_x offset - how much the item moves x when in bed (+x is closer to the pillow) + var/x_offset = 0 + /// our pixel_y offset - how much the item move y when in bed (-y is closer to the middle) + var/y_offset = 0 + /// our rotation degree - how much the item turns when in bed (+degrees turns it more parallel) + var/rotation_degree = 0 + +/datum/element/bed_tuckable/Attach(obj/target, x = 0, y = 0, rotation = 0) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + x_offset = x + y_offset = y + rotation_degree = rotation + RegisterSignal(target, COMSIG_ITEM_ATTACK_OBJ, .proc/tuck_into_bed) + +/datum/element/bed_tuckable/Detach(obj/target) + . = ..() + UnregisterSignal(target, list(COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_PICKUP)) + +/** + * Tuck our object into bed. + * + * tucked - the object being tucked + * target_bed - the bed we're tucking them into + * tucker - the guy doing the tucking + */ +/datum/element/bed_tuckable/proc/tuck_into_bed(obj/item/tucked, obj/structure/bed/target_bed, mob/living/tucker) + + + if(!istype(target_bed)) + return + + if(!tucker.transferItemToLoc(tucked, target_bed.drop_location())) + return + + to_chat(tucker, "You lay [tucked] out on [target_bed].") + tucked.pixel_x = x_offset + tucked.pixel_y = y_offset + if(rotation_degree) + tucked.transform = turn(tucked.transform, rotation_degree) + RegisterSignal(tucked, COMSIG_ITEM_PICKUP, .proc/untuck) + + return COMPONENT_NO_AFTERATTACK + +/** + * If we rotate our object, then we need to un-rotate it when it's picked up + * + * tucked - the object that is tucked + */ +/datum/element/bed_tuckable/proc/untuck(obj/item/tucked) + + + tucked.transform = turn(tucked.transform, -rotation_degree) + UnregisterSignal(tucked, COMSIG_ITEM_PICKUP) \ No newline at end of file diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index 600bf9250e..5e888e0609 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -165,6 +165,15 @@ /datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list) examine_list += "Alt-click to recolor it." +/datum/element/polychromic/proc/connect_helmet(atom/I, var/applycolor) + if(isitem(I)) + if(istype(I,/obj/item/clothing/suit/hooded)) + var/obj/item/clothing/suit/hooded/Isuit = I + colors_by_atom[Isuit.hood] = applycolor + else if(istype(I,/obj/item/clothing/suit/space/hardsuit)) + var/obj/item/clothing/suit/space/hardsuit/Isuit = I + colors_by_atom[Isuit.helmet] = applycolor + /datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H) if(!isitem(H)) //backup in case if it messes up somehow if(istype(source,/obj/item/clothing/suit/hooded)) //so how come it be like this, where toggleable headslots are named separately (helmet/hood) anyways? diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 5e9371f754..79c12c7fea 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -85,6 +85,15 @@ var/mob/M = teleatom M.cancel_camera() + var/static/list/bread_cache = typecacheof(/obj/item/reagent_containers/food/snacks/store/bread) + var/list/breadlist = typecache_filter_list(teleatom.GetAllContents(), bread_cache) + if(breadlist.len && (channel == TELEPORT_CHANNEL_BLUESPACE || channel == TELEPORT_CHANNEL_QUANTUM)) + for(var/obj/item/reagent_containers/food/snacks/store/bread/bread in breadlist) + bread.bread_teleport() + else if(istype(teleatom, /obj/item/reagent_containers/food/snacks/store/bread)) + var/obj/item/reagent_containers/food/snacks/store/bread/bread = teleatom + bread.bread_teleport() + return TRUE /proc/tele_play_specials(atom/movable/teleatom, atom/location, datum/effect_system/effect, sound) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index f4a53d5c72..fb6b5c9a65 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -573,13 +573,17 @@ duration = 1 MINUTES status_type = STATUS_EFFECT_REPLACE alert_type = /obj/screen/alert/status_effect/regenerative_core + var/heal_amount = 25 /datum/status_effect/regenerative_core/on_apply() . = ..() ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "regenerative_core") - owner.adjustBruteLoss(-25) + + if(HAS_TRAIT(owner, TRAIT_ROBOTIC_ORGANISM)) //Robots can heal from cores, but only get 1/5th of the healing. They can use this to get past the damage threshhold however, and then regularely heal from there. + heal_amount *= 0.2 + owner.adjustBruteLoss(-heal_amount, only_organic = FALSE) if(!AmBloodsucker(owner)) //use your coffin you lazy bastard - owner.adjustFireLoss(-25) + owner.adjustFireLoss(-heal_amount, only_organic = FALSE) owner.remove_CC() owner.bodytemperature = BODYTEMP_NORMAL return TRUE @@ -647,3 +651,120 @@ if(D.severity == DISEASE_SEVERITY_POSITIVE) continue D.cure() + +/datum/status_effect/mantra // available to wizards and admins alone, currently + id = "Mantra" + examine_text = "Their aura is filled with yellow energy!" + alert_type = null + var/damageboost = 10 + var/woundboost = 5 + var/prev_hair_color + var/powerup + var/powerdown + +/datum/status_effect/mantra/on_apply() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/H = owner + playsound(H, 'sound/magic/powerup.ogg', 50, 1) + H.add_filter("mantra_glow", 2, list("type" = "outline", "color" = "#edfa347a", "size" = 2)) + prev_hair_color = H.hair_color + H.hair_color = "ffe11e" + H.update_hair() + ADD_TRAIT(H, TRAIT_PUGILIST, "Mantra") + ADD_TRAIT(H, TRAIT_NOSOFTCRIT, "Mantra") + ADD_TRAIT(H, TRAIT_STUNIMMUNE, "Mantra") + ADD_TRAIT(H, TRAIT_PUSHIMMUNE, "Mantra") + ADD_TRAIT(H, TRAIT_NOGUNS, "Mantra") + H.dna.species.punchdamagehigh += damageboost + H.dna.species.punchdamagelow += damageboost + H.dna.species.punchwoundbonus += woundboost + H.physiology.brute_mod *= 0.9 // slightly resilient against lethal damage, but... + H.physiology.burn_mod *= 0.9 + H.physiology.stamina_mod *= 0.5 // very resistant to non-lethal damage, because they're already draining stamina every second + to_chat(H, "Your inner mantra coalesces around you, granting you incredible strength and durability - but at what cost?") + +/datum/status_effect/mantra/tick() + . = ..() + if(owner.health < HEALTH_THRESHOLD_FULLCRIT) + owner.remove_status_effect(STATUS_EFFECT_MANTRA) + return + if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) + owner.remove_status_effect(STATUS_EFFECT_MANTRA) + return + if(iscarbon(owner)) + var/mob/living/carbon/human/C = owner + C.adjustBruteLoss(-1) // slightly resilient against lethal damage + C.adjustFireLoss(-1) + C.adjustStaminaLoss(3) // in testing i personally found that 2/sec was too minimal and 4/sec was too much + /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura + + else*/ + +/datum/status_effect/mantra/on_remove() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/M = owner + playsound(M, 'sound/magic/powerdown.ogg', 50, 1) + M.remove_filter("mantra_glow") + M.hair_color = prev_hair_color + M.update_hair() + REMOVE_TRAIT(M, TRAIT_PUGILIST, "Mantra") + REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT, "Mantra") + REMOVE_TRAIT(M, TRAIT_STUNIMMUNE, "Mantra") + REMOVE_TRAIT(M, TRAIT_PUSHIMMUNE, "Mantra") + REMOVE_TRAIT(M, TRAIT_NOGUNS, "Mantra") + M.dna.species.punchdamagehigh -= damageboost + M.dna.species.punchdamagelow -= damageboost + M.dna.species.punchwoundbonus -= woundboost + M.physiology.brute_mod /= 0.9 + M.physiology.burn_mod /= 0.9 + M.physiology.stamina_mod /= 0.5 + to_chat(M, "Your inner mantra collapses, for now.") + +/datum/status_effect/asura // mfw miner gear + id = "Asura" + examine_text = "Their aura is filled with red-hot rage!" + alert_type = null + var/damageboost = 10 + var/woundboost = 5 + +/datum/status_effect/asura/on_apply() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/H = owner + playsound(H, 'sound/magic/powerup.ogg', 50, 1) + H.add_filter("asura_glow", 2, list("type" = "outline", "color" = "#fc21217a", "size" = 2)) + ADD_TRAIT(H, TRAIT_PUGILIST, "Asura") + H.dna.species.punchdamagehigh += damageboost + H.dna.species.punchdamagelow += damageboost + H.dna.species.punchwoundbonus += woundboost + to_chat(H, "Your anger unleashes in a crimson blaze around you and corrosive power fills your muscles.") + +/datum/status_effect/asura/tick() + . = ..() + if(owner.health < HEALTH_THRESHOLD_CRIT) + owner.remove_status_effect(STATUS_EFFECT_ASURA) + return + if(owner.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) + owner.remove_status_effect(STATUS_EFFECT_ASURA) + return + if(iscarbon(owner)) + var/mob/living/carbon/human/C = owner + C.adjustBruteLoss(1) // drains 1 hp per second. You're gonna need some Senzu Cores. + C.adjustStaminaLoss(-2) // angry man punch a lot + /*if(SEND_SIGNAL(owner, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) // turning on combat mode flares up your aura + + else*/ + +/datum/status_effect/asura/on_remove() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/human/M = owner + playsound(M, 'sound/magic/powerdown.ogg', 50, 1) + M.remove_filter("asura_glow") + REMOVE_TRAIT(M, TRAIT_PUGILIST, "Asura") + M.dna.species.punchdamagehigh -= damageboost + M.dna.species.punchdamagelow -= damageboost + M.dna.species.punchwoundbonus -= woundboost + to_chat(M, "You calm yourself, and your unnatural strength dissipates.") diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 7f1009d035..9dbbc1c469 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -74,13 +74,19 @@ /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null SHOULD_CALL_PARENT(TRUE) - REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) - REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) + if(blocks_combatmode) + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + if(blocks_sprint) + REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) return TRUE /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) + if(blocks_combatmode) + REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) + if(blocks_sprint) + REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) owner = null qdel(src) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 1eec1ba7fd..2c2cc46344 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -41,6 +41,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station power_environ = FALSE valid_territory = FALSE outdoors = TRUE + persistent_debris_allowed = FALSE ambientsounds = SPACE blob_allowed = FALSE //Eating up space doesn't count for victory as a blob. considered_hull_exterior = TRUE @@ -1123,6 +1124,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Research Division Server Room" icon_state = "server" +/area/science/server/compcore + name = "Computer Core" + icon_state = "server" + /area/science/explab name = "Experimentation Lab" icon_state = "toxmisc" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b9415f3cf8..ff177898cb 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -24,6 +24,10 @@ var/clockwork_warp_allowed = TRUE /// Message to display when the clockwork warp fails var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)" + /// Persistent debris alowed + var/persistent_debris_allowed = TRUE + /// Dirty flooring allowed + var/dirt_buildup_allowed = TRUE /// If mining tunnel generation is allowed in this area var/tunnel_allowed = FALSE diff --git a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm index 20a129a5a3..a3e3c54dce 100644 --- a/code/game/gamemodes/eldritch_cult/eldritch_cult.dm +++ b/code/game/gamemodes/eldritch_cult/eldritch_cult.dm @@ -41,7 +41,6 @@ break var/datum/mind/cultie = antag_pick(antag_candidates) antag_candidates -= cultie - cultie.special_role = ROLE_HERETIC cultie.restricted_roles = restricted_jobs culties += cultie diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm index 38edcd6d8a..b4306d49a4 100644 --- a/code/game/machinery/colormate.dm +++ b/code/game/machinery/colormate.dm @@ -106,15 +106,15 @@ dat += " 1) var/unbuckled = input(user, "Who do you wish to unbuckle?","Unbuckle Who?") as null|mob in buckled_mobs if(user_unbuckle_mob(unbuckled,user)) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 34996177af..5a6d5e54e9 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,6 +1,13 @@ /obj/effect/decal/cleanable gender = PLURAL layer = ABOVE_NORMAL_TURF_LAYER + /// Is this kind of cleanable decal persistent + var/persistent = FALSE + /// Can we stack multiple in one tile? + var/persistence_allow_stacking = FALSE + /// Are we deleted by turf changes? + var/wiped_by_floor_change = FALSE + var/list/random_icon_states = null var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints @@ -29,9 +36,21 @@ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, beauty)), 0) +/** + * A data list is passed into this. + * This should return null to skip saving, or the type of data to save. Type must be /cleanable. + */ +/obj/effect/decal/cleanable/proc/PersistenceSave(list/data) + return type + +/** + * Loads from a data list. + */ +/obj/effect/decal/cleanable/proc/PersistenceLoad(list/data) + return + /obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal - if(mergeable_decal) - qdel(C) + return mergeable_decal /obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/reagent_containers/glass) || istype(W, /obj/item/reagent_containers/food/drinks)) diff --git a/code/game/objects/effects/decals/cleanable/gibs.dm b/code/game/objects/effects/decals/cleanable/gibs.dm index 7df0153ddc..4b63cbecc8 100644 --- a/code/game/objects/effects/decals/cleanable/gibs.dm +++ b/code/game/objects/effects/decals/cleanable/gibs.dm @@ -6,6 +6,7 @@ random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") mergeable_decal = FALSE bloodiness = 0 //This isn't supposed to be bloody. + persistent = TRUE var/body_colors = "#e3ba84" //a default color just in case. var/gibs_reagent_id = /datum/reagent/liquidgibs var/gibs_bloodtype = "A+" @@ -31,6 +32,10 @@ flesh.color = body_colors add_overlay(flesh) +/obj/effect/decal/cleanable/blood/gibs/PersistenceSave(list/data) + . = ..() + return /obj/effect/decal/cleanable/blood/gibs/old + /obj/effect/decal/cleanable/blood/gibs/ex_act(severity, target) return @@ -159,6 +164,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/slime/PersistenceSave(list/data) + . = ..() + return type + /obj/effect/decal/cleanable/blood/gibs/slime/update_icon() add_atom_colour(body_colors, FIXED_COLOUR_PRIORITY) cut_overlays() @@ -198,6 +207,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/synth/PersistenceSave(list/data) + . = ..() + return type + //IPCs /obj/effect/decal/cleanable/blood/gibs/ipc desc = "They look sharp yet oozing." @@ -209,6 +222,10 @@ . = ..() update_icon() +/obj/effect/decal/cleanable/blood/gibs/ipc/PersistenceSave(list/data) + . = ..() + return type + /obj/effect/decal/cleanable/blood/gibs/ipc/update_icon() add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) cut_overlays() diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index fa16a95faf..6d051b6c8c 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -8,12 +8,18 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere. beauty = -100 + persistent = TRUE + var/fixed_color = FALSE /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) + if(C.fixed_color) + qdel(C) + return FALSE if (C.blood_DNA) blood_DNA |= C.blood_DNA + qdel(C) update_icon() - ..() + return FALSE /obj/effect/decal/cleanable/blood/transfer_blood_dna() ..() @@ -24,7 +30,22 @@ update_icon() /obj/effect/decal/cleanable/blood/update_icon() - color = blood_DNA_to_color() + . = ..() + if(!fixed_color) + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) + +/obj/effect/decal/cleanable/blood/PersistenceSave(list/data) + . = ..() + data["color"] = color + +/obj/effect/decal/cleanable/blood/PersistenceLoad(list/data) + . = ..() + if(data["color"]) + fixed_color = TRUE + add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY) + name = "dried blood" + desc = "Looks like it's been here a while. Eew" + bloodiness = 0 /obj/effect/decal/cleanable/blood/old name = "dried blood" @@ -38,6 +59,7 @@ /obj/effect/decal/cleanable/blood/splats random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("splatter1", "splatter2", "splatter3", "splatter4", "splatter5") @@ -48,16 +70,43 @@ random_icon_states = null beauty = -50 +/obj/effect/decal/cleanable/blood/tracks/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + +/obj/effect/decal/cleanable/blood/tracks/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose name = "blood" icon_state = "ltrails_1" desc = "Your instincts say you shouldn't be following these." random_icon_states = null beauty = -50 + persistent = TRUE + persistence_allow_stacking = TRUE var/list/existing_dirs = list() + var/fixed_color = FALSE + +/obj/effect/decal/cleanable/trail_holder/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + data["color"] = color + +/obj/effect/decal/cleanable/trail_holder/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + if(data["color"]) + fixed_color = TRUE + add_atom_colour(data["color"], FIXED_COLOUR_PRIORITY) /obj/effect/decal/cleanable/trail_holder/update_icon() - color = blood_DNA_to_color() + . = ..() + if(!fixed_color) + add_atom_colour(blood_DNA_to_color(), FIXED_COLOUR_PRIORITY) /obj/effect/cleanable/trail_holder/Initialize() . = ..() @@ -84,8 +133,19 @@ var/entered_dirs = 0 var/exited_dirs = 0 blood_state = BLOOD_STATE_BLOOD //the icon state to load images from + persistent = TRUE + persistence_allow_stacking = TRUE var/list/shoe_types = list() +/obj/effect/decal/cleanable/blood/footprints/PersistenceSave(list/data) + . = ..() + data["dir"] = dir + +/obj/effect/decal/cleanable/blood/footprints/PersistenceLoad(list/data) + . = ..() + if(data["dir"]) + setDir(text2num(data["dir"])) + /obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O) if(ishuman(O)) var/mob/living/carbon/human/H = O @@ -143,7 +203,7 @@ return if(color != C.color) return - ..() + return ..() /obj/effect/decal/cleanable/blood/footprints/can_bloodcrawl_in() if((blood_state != BLOOD_STATE_OIL) && (blood_state != BLOOD_STATE_NOT_BLOODY)) diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 044c5c6e86..bb566f4d87 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -12,6 +12,8 @@ icon_state = "ash" mergeable_decal = FALSE beauty = -50 + persistent = TRUE + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/ash/Initialize() . = ..() @@ -38,6 +40,8 @@ icon = 'icons/obj/shards.dmi' icon_state = "tiny" beauty = -100 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/glass/Initialize() . = ..() @@ -53,10 +57,33 @@ name = "dirt" desc = "Someone should clean that up." icon_state = "dirt" + alpha = 127 canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) smooth = SMOOTH_FALSE mouse_opacity = MOUSE_OPACITY_TRANSPARENT beauty = -75 + mergeable_decal = TRUE + persistent = TRUE + wiped_by_floor_change = TRUE + +/obj/effect/decal/cleanable/dirt/Initialize(mapload) + . = ..() + alpha = CONFIG_GET(number/dirt_alpha_starting) + +/obj/effect/decal/cleanable/dirt/proc/dirty(strength = 1) + if(alpha < 255) + alpha += strength + if(alpha > 255) + alpha = 255 + +/obj/effect/decal/cleanable/dirt/PersistenceSave(list/data) + . = ..() + data["alpha"] = alpha + +/obj/effect/decal/cleanable/dirt/PersistenceLoad(list/data) + . = ..() + if(data["alpha"]) + alpha = text2num(data["alpha"]) /obj/effect/decal/cleanable/dirt/Initialize() . = ..() @@ -94,6 +121,8 @@ light_color = LIGHT_COLOR_GREEN icon_state = "greenglow" beauty = -300 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/greenglow/Initialize(mapload) . = ..() @@ -122,6 +151,8 @@ icon_state = "molten" mergeable_decal = FALSE beauty = -150 + persistent = TRUE + persistence_allow_stacking = TRUE /obj/effect/decal/cleanable/molten_object/large name = "big gooey grey mass" @@ -136,6 +167,7 @@ icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") beauty = -150 + persistent = TRUE /obj/effect/decal/cleanable/vomit/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) if(ishuman(user)) @@ -151,6 +183,10 @@ reagents.trans_to(H, reagents.total_volume) qdel(src) +/obj/effect/decal/cleanable/vomit/PersistenceSave(list/data) + . = ..() + return /obj/effect/decal/cleanable/vomit/old + /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." @@ -166,12 +202,16 @@ icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") beauty = -100 + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" @@ -179,6 +219,8 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/pie_smudge //honk name = "smashed pie" @@ -186,6 +228,8 @@ gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/chem_pile name = "chemical pile" @@ -193,6 +237,8 @@ gender = NEUTER icon = 'icons/obj/objects.dmi' icon_state = "ash" + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/shreds name = "shreds" @@ -200,6 +246,8 @@ icon_state = "shreds" gender = PLURAL mergeable_decal = FALSE + mergeable_decal = TRUE + persistent = TRUE /obj/effect/decal/cleanable/shreds/ex_act(severity, target) if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. @@ -222,6 +270,8 @@ desc = "The herpes of arts and crafts." icon = 'icons/effects/atmospherics.dmi' gender = NEUTER + mergeable_decal = TRUE + persistent = FALSE /obj/effect/decal/cleanable/glitter/pink name = "pink glitter" @@ -247,3 +297,5 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") + mergeable_decal = TRUE + persistent = TRUE diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm index 2765330977..8f8f27c3c6 100644 --- a/code/game/objects/effects/decals/cleanable/robots.dm +++ b/code/game/objects/effects/decals/cleanable/robots.dm @@ -11,6 +11,7 @@ bloodiness = BLOOD_AMOUNT_PER_DECAL mergeable_decal = FALSE beauty = -50 + persistent = TRUE /obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases) . = ..() @@ -52,6 +53,7 @@ blood_state = BLOOD_STATE_OIL bloodiness = BLOOD_AMOUNT_PER_DECAL beauty = -100 + persistent = TRUE /obj/effect/decal/cleanable/oil/Initialize() . = ..() @@ -61,8 +63,10 @@ /obj/effect/decal/cleanable/oil/streak random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5") beauty = -50 + persistent = TRUE /obj/effect/decal/cleanable/oil/slippery + persistent = FALSE /obj/effect/decal/cleanable/oil/slippery/Initialize() AddComponent(/datum/component/slippery, 80, (NO_SLIP_WHEN_WALKING | SLIDE)) diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 8cfdad0432..387b8c167d 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -5,6 +5,8 @@ icon_state = "rune1" plane = ABOVE_WALL_PLANE //makes the graffiti visible over a wall. gender = NEUTER + persistent = TRUE + persistence_allow_stacking = TRUE mergeable_decal = FALSE var/do_icon_rotate = TRUE var/rotation = 0 @@ -29,3 +31,35 @@ if(main) paint_colour = main add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) + +/obj/effect/decal/cleanable/crayon/PersistenceSave(list/data) + . = ..() + if(icon != initial(icon)) // no support for alticons yet, awful system anyways + return null + data["icon_state"] = icon_state + data["paint_color"] = paint_colour + if(do_icon_rotate) + data["rotation"] = rotation + data["name"] = name + if(pixel_x != initial(pixel_x)) + data["pixel_x"] = pixel_x + if(pixel_y != initial(pixel_y)) + data["pixel_y"] = pixel_y + +/obj/effect/decal/cleanable/crayon/PersistenceLoad(list/data) + . = ..() + if(data["name"]) + name = data["name"] + if(do_icon_rotate && data["rotation"]) + var/matrix/M = matrix() + M.Turn(text2num(data["rotation"])) + transform = M + if(data["paint_color"]) + paint_colour = data["paint_color"] + add_atom_colour(paint_colour, FIXED_COLOUR_PRIORITY) + if(data["icon_state"]) + icon_state = data["icon_state"] + if(data["pixel_x"]) + pixel_x = data["pixel_x"] + if(data["pixel_y"]) + pixel_y = data["pixel_y"] diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index bacbf3c388..5a0e1790a9 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -664,9 +664,8 @@ lootcount = 1 spawn_on_turf = FALSE loot = list("" = 50, - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 13, - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 13, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 12, + /obj/item/weaponcrafting/receiver = 25, + /obj/item/weaponcrafting/stock = 25, ) /obj/effect/spawner/lootdrop/weapon_parts @@ -674,8 +673,8 @@ lootcount = 1 spawn_on_turf = FALSE loot = list("" = 80, - /obj/item/weaponcrafting/improvised_parts/rifle_receiver = 5, - /obj/item/weaponcrafting/improvised_parts/trigger_assembly = 5, + /obj/item/weaponcrafting/receiver = 5, + /obj/item/weaponcrafting/stock = 5, ) /obj/effect/spawner/lootdrop/ammo diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm index 21cfd1fbad..b7f7f5f2d1 100644 --- a/code/game/objects/items/credit_holochip.dm +++ b/code/game/objects/items/credit_holochip.dm @@ -80,6 +80,17 @@ to_chat(user, "You insert the credits into [src].") update_icon() qdel(H) + if(istype(I, /obj/item/card/id)) + var/obj/item/card/id/ID = I + if(!ID.registered_account) + to_chat(user, "[ID] doesn't have a linked account to deposit into!") + return + for(var/obj/item/holochip/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/stack/spacecash/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/coin/money in src.loc.contents) + ID.attackby(money, user) /obj/item/holochip/AltClick(mob/user) if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7450cb937c..9a722feb6a 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -18,6 +18,7 @@ /obj/item/paicard/Initialize() SSpai.pai_card_list += src add_overlay("pai-off") + AddElement(/datum/element/bed_tuckable, 6, -5, 90) return ..() /obj/item/paicard/Destroy() diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index c3127c246f..86d7766fd5 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -16,9 +16,9 @@ GLOBAL_LIST_EMPTY(power_sinks) throw_speed = 1 throw_range = 2 custom_materials = list(/datum/material/iron=750) - var/drain_rate = 1600000 // amount of power to drain per tick + var/drain_rate = 2000000 // amount of power to drain per tick. Currently 2MJ. var/power_drained = 0 // has drained this much power - var/max_power = 1e10 // maximum power that can be drained before exploding + var/max_power = 2000000000 // maximum power that can be drained before exploding. Currently 2GJ. About 17 minutes to explode at the max rate. var/mode = 0 // 0 = off, 1=clamped (off), 2=operating var/admins_warned = FALSE // stop spam, only warn the admins once that we are about to boom @@ -155,5 +155,5 @@ GLOBAL_LIST_EMPTY(power_sinks) if(power_drained >= max_power) STOP_PROCESSING(SSobj, src) - explosion(src.loc, 4,8,16,32) + explosion(src.loc, 3,7,14,28) qdel(src) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index eb444cdb12..70edd3f43d 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -264,6 +264,30 @@ effective or pretty fucking useless. GLOB.active_jammers -= src update_icon() +/*portable turret*/ +/obj/item/storage/toolbox/emergency/turret + desc = "You feel a strange urge to hit this with a wrench." + +/obj/item/storage/toolbox/emergency/turret/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/analyzer(src) + new /obj/item/wirecutters(src) + +/obj/item/storage/toolbox/emergency/turret/attackby(obj/item/I, mob/living/user, params) + if(I.tool_behaviour == TOOL_WRENCH && user.a_intent == INTENT_HARM) + user.visible_message("[user] bashes [src] with [I]!", \ + "You bash [src] with [I]!", null, COMBAT_MESSAGE_RANGE) + playsound(src, "sound/items/drill_use.ogg", 80, TRUE, -1) + var/obj/machinery/porta_turret/syndicate/pod/toolbox/turret = new(get_turf(loc)) + turret.faction = list("[REF(user)]") + qdel(src) + return + + ..() + /obj/item/headsetupgrader name = "headset upgrader" desc = "A tool that can be used to upgrade a normal headset to be able to protect from flashbangs." diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 014487332c..69f89d0150 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -19,6 +19,7 @@ var/boom_sizes = list(0, 0, 3) var/can_attach_mob = FALSE var/full_damage_on_mobs = FALSE + var/can_gib_mobs = FALSE /obj/item/grenade/plastic/Initialize() . = ..() @@ -72,7 +73,7 @@ explosion(get_step(T, aim_dir), boom_sizes[1], boom_sizes[2], boom_sizes[3]) else explosion(location, boom_sizes[1], boom_sizes[2], boom_sizes[3]) - if(ismob(target)) + if(ismob(target) && can_gib_mobs) var/mob/M = target M.gib() qdel(src) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index a15e1368d8..a541fb8fe3 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -803,6 +803,7 @@ force = 4 throwforce = 0 attack_verb = list("whipped", "repented", "lashed", "flagellated") + slot_flags = ITEM_SLOT_BELT var/praying = FALSE var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 913d73bdad..224c4ffb9b 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -1,17 +1,3 @@ -/obj/item/caution - desc = "Caution! Wet Floor!" - name = "wet floor sign" - icon = 'icons/obj/janitor.dmi' - icon_state = "caution" - lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' - force = 1 - throwforce = 3 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - attack_verb = list("warned", "cautioned", "smashed") - /obj/item/choice_beacon name = "choice beacon" desc = "Hey, why are you viewing this?!! Please let Centcom know about this odd occurance." diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 01ef96b7e8..62a3530afe 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -24,13 +24,17 @@ create_reagents(mopcap, NONE, NO_REAGENTS_VALUE) -/obj/item/mop/proc/clean(turf/A) +/obj/item/mop/proc/clean(turf/A, mob/user) if(reagents.has_reagent(/datum/reagent/water, 1) || reagents.has_reagent(/datum/reagent/water/holywater, 1) || reagents.has_reagent(/datum/reagent/consumable/ethanol/vodka, 1) || reagents.has_reagent(/datum/reagent/space_cleaner, 1)) SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) A.clean_blood() + var/cleaned_something = FALSE for(var/obj/effect/O in A) if(is_cleanable(O)) + cleaned_something = TRUE qdel(O) + if(cleaned_something && user && user.client) + user.client.increment_progress("janitor", 1) reagents.reaction(A, TOUCH, 10) //Needed for proper floor wetting. reagents.remove_any(1) //reaction() doesn't use up the reagents @@ -59,7 +63,7 @@ if(!L.UseStaminaBuffer(stamusage, warn = TRUE)) return user.visible_message("[user] cleans \the [T] with [src].", "You clean \the [T] with [src].") - clean(T) + clean(T, user) user.DelayNextAction(CLICK_CD_MELEE) user.do_attack_animation(T, used_item = src) playsound(T, "slosh", 50, 1) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 3588b7be63..d1174cded7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -48,6 +48,7 @@ /obj/item/toy/plush/Initialize(mapload, set_snowflake_id) . = ..() AddComponent(/datum/component/squeak, squeak_override) + AddElement(/datum/element/bed_tuckable, 6, -5, 90) //have we decided if Pinocchio goes in the blue or pink aisle yet? if(gender == NEUTER) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index a9cd4c33a7..86468af355 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -326,6 +326,9 @@ else if(istype(W, /obj/item/borg/upgrade/ai)) var/obj/item/borg/upgrade/ai/M = W if(check_completion()) + if(!chest.cell) + to_chat(user, "The endoskeleton still needs a power cell!") + return if(!isturf(loc)) to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") return @@ -346,7 +349,6 @@ O.lawupdate = FALSE O.make_laws() - O.cell = chest.cell chest.cell.forceMove(O) chest.cell = null @@ -392,6 +394,7 @@ created_name = new_name else created_name = "" + log_game("[key_name(usr)] renamed [src] ([REF(src)]) to [created_name].") else if(href_list["Master"]) forced_ai = select_active_ai(usr) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 954950f5e6..e2036835ce 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -33,6 +33,20 @@ . = ..() update_desc() +/obj/item/stack/spacecash/attackby(obj/item/W, mob/user, params) + . = ..() + if(istype(W, /obj/item/card/id)) + var/obj/item/card/id/ID = W + if(!ID.registered_account) + to_chat(user, "[ID] doesn't have a linked account to deposit into!") + return + for(var/obj/item/holochip/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/stack/spacecash/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/coin/money in src.loc.contents) + ID.attackby(money, user) + /obj/item/stack/spacecash/c1 icon_state = "spacecash" singular_name = "one credit bill" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 01d684adad..fa92997cba 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -173,11 +173,11 @@ "You hear cutting.") use(2) else if(I.is_drainable() && I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine)) - if(!I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine, 10)) + if(!I.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine, 5)) to_chat(user, "There's not enough sterilizine in [I] to sterilize [src]!") return - user.visible_message("[user] pours the contents of [I] onto [src], sterilizing it.", "You pour the contents of [I] onto [src], sterilizing it.") - I.reagents.remove_reagent(/datum/reagent/space_cleaner/sterilizine, 10) + user.visible_message("[user] sterilizes [src] with the contents of [I].", "You pour the contents of [I] onto [src], sterilizing it.") + I.reagents.remove_reagent(/datum/reagent/space_cleaner/sterilizine, 5) new /obj/item/stack/medical/gauze/adv/one(user.drop_location()) use(1) else @@ -187,6 +187,9 @@ user.visible_message("[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!") return OXYLOSS +/obj/item/stack/medical/gauze/one + amount = 1 + /obj/item/stack/medical/gauze/improvised name = "improvised gauze" singular_name = "improvised gauze" @@ -204,8 +207,9 @@ heal_brute = 6 self_delay = 45 other_delay = 15 - absorption_rate = 0.4 - absorption_capacity = 6 + absorption_rate = 0.5 + absorption_capacity = 12 + splint_factor = 0.15 /obj/item/stack/medical/gauze/adv/one amount = 1 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8526727464..4c1cc0c1cf 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -246,14 +246,12 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_floor = TRUE),\ )), null, \ - new/datum/stack_recipe("wooden firearm body", /obj/item/weaponcrafting/improvised_parts/wooden_body, 10, time = 20), \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 20), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wood, 2, time = 30), \ new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 10),\ new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ - new/datum/stack_recipe("training bokken", /obj/item/melee/bokken, 10, time = 15),\ null, \ new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ @@ -794,7 +792,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( 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))) + new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2))) /obj/item/stack/sheet/plastic name = "plastic" diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index abd862736b..80818b5fff 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -802,7 +802,8 @@ . += "Alt-click it to quickly draw the blade." /obj/item/storage/belt/sabre/PopulateContents() - new starting_sword(src) + if(starting_sword) + new starting_sword(src) /obj/item/storage/belt/sabre/rapier name = "rapier sheath" @@ -864,6 +865,7 @@ var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 2 STR.max_w_class = WEIGHT_CLASS_BULKY + WEIGHT_CLASS_NORMAL //katana and waki. + STR.max_combined_w_class = 7 /obj/item/melee/smith/twohand/katana/on_exit_storage(datum/component/storage/S) var/obj/item/storage/belt/sabre/twin/B = S.parent diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 73246276c2..7a067257cb 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -103,6 +103,39 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) /obj/item/storage/toolbox/mechanical/old/heirloom/PopulateContents() return +/obj/item/storage/toolbox/mechanical/old/clean // the assistant traitor toolbox, damage scales with TC inside + name = "toolbox" + desc = "An old, blue toolbox. It menaces with a sickening miasma of robust energies. You sure about this, Brain?" + icon_state = "toolbox_blue_clean" + force = 19 + throwforce = 22 + wound_bonus = 0 + bare_wound_bonus = 10 + +/obj/item/storage/toolbox/mechanical/old/clean/proc/calc_damage() + var/power = 0 + for (var/obj/item/stack/telecrystal/TC in GetAllContents()) + power += TC.amount + force = 19 + power + throwforce = 22 + power + +/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user) + calc_damage() // one damage for one telecrystal equals about thirty seven(?) damage if you pour ALL your tc + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + calc_damage() + ..() + +/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents() + new /obj/item/screwdriver(src) + new /obj/item/wrench(src) + new /obj/item/weldingtool(src) + new /obj/item/crowbar(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/item/storage/toolbox/electrical name = "electrical toolbox" icon_state = "yellow" diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 16efecec7c..26051e65fd 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -193,7 +193,7 @@ return FALSE stunpwr *= round(stuncharge/hitcost, 0.1) - if(!user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE)) + if(user && !user.UseStaminaBuffer(getweight(user, STAM_COST_BATON_MOB_MULT), warn = TRUE)) return FALSE if(!disarming) @@ -314,12 +314,12 @@ /obj/item/melee/baton/boomerang name = "\improper OZtek Boomerang" desc = "A device invented in 2486 for the great Space Emu War by the confederacy of Australicus, these high-tech boomerangs also work exceptionally well at stunning crewmembers. Just be careful to catch it when thrown!" - throw_speed = 1 + throw_speed = 1.5 icon_state = "boomerang" item_state = "boomerang" force = 5 throwforce = 5 - throw_range = 5 + throw_range = 10 hitcost = 2000 throw_hit_chance = 99 //Have you prayed today? custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) @@ -328,7 +328,7 @@ if(turned_on) if(ishuman(thrower)) var/mob/living/carbon/human/H = thrower - H.throw_mode_off() //so they can catch it on the return. + H.throw_mode_on() //so they can catch it on the return. return ..() /obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3f2dc2506a..07900d6bbf 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -296,8 +296,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 = 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 + force = 10 //how much harm mode damage we do + var/stamina_damage_increment = 5 //how much extra damage do we do when in non-harm mode throwforce = 10 damtype = STAMINA attack_verb = list("whacked", "smacked", "struck") @@ -310,11 +310,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/quick_parry = FALSE // false = default parry, true = really small parry window item_flags = ITEM_CAN_PARRY block_parry_data = /datum/block_parry_data/bokken + var/default_parry_data = /datum/block_parry_data/bokken + var/quick_parry_data = /datum/block_parry_data/bokken/quick_parry bare_wound_bonus = 0 wound_bonus = 0 /datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries - parry_stamina_cost = 8 // be wise about when you parry, though, else you won't be able to fight enough to make it count + parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count parry_time_windup = 0 parry_time_active = 10 // small parry window parry_time_spindown = 0 @@ -330,11 +332,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 ) parry_failed_stagger_duration = 3 SECONDS parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 ) /datum/block_parry_data/bokken/quick_parry // emphasizing REALLY SHORT PARRIES - parry_stamina_cost = 6 // still more costly than most parries, but less than a full bokken parry + parry_stamina_cost = 8 // still more costly than most parries, but less than a full bokken parry parry_time_active = 5 // REALLY small parry window parry_time_perfect = 2.5 // however... parry_time_perfect_leeway = 2 // the entire time, the parry is perfect @@ -371,9 +373,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 . = ..() quick_parry = !quick_parry if(quick_parry) - block_parry_data = /datum/block_parry_data/bokken/quick_parry + block_parry_data = quick_parry_data else - block_parry_data = /datum/block_parry_data/bokken + block_parry_data = default_parry_data to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].") /obj/item/melee/bokken/attackby(obj/item/I, mob/living/user, params) @@ -410,23 +412,76 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(burnt) . += " Burned into the \"blade\" is [burned_in]." +/obj/item/melee/bokken/steelwood + name = "steelwood bokken" + desc = "A misnomer of sorts, this is effectively a blunt katana made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." + icon_state = "bokken_steel" + item_state = "bokken_steel" + force = 12 + stamina_damage_increment = 3 + +/obj/item/melee/bokken/waki + name = "wakizashi bokken" + desc = "A space-Japanese training sword made of wood and shaped like a wakizashi." + icon_state = "wakibokken" + item_state = "wakibokken" + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_NORMAL + force = 6 + stamina_damage_increment = 4 + block_parry_data = /datum/block_parry_data/bokken/waki + default_parry_data = /datum/block_parry_data/bokken/waki + quick_parry_data = /datum/block_parry_data/bokken/waki/quick_parry + +/datum/block_parry_data/bokken/waki // weaker parries than the bigger variant, but cheaper and faster recovery, like quick parry + parry_stamina_cost = 4 + parry_time_windup = 0 + parry_time_active = 6 + parry_time_spindown = 0 + parry_time_perfect = 1.5 + parry_time_perfect_leeway = 1 + parry_imperfect_falloff_percent = 7.5 + parry_efficiency_to_counterattack = 120 + parry_efficiency_considered_successful = 65 + parry_efficiency_perfect = 120 + parry_efficiency_perfect_override = list( + TEXT_ATTACK_TYPE_PROJECTILE = 30, + ) + parry_failed_stagger_duration = 2 SECONDS + parry_data = list( + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 1.5, // 6*1.5 = 9, 7*1.5 = 10.5, 8*1.5 = 12, 9*1.5 = 13.5 + ) + +/datum/block_parry_data/bokken/waki/quick_parry //For the parry spammer in you + parry_stamina_cost = 2 // Slam that parry button + parry_time_active = 2.5 + parry_time_perfect = 1 + parry_time_perfect_leeway = 1 + parry_failed_stagger_duration = 1 SECONDS + parry_failed_clickcd_duration = 1 SECONDS + +/datum/block_parry_data/bokken/waki/quick_parry/proj + parry_efficiency_perfect_override = list() + +/obj/item/melee/bokken/waki/steelwood + name = "wakizashi steelwood bokken" + desc = "A misnomer of sorts, this is effectively a blunt wakizashi made from steelwood, a dense organic wood derived from steelcaps. Why steelwood? Druids can use it. Duh." + icon_state = "wakibokken_steel" + item_state = "wakibokken_steel" + force = 8 + stamina_damage_increment = 2 + /obj/item/melee/bokken/debug name = "funny debug parrying stick" desc = "if you see this you've fucked up somewhere my good man" block_parry_data = /datum/block_parry_data/bokken/debug - -/obj/item/melee/bokken/debug/AltClick(mob/user) - quick_parry = !quick_parry - if(quick_parry) - block_parry_data = /datum/block_parry_data/bokken/quick_parry/debug - else - block_parry_data = /datum/block_parry_data/bokken/debug - to_chat(user, "[src] is now [quick_parry ? "emphasizing shorter parries, forcing you to riposte or be staggered" : "emphasizing longer parries, with a shorter window to riposte but more forgiving parries"].") + default_parry_data = /datum/block_parry_data/bokken/debug + quick_parry_data = /datum/block_parry_data/bokken/quick_parry/debug /datum/block_parry_data/bokken/debug parry_efficiency_perfect_override = list() parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, @@ -436,13 +491,63 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /datum/block_parry_data/bokken/quick_parry/debug parry_efficiency_perfect_override = list() parry_data = list( - PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 7*2.5 = 17.5, 8*2.5 = 20, 9*2.5 = 22.5, 10*2.5 = 25 + PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 2.5, // 10*2.5 = 25, 11*2.5 = 27.5, 12*2.5 = 30, 13*2.5 = 32.5 PARRY_DISARM_ATTACKER = TRUE, PARRY_KNOCKDOWN_ATTACKER = 10, PARRY_STAGGER_ATTACKER = 10, PARRY_DAZE_ATTACKER = 10, ) +/// BOKKEN CRAFTNG PIECES + +/obj/item/bokken_blade + name = "training bokken wooden blade" + desc = "The blade piece of a bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/bokken_steelblade + name = "training bokken steelwood blade" + desc = "The blade piece of a steelwood bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken_steel" + item_state = "switchblade_ext" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/wakibokken_blade + name = "training bokken wooden wakizashi blade" + desc = "The blade piece of a bokken wakizashi." + icon = 'icons/obj/smith.dmi' + icon_state = "wakibokken" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/wakibokken_steelblade + name = "training bokken steelwood wakizashi blade" + desc = "The blade piece of a steelwood bokken katana." + icon = 'icons/obj/smith.dmi' + icon_state = "wakibokken_steel" + item_state = "switchblade_ext" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/bokken_hilt + name = "training bokken hilt" + desc = "The hilt piece of a bokken. This hilt is appropriate for any potential blade length or material." + icon = 'icons/obj/smith.dmi' + icon_state = "bokken_hilt" + item_state = "bone_dagger" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' /obj/item/wirerod name = "wired rod" diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 3de28b38e8..73a21e4a25 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -109,7 +109,7 @@ return user.do_attack_animation(src) . = take_damage(damage_amount, damage_type, damage_flag, sound_effect, get_dir(src, user), armor_penetration) - user.DelayNextAction() + user.DelayNextAction(CLICK_CD_MELEE) /obj/attack_alien(mob/living/carbon/alien/humanoid/user) if(attack_generic(user, 60, BRUTE, "melee", 0)) diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index 5f01a27825..2a703ad675 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -40,6 +40,16 @@ if(istype(W, /obj/item/wrench) && !(flags_1&NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) + else if(istype(W, /obj/item/bedsheet)) + if(user.transferItemToLoc(W, drop_location())) + to_chat(user, "You make \the [src] with [W].") + W.pixel_x = 0 + W.pixel_y = 0 + else if(istype(W, /obj/item/disk/nuclear)) + if(user.transferItemToLoc(W, drop_location())) + to_chat(user, "You tuck little disky into bed. Good night disky.") + W.pixel_x = 6 //make sure they reach the pillow + W.pixel_y = -6 else return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index c36fba96cb..279f581b4d 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -22,6 +22,10 @@ LINEN BINS dog_fashion = /datum/dog_fashion/head/ghost var/list/dream_messages = list("white") +/obj/item/bedsheet/Initialize(mapload) + . = ..() + AddElement(/datum/element/bed_tuckable, 0, 0, 0) + /obj/item/bedsheet/attack(mob/living/M, mob/user) if(!attempt_initiate_surgery(src, M, user)) ..() @@ -243,7 +247,7 @@ LINEN BINS /obj/item/bedsheet/random/Initialize() ..() - var/type = pick(typesof(/obj/item/bedsheet) - list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon)) + var/type = pick(typesof(/obj/item/bedsheet) - (list(/obj/item/bedsheet/random, /obj/item/bedsheet/chameleon) + typesof(/obj/item/bedsheet/unlockable))) new type(loc) return INITIALIZE_HINT_QDEL @@ -257,9 +261,32 @@ LINEN BINS 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.chameleon_blacklist = typecacheof(list(/obj/item/bedsheet/chameleon, /obj/item/bedsheet/random, /obj/item/bedsheet/unlockable), only_root_path = FALSE) chameleon_action.initialize_disguises() +//unlockable bedsheets +/obj/item/bedsheet/unlockable + name = "unlockable bedsheet" + desc = "this shouldn't be here!" + +//janitor: clean 100 messes with mop as janitor +/obj/item/bedsheet/unlockable/janitor + name = "janitor bedsheet" + desc = "A white bedsheet, with a warning sign on the front." + icon_state = "sheetjanitor" + +//cook: use microwave 100 times properly (contents must make one good item) as cook +/obj/item/bedsheet/unlockable/cook + name = "cook bedsheet" + desc = "A grey bedsheet, with a microwave on the front." + icon_state = "sheetcook" + +//miner: redeem 100,000 mining points +/obj/item/bedsheet/unlockable/miner + name = "miner bedsheet" + desc = "A red and black bedsheet. It seems to be made with goliath hide." + icon_state = "sheetminer" + //bedsheet bin /obj/structure/bedsheetbin name = "linen bin" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 21b75e8af3..3af0d0278a 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -70,7 +70,7 @@ new /obj/item/melee/flyswatter(src) new /obj/item/flashlight(src) for(var/i in 1 to 3) - new /obj/item/caution(src) + new /obj/item/clothing/suit/caution(src) new /obj/item/holosign_creator(src) new /obj/item/lightreplacer(src) new /obj/item/soap(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 3cbeae1ce8..4b405ae64a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -96,7 +96,7 @@ new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/analyzer(src) new /obj/item/holosign_creator/atmos(src) - new /obj/item/holosign_creator/firelock(src) + new /obj/item/holosign_creator/firelock(src) //what if atmos techs could test things they are meant to test, wild, innit? new /obj/item/watertank/atmos(src) new /obj/item/clothing/suit/fire/atmos(src) new /obj/item/clothing/head/hardhat/atmos(src) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 10a9f2afd4..0c99188c49 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -73,7 +73,7 @@ l.janicart_insert(user,src) else to_chat(user, fail_msg) - else if(istype(I, /obj/item/caution)) + else if(istype(I, /obj/item/clothing/suit/caution)) if(signs < max_signs) put_in_cart(I, user) signs++ @@ -104,7 +104,7 @@ items += list("Spray bottle" = image(icon = myspray.icon, icon_state = myspray.icon_state)) if(myreplacer) items += list("Light replacer" = image(icon = myreplacer.icon, icon_state = myreplacer.icon_state)) - var/obj/item/caution/sign = locate() in src + var/obj/item/clothing/suit/caution/sign = locate() in src if(sign) items += list("Sign" = image(icon = sign.icon, icon_state = sign.icon_state)) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 493e88d442..7e00b1cf63 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -1,5 +1,12 @@ /turf/open plane = FLOOR_PLANE + /// Does dirt buildup happen on us? + var/dirt_buildup_allowed = FALSE + /// Dirt level. + var/dirtyness = 0 + /// Dirt level to spawn dirt. Null to use config. + var/dirt_spawn_threshold + /// Slowdown applied to mobs on us. var/slowdown = 0 //negative for faster, positive for slower var/postdig_icon_change = FALSE diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 5e8f55feed..9490d728fe 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -9,6 +9,7 @@ canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf bullet_bounce_sound = null //abandon all hope ye who enter + dirt_buildup_allowed = FALSE /turf/open/chasm/Initialize() . = ..() diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm index e29d75a248..add8467ceb 100644 --- a/code/game/turfs/simulated/dirtystation.dm +++ b/code/game/turfs/simulated/dirtystation.dm @@ -8,6 +8,9 @@ //Making the station dirty, one tile at a time. Called by master controller's setup_objects /turf/open/floor/proc/MakeDirty() + if(CONFIG_GET(flag/persistent_debris_only)) + return + if(prob(66)) //fastest possible exit 2/3 of the time return @@ -38,7 +41,7 @@ return //Construction zones. Blood, sweat, and oil. Oh, and dirt. - var/static/list/engine_dirt_areas = typecacheof(list(/area/engine, + var/static/list/engine_dirt_areas = typecacheof(list(/area/engine, /area/crew_quarters/heads/chief, /area/ruin/space/derelict/assembly_line, /area/science/robotics, diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index ddec9750d9..6a4ddea63b 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -5,6 +5,7 @@ name = "floor" icon = 'icons/turf/floors.dmi' baseturfs = /turf/open/floor/plating + dirt_buildup_allowed = TRUE footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT @@ -137,6 +138,9 @@ burnt = 1 /turf/open/floor/proc/make_plating() + for(var/obj/effect/decal/cleanable/C in src) + if(C.wiped_by_floor_change) + qdel(C) return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/ChangeTurf(path, new_baseturf, flags) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index c70332eacb..82e60ed8f6 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -196,7 +196,7 @@ if(M.client && (is_servant_of_ratvar(M) || isobserver(M) || M.stat == DEAD)) viewing += M.client flick_overlay(I, viewing, 8) - L.adjustToxLoss(-3, TRUE, TRUE) + L.adjustToxLoss(-3, TRUE, TRUE, toxins_type = TOX_OMNI) /turf/open/floor/clockwork/try_replace_tile(obj/item/stack/tile/T, mob/user, params) return @@ -278,4 +278,4 @@ heavyfootstep = FOOTSTEP_RUST /turf/open/floor/plating/rust/rust_heretic_act() - return + return diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 35ee06a584..ad3cf86864 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -61,6 +61,9 @@ to_chat(user, "You begin reinforcing the floor...") if(do_after(user, 30, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/open/floor/engine)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) R.use(2) @@ -78,6 +81,9 @@ to_chat(user, "You begin adding glass to the floor...") if(do_after(user, 5, target = src)) if (G.get_amount() >= 2 && !istype(src, /turf/open/transparent/glass)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/transparent/glass, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) G.use(2) @@ -95,6 +101,9 @@ to_chat(user, "You begin adding reinforced glass to the floor...") if(do_after(user, 10, target = src)) if (RG.get_amount() >= 2 && !istype(src, /turf/open/transparent/glass/reinforced)) + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) PlaceOnTop(/turf/open/transparent/glass/reinforced, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) RG.use(2) @@ -110,6 +119,9 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return + for(var/obj/effect/decal/cleanable/decal in src) + if(decal.wiped_by_floor_change) + qdel(decal) if(istype(W, /obj/item/stack/tile/material)) var/turf/newturf = PlaceOnTop(/turf/open/floor/material, flags = CHANGETURF_INHERIT_AIR) newturf.set_custom_materials(W.custom_materials) diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 42b4707b50..f8c6ff1ce2 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -43,6 +43,9 @@ return TRUE if(floor_tile) new floor_tile(src, 2) + for(var/obj/effect/decal/cleanable/C in src) + if(C.wiped_by_floor_change) + qdel(C) ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return TRUE diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 2f223f2c40..e7471478fb 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -6,6 +6,7 @@ gender = PLURAL //"That's some lava." baseturfs = /turf/open/lava //lava all the way down slowdown = 2 + dirt_buildup_allowed = FALSE light_range = 2 light_power = 0.75 diff --git a/code/game/turfs/simulated/reebe_void.dm b/code/game/turfs/simulated/reebe_void.dm index 14aa02065d..3f3bf31f9b 100644 --- a/code/game/turfs/simulated/reebe_void.dm +++ b/code/game/turfs/simulated/reebe_void.dm @@ -6,6 +6,7 @@ planetary_atmos = TRUE bullet_bounce_sound = null //forever falling tiled_dirt = FALSE + dirt_buildup_allowed = FALSE /turf/open/indestructible/reebe_void/Initialize(mapload) . = ..() diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 765c88842e..9c9639e57c 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -3,6 +3,7 @@ icon_state = "0" name = "\proper space" intact = 0 + dirt_buildup_allowed = FALSE temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index f3da1954a9..e532dcc2b2 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -48,6 +48,8 @@ if(C.prefs.toggles & SOUND_PRAYERS) if(usr.job == "Chaplain") SEND_SOUND(C, sound('sound/effects/pray.ogg')) + else + SEND_SOUND(C, sound('sound/effects/ding.ogg')) to_chat(usr, "You pray to the gods: \"[msg_tmp]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index edfa9caa22..bcba1e1e1e 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -38,7 +38,7 @@ dat += "Robeless
" dat += "Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.
" dat += "Martial Artist
" - dat += "Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.
" + dat += "Your apprentice is training in ancient martial arts. They know an Inner Mantra and the Nuclear Fist technique.
" user << browse(dat, "window=radio") onclose(user, "radio") return diff --git a/code/modules/antagonists/abductor/equipment/orderable_gear.dm b/code/modules/antagonists/abductor/equipment/orderable_gear.dm index f21294b041..774f158169 100644 --- a/code/modules/antagonists/abductor/equipment/orderable_gear.dm +++ b/code/modules/antagonists/abductor/equipment/orderable_gear.dm @@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) build_path = /obj/item/abductor_machine_beacon/chem_dispenser category = "Advanced Gear" +/* /datum/abductor_gear/shrink_ray name = "Shrink Ray Blaster" description = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \ @@ -77,3 +78,4 @@ GLOBAL_LIST_INIT(abductor_gear, subtypesof(/datum/abductor_gear)) cost = 2 build_path = /obj/item/gun/energy/shrink_ray category = "Advanced Gear" +*/ diff --git a/code/modules/antagonists/blob/blob/blobs/resource.dm b/code/modules/antagonists/blob/blob/blobs/resource.dm index 76aecf717d..2ed9744327 100644 --- a/code/modules/antagonists/blob/blob/blobs/resource.dm +++ b/code/modules/antagonists/blob/blob/blobs/resource.dm @@ -26,7 +26,7 @@ return flick("blob_resource_glow", src) if(overmind) - overmind.add_points(1) + overmind.add_points(2) resource_delay = world.time + 40 + overmind.resource_blobs.len * 2.5 //4 seconds plus a quarter second for each resource blob the overmind has else resource_delay = world.time + 40 diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index dff8e22552..cd53f624a6 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -147,7 +147,7 @@ set category = "Blob" set name = "Create Factory Blob (60)" set desc = "Create a spore tower that will spawn spores to harass your enemies." - createSpecial(60, /obj/structure/blob/factory, 7, 1) + createSpecial(60, /obj/structure/blob/factory, 5, 1) /mob/camera/blob/verb/create_blobbernaut() set category = "Blob" @@ -195,6 +195,7 @@ to_chat(blobber, "The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]") else to_chat(src, "You could not conjure a sentience for your blobbernaut. Your points have been refunded. Try again later.") + B.naut = FALSE add_points(40) /mob/camera/blob/verb/relocate_core() diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index db498f0975..b868fb54c0 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -348,9 +348,9 @@ L.dust() else if(L.health > min_drain_health) if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS) - vitality_drained = L.adjustToxLoss(1, forced = TRUE) + vitality_drained = L.adjustToxLoss(1, forced = TRUE, toxins_type = TOX_OMNI) else - vitality_drained = L.adjustToxLoss(1.5, forced = TRUE) + vitality_drained = L.adjustToxLoss(1.5, forced = TRUE, toxins_type = TOX_OMNI) if(vitality_drained) GLOB.clockwork_vitality += vitality_drained else diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index 5affcd5dec..a00019aa45 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -115,7 +115,7 @@ if(totaldamage) L.heal_overall_damage(brutedamage, burndamage, only_organic = FALSE) //Maybe a machine god shouldn't murder augmented followers instead of healing them L.adjustOxyLoss(-oxydamage) - L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE) + L.adjustToxLoss(totaldamage * 0.5, TRUE, TRUE, toxins_type = TOX_OMNI) clockwork_say(ranged_ability_user, text2ratvar("[has_holy_water ? "Heal tainted" : "Mend wounded"] flesh!")) log_combat(ranged_ability_user, L, "healed with Sentinel's Compromise") L.visible_message("A blue light washes over [L], [has_holy_water ? "causing [L.p_them()] to briefly glow as it mends" : " mending"] [L.p_their()] bruises and burns!", \ diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 73ae89a19b..28901ea0b2 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -30,6 +30,7 @@ var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert") notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [get_area_name(src)] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 10, null, FALSE, 0) + SSpersistence.station_was_destroyed = TRUE /obj/structure/destructible/clockwork/massive/ratvar/Destroy() GLOB.ratvar_awakens-- diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 4a697a6bd7..901c83b1b7 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -717,9 +717,9 @@ uses = 0 ratio *= -1 H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0) - H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0) + H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0, toxins_type = TOX_OMNI) + H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0, only_organic = FALSE) + H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0, only_organic = FALSE) H.updatehealth() playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25) new /obj/effect/temp_visual/cult/sparks(get_turf(H)) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index a388621c92..25fd446b06 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -214,8 +214,8 @@ if(L.health != L.maxHealth) new /obj/effect/temp_visual/heal(get_turf(src), "#960000") if(ishuman(L)) - L.adjustBruteLoss(-1, 0) - L.adjustFireLoss(-1, 0) + L.adjustBruteLoss(-1, 0, only_organic = FALSE) + L.adjustFireLoss(-1, 0, only_organic = FALSE) L.updatehealth() if(isshade(L) || isconstruct(L)) var/mob/living/simple_animal/M = L diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index d54f008108..ea226a3cb6 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -31,6 +31,7 @@ /datum/antagonist/heretic/on_gain() var/mob/living/current = owner.current owner.teach_crafting_recipe(/datum/crafting_recipe/heretic/codex) + owner.special_role = ROLE_HERETIC if(ishuman(current)) forge_primary_objectives() gain_knowledge(/datum/eldritch_knowledge/spell/basic) @@ -49,7 +50,7 @@ for(var/X in researched_knowledge) var/datum/eldritch_knowledge/EK = researched_knowledge[X] EK.on_lose(owner.current) - + owner.special_role = null if(!silent) to_chat(owner.current, "Your mind begins to flare as the otherwordly knowledge escapes your grasp!") owner.current.log_message("has renounced the cult of the old ones!", LOG_ATTACK, color="#960000") diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index e91feda006..5844aad02b 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -42,7 +42,9 @@ /obj/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, - /obj/effect)) + /obj/effect, + /mob/camera + )) var/playstyle_string = "You are a morph, an abomination of science created primarily with changeling cells. \ You may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index a18906b70b..bf6599d782 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -617,9 +617,12 @@ This is here to make the tiles around the station mininuke change when it's arme var/fake = FALSE var/turf/lastlocation var/last_disk_move + var/process_tick = 0 /obj/item/disk/nuclear/Initialize() . = ..() + AddElement(/datum/element/bed_tuckable, 6, -6, 0) + if(!fake) GLOB.poi_list |= src last_disk_move = world.time @@ -630,11 +633,25 @@ This is here to make the tiles around the station mininuke change when it's arme AddComponent(/datum/component/stationloving, !fake) /obj/item/disk/nuclear/process() + ++process_tick if(fake) STOP_PROCESSING(SSobj, src) CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") var/turf/newturf = get_turf(src) + if(newturf && lastlocation == newturf) + + // How comfy is disky? + var/disk_comfort_level = 0 + + // Checking for items that make disky comfy + for(var/obj/comfort_item in loc) + if(istype(comfort_item, /obj/item/bedsheet) || istype(comfort_item, /obj/structure/bed)) + disk_comfort_level++ + + if(disk_comfort_level >= 2) //Sleep tight, disky. + if(process_tick % 30) + visible_message("[src] sleeps soundly. Sleep tight, disky.") if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control if(istype(loneop) && loneop.occurrences < loneop.max_occurrences) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 1e98b2f753..9b2def48d7 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -189,6 +189,10 @@ name = "Mutate" spell_type = /obj/effect/proc_holder/spell/targeted/genetic/mutate +/datum/spellbook_entry/mantra + name = "Inner Mantra" + spell_type = /obj/effect/proc_holder/spell/self/mantra + /datum/spellbook_entry/jaunt name = "Ethereal Jaunt" spell_type = /obj/effect/proc_holder/spell/targeted/ethereal_jaunt diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 42954c3542..23e870a0ec 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -181,8 +181,8 @@ to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.") if(APPRENTICE_MARTIAL) owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null)) - H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H)) - to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.") + owner.AddSpell(new /obj/effect/proc_holder/spell/self/mantra(null)) + to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned to control your Inner Mantra. You are also able to use the Nuclear Fist at will.") /datum/antagonist/wizard/apprentice/create_objectives() var/datum/objective/protect/new_objective = new /datum/objective/protect diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 9e30530ad3..e37224e401 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -88,7 +88,6 @@ to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") QDEL_IN(src, 1) return - var/enlargement = FALSE switch(rounded_cached) if(0) //flatchested size = "flat" @@ -96,16 +95,8 @@ size = breast_values[rounded_cached] if(9 to 15) //massive size = breast_values[rounded_cached] - enlargement = TRUE if(16 to INFINITY) //rediculous size = "huge" - enlargement = TRUE - if(owner) - var/status_effect = owner.has_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) - if(enlargement && !status_effect) - owner.apply_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) - else if(!enlargement && status_effect) - owner.remove_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT) if(rounded_cached < 16 && owner)//Because byond doesn't count from 0, I have to do this. var/mob/living/carbon/human/H = owner diff --git a/code/modules/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index 5a451359f3..e1025094c3 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -39,26 +39,16 @@ return var/rounded_length = round(length) var/new_size - var/enlargement = FALSE switch(rounded_length) if(0 to 6) //If modest size new_size = 1 if(7 to 11) //If large new_size = 2 - if(12 to 20) //If massive + if(12 to 36) //If massive new_size = 3 - if(21 to 34) //If massive and due for large effects - new_size = 3 - enlargement = TRUE - if(35 to INFINITY) //If comical + if(37 to INFINITY) //If comical new_size = 4 //no new sprites for anything larger yet - enlargement = TRUE - if(owner) - var/status_effect = owner.has_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) - if(enlargement && !status_effect) - owner.apply_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) - else if(!enlargement && status_effect) - owner.remove_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT) + if(linked_organ) linked_organ.size = clamp(size + new_size, BALLS_SIZE_MIN, BALLS_SIZE_MAX) linked_organ.update() diff --git a/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm index 3f6fa9bb45..0cfa57e5fc 100644 --- a/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -123,6 +123,7 @@ obj/item/dildo/flared/huge desc = "THIS THING IS HUGE!" dildo_size = 4 force = 10 + hitsound = 'sound/weapons/klonk.ogg' obj/item/dildo/custom name = "customizable dildo" diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index f5a8d21278..5a976b0abb 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -179,6 +179,10 @@ if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly) return + if(self_paid && !pack.can_private_buy) + say("This cannot be bought privately.") + return + var/name = "*None Provided*" var/rank = "*None Provided*" var/ckey = usr.ckey diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index 6a4165f840..58cae36015 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -90,6 +90,18 @@ crate_name = "medical hardsuit" crate_type = /obj/structure/closet/crate/secure/medical +/datum/supply_pack/medical/paramedicevasuit + name = "Paramedic EVA Suit" + desc = "Greytide pushing up daisies with the carp outside the station? Chemistry vented in a meth experiment gone wrong? Be the blue saviour this station desperately needs and get your Paramedical EVA suit today! Requires medical access to open." + cost = 1975 + access = ACCESS_MEDICAL + contains = list(/obj/item/tank/internals/emergency_oxygen, + /obj/item/clothing/head/helmet/space/eva/paramedic, + /obj/item/clothing/suit/space/eva/paramedic, + /obj/item/clothing/mask/breath) + crate_name = "paramedic EVA suit" + crate_type = /obj/structure/closet/crate/secure/medical + /datum/supply_pack/medical/supplies name = "Medical Supplies Crate" desc = "Contains seven beakers, syringes, and bodybags. Three morphine bottles, four insulin pills. Two charcoal bottles, epinephrine bottles, antitoxin bottles, and large beakers. Finally, a single roll of medical gauze, as well as a bottle of stimulant pills for long, hard work days. German doctor not included." diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index 0c7c63f867..2bb3934ac7 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -261,9 +261,9 @@ /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, - /obj/item/caution, - /obj/item/caution, - /obj/item/caution, + /obj/item/clothing/suit/caution, + /obj/item/clothing/suit/caution, + /obj/item/clothing/suit/caution, /obj/item/storage/bag/trash, /obj/item/reagent_containers/spray/cleaner, /obj/item/reagent_containers/rag, diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 617d4a1d72..c298d150f8 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1024,3 +1024,25 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( verb_tabs |= verb_to_init.category verblist[++verblist.len] = list(verb_to_init.category, verb_to_init.name) src << output("[url_encode(json_encode(verb_tabs))];[url_encode(json_encode(verblist))]", "statbrowser:init_verbs") + +//increment progress for an unlockable loadout item +/client/proc/increment_progress(key, amount) + if(prefs) + var/savefile/S = new /savefile(prefs.path) + var/list/unlockable_loadout_data = prefs.unlockable_loadout_data + if(!length(unlockable_loadout_data)) + unlockable_loadout_data = list() + unlockable_loadout_data[key] = amount + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data)) + prefs.unlockable_loadout_data = unlockable_loadout_data + return TRUE + else + if(unlockable_loadout_data[key]) + unlockable_loadout_data[key] += amount + else + unlockable_loadout_data[key] = amount + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data)) + prefs.unlockable_loadout_data = unlockable_loadout_data + return TRUE + return FALSE + diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e97f6dc3f4..7c6ba30b80 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -198,6 +198,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/gear_points = 10 var/list/gear_categories var/list/loadout_data = list() + var/list/unlockable_loadout_data = list() var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES var/gear_category var/gear_subcategory @@ -907,12 +908,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) loadout_color_non_poly = loadout_item[LOADOUT_COLOR][1] extra_color_data += "
Color" extra_color_data += "   " - else if(gear_points <= 0) + else if((gear_points - gear.cost) < 0) class_link = "style='white-space:normal;' class='linkOff'" else if(donoritem) class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - else + else if(!istype(gear, /datum/gear/unlockable) || can_use_unlockable(gear)) class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" + else + class_link = "style='white-space:normal;background:#eb2e2e;' class='linkOff'" dat += "[name][extra_color_data]" dat += "[gear.cost]" if(islist(gear.restricted_roles)) @@ -925,7 +928,16 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += gear.restricted_roles.Join(";") dat += "" - dat += "[gear.description]" + if(!istype(gear, /datum/gear/unlockable)) + dat += "[gear.description]" + else + //we add the user's progress to the description assuming they have progress + var/datum/gear/unlockable/unlockable = gear + var/progress_made = unlockable_loadout_data[unlockable.progress_key] + if(!progress_made) + progress_made = 0 + dat += "[gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]" + dat += "" if(4) // Content preferences dat += "
" @@ -2675,6 +2687,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(G.donoritem && !G.donator_ckey_check(user.ckey)) to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.") return + if(istype(G, /datum/gear/unlockable) && !can_use_unlockable(G)) + to_chat(user, "To use this item, you need to meet the defined requirements!") + return if(gear_points >= initial(G.cost)) var/list/new_loadout_data = list(LOADOUT_ITEM = "[G.type]") if(length(G.loadout_initial_colors)) @@ -2960,6 +2975,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(find_gear) loadout_data["SAVE_[save_slot]"] -= list(find_gear) +/datum/preferences/proc/can_use_unlockable(datum/gear/unlockable/unlockable_gear) + if(unlockable_loadout_data[unlockable_gear.progress_key] >= unlockable_gear.progress_required) + return TRUE + return FALSE + #undef DEFAULT_SLOT_AMT #undef HANDS_SLOT_AMT #undef BACKPACK_SLOT_AMT diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 86f7622a93..0db9fbb66c 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 47 +#define SAVEFILE_VERSION_MAX 48 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -285,6 +285,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["loadout"] = safe_json_encode(loadout_data) + if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake + S["unlockable_loadout"] = list() + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -427,6 +430,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped + if(S["unlockable_loadout"]) + unlockable_loadout_data = safe_json_decode(S["unlockable_loadout"]) + else + unlockable_loadout_data = list() + if(needs_update >= 0) //save the updated version var/old_default_slot = default_slot var/old_max_save_slots = max_save_slots @@ -532,6 +540,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["auto_ooc"], auto_ooc) WRITE_FILE(S["no_tetris_storage"], no_tetris_storage) + if(length(unlockable_loadout_data)) + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(unlockable_loadout_data)) + else + WRITE_FILE(S["unlockable_loadout"], safe_json_encode(list())) + return 1 /datum/preferences/proc/load_character(slot, bypass_cooldown = FALSE) @@ -736,7 +749,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car belly_prefs = json_from_file["belly_prefs"] //gear loadout - loadout_data = safe_json_decode(S["loadout"]) + if(S["loadout"]) + loadout_data = safe_json_decode(S["loadout"]) + else + loadout_data = list() //try to fix any outdated data if necessary //preference updating will handle saving the updated data for us. diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index 67563b99e5..e6e62280e2 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -17,7 +17,7 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC") if(!msg) return - if(!(prefs.toggles & CHAT_OOC)) + if(!(prefs.chat_toggles & CHAT_OOC)) to_chat(src, " You have OOC muted.") return if(jobban_isbanned(mob, "OOC")) @@ -63,14 +63,14 @@ GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC") if (isobserver(M)) continue //Also handled later. - if(C.prefs.toggles & CHAT_OOC) + if(C.prefs.chat_toggles & CHAT_OOC) if(GLOB.LOOC_COLOR) to_chat(C, "LOOC: [src.mob.name]: [msg]") else to_chat(C, "LOOC: [src.mob.name]: [msg]") for(var/client/C in GLOB.admins) - if(C.prefs.toggles & CHAT_OOC) + if(C.prefs.chat_toggles & CHAT_OOC) var/prefix = "(R)LOOC" if (C.mob in heard) prefix = "LOOC" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 2ffe85b6c4..c944b2aa1f 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -510,12 +510,12 @@ Contains: name = "paramedic EVA suit" icon_state = "paramedic-eva" item_state = "paramedic-eva" - desc = "A deep blue space suit decorated with red and white crosses to indicate that the wearer is trained emergency medical personnel." + desc = "A deep blue space suit decorated with medical insignia to indicate that the wearer is trained emergency medical personnel." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/roller) /obj/item/clothing/head/helmet/space/eva/paramedic name = "paramedic EVA helmet" - desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel." + desc = "A deep blue space helmet decorated with medical insignia to designate the wearer as trained emergency medical personnel." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 149f17f4d6..6dfcd72c10 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -541,6 +541,21 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT allowed = list(/obj/item/clothing/mask/facehugger/toy) +/obj/item/clothing/suit/caution + name = "wet floor sign" + desc = "Caution! Wet Floor!" + icon_state = "caution" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + force = 1 + throwforce = 3 + throw_speed = 2 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + body_parts_covered = CHEST|GROIN + attack_verb = list("warned", "cautioned", "smashed") + armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + // WINTER COATS /obj/item/clothing/suit/hooded/wintercoat diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 23cb2b1c15..e617d2d57b 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -244,35 +244,33 @@ /obj/item/clothing/under/proc/rolldown() if(!can_use(usr)) return - if(!can_adjust) - to_chat(usr, "You cannot wear this suit any differently!") - return - if(toggle_jumpsuit_adjust()) - to_chat(usr, "You adjust the suit to wear it more casually.") - else - to_chat(usr, "You adjust the suit back to normal.") - if(ishuman(usr)) + if(toggle_jumpsuit_adjust() && ishuman(usr)) var/mob/living/carbon/human/H = usr H.update_inv_w_uniform() H.update_body() /obj/item/clothing/under/proc/toggle_jumpsuit_adjust() + if(!can_adjust) + to_chat(usr, "You cannot wear this suit any differently!") + return FALSE adjusted = !adjusted if(adjusted) + to_chat(usr, "You adjust the suit to wear it more casually.") if(fitted != FEMALE_UNIFORM_TOP) fitted = NO_FEMALE_UNIFORM if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted body_parts_covered &= ~CHEST mutantrace_variation &= ~USE_TAUR_CLIP_MASK //How are we supposed to see the uniform otherwise? else + to_chat(usr, "You adjust the suit back to normal.") fitted = initial(fitted) if(!alt_covers_chest) body_parts_covered |= CHEST if(initial(mutantrace_variation) & USE_TAUR_CLIP_MASK) mutantrace_variation |= USE_TAUR_CLIP_MASK - return adjusted + return TRUE /obj/item/clothing/under/rank dying_key = DYE_REGISTRY_UNDER diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 505aa91775..2eabb0ce35 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -24,7 +24,7 @@ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON /obj/item/clothing/under/rank/civilian/util - name = "generic utility uniform" + name = "utility uniform" desc = "A utility uniform worn by various crew." icon_state = "utilgen" item_state = "utilgen" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index 8a6c372272..cc07665063 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -3,11 +3,12 @@ name = "captain's jumpsuit" icon_state = "captain" item_state = "b_suit" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15) sensor_mode = SENSOR_COORDS random_sensor = FALSE /obj/item/clothing/under/rank/captain/util - name = "Command Utiltiy Uniform" + name = "command utility uniform" desc = "A utility uniform for command personnel." icon_state = "utilcom" item_state = "utilcom" @@ -26,7 +27,6 @@ /obj/item/clothing/under/rank/captain/suit name = "captain's suit" desc = "A green suit and yellow necktie. Exemplifies authority." - armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15) icon_state = "green_suit" item_state = "dg_suit" can_adjust = FALSE diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index de285b0470..20fd34f4a0 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -131,7 +131,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) /obj/item/clothing/under/rank/medical/doctor/util - name = "Medical Utility Uniform" + name = "medical utility uniform" desc = "Utility jumpsuit for medical personnel" icon_state = "utilmed" item_state = "utilmed" diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index 7443cd9d39..d63e81a0a3 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -62,7 +62,7 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5) /obj/item/clothing/under/rank/rnd/scientist/util - name = "Science Utility Uniform" + name = "science utility uniform" desc = "A utility uniform for science personnel" icon_state = "utilsci" item_state = "utilsci" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 2a5d6974ef..59e0832fef 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -172,11 +172,13 @@ body_parts_covered = CHEST|GROIN /obj/item/clothing/under/misc/gear_harness/toggle_jumpsuit_adjust() - adjusted = !adjusted - if(adjusted) - body_parts_covered = NONE - else + if(!body_parts_covered) + to_chat(usr, "Your gear harness is now covering your chest and groin.") body_parts_covered = CHEST|GROIN + else + to_chat(usr, "Your gear harness is no longer covering anything.") + body_parts_covered = NONE + return TRUE /obj/item/clothing/under/misc/durathread name = "durathread jumpsuit" diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 140923c1ef..3f51da22b3 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -48,7 +48,7 @@ var/fraction = min(gulp_size/reagents.total_volume, 1) checkLiked(fraction, M) reagents.reaction(M, INGEST, fraction) - reagents.trans_to(M, gulp_size) + reagents.trans_to(M, gulp_size, log = TRUE) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 @@ -71,7 +71,7 @@ return var/refill = reagents.get_master_reagent_id() - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, log = TRUE) to_chat(user, "You transfer [trans] units of the solution to [target].") if(iscyborg(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell @@ -92,7 +92,7 @@ to_chat(user, "[src] is full.") return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, log = TRUE) to_chat(user, "You fill [src] with [trans] units of the contents of [target].") /obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 95e5c9fb56..dca12aa4f8 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -55,7 +55,7 @@ var/fraction = min(10/reagents.total_volume, 1) reagents.reaction(M, INGEST, fraction) - reagents.trans_to(M, 10) + reagents.trans_to(M, 10, log = TRUE) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) return 1 @@ -73,7 +73,7 @@ to_chat(user, "[src] is full!") return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, log = TRUE) to_chat(user, "You fill [src] with [trans] units of the contents of [target].") //Something like a glass or a food item. Player probably wants to transfer TO it. @@ -84,7 +84,7 @@ if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "you can't add anymore to [target]!") return - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, log = TRUE) to_chat(user, "You transfer [trans] units of the condiment to [target].") /obj/item/reagent_containers/food/condiment/on_reagent_change(changetype) @@ -270,7 +270,7 @@ return else to_chat(user, "You tear open [src] above [target] and the condiments drip onto it.") - src.reagents.trans_to(target, amount_per_transfer_from_this) + src.reagents.trans_to(target, amount_per_transfer_from_this, log = TRUE) qdel(src) /obj/item/reagent_containers/food/condiment/pack/on_reagent_change(changetype) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 4d5f4e2dd0..cb1ed628c4 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -160,7 +160,7 @@ All foods are distributed among various categories. Use common sense. SEND_SIGNAL(src, COMSIG_FOOD_EATEN, M, user) var/fraction = min(bitesize / reagents.total_volume, 1) reagents.reaction(M, INGEST, fraction) - reagents.trans_to(M, bitesize) + reagents.trans_to(M, bitesize, log = TRUE) bitecount++ On_Consume(M) checkLiked(fraction, M) @@ -359,7 +359,7 @@ All foods are distributed among various categories. Use common sense. if(!M.is_drainable()) to_chat(user, "[M] is unable to be dunked in!") return - if(M.reagents.trans_to(src, dunk_amount)) //if reagents were transfered, show the message + if(M.reagents.trans_to(src, dunk_amount, log = TRUE)) //if reagents were transfered, show the message to_chat(user, "You dunk the [M].") return if(!M.reagents.total_volume) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 0d7c715654..f30d955b00 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -7,6 +7,12 @@ foodtype = GRAIN dunkable = TRUE +/obj/item/reagent_containers/food/snacks/store/bread/proc/bread_teleport() + // you did WHAT? + new /mob/living/simple_animal/hostile/bread(get_turf(src)) + visible_message("[src] begins to deform and grow grotesque tumors!") + qdel(src) + /obj/item/reagent_containers/food/snacks/breadslice icon = 'icons/obj/food/burgerbread.dmi' bitesize = 2 @@ -228,3 +234,25 @@ /obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize() . = ..() AddComponent(/datum/component/slippery, 80) + +/obj/item/reagent_containers/food/snacks/store/bread/tumor_bread + name = "dead tumor bread" + desc = "It's still within its expiration date, right?" + icon_state = "tumorbread" + slice_path = /obj/item/reagent_containers/food/snacks/breadslice/tumor_bread + list_reagents = list(/datum/reagent/consumable/nutriment = 10, /datum/reagent/toxin = 10) + foodtype = GROSS | GRAIN + tastes = list("wheat and tumors" = 10) + +//teleporting tumor bread kills it +/obj/item/reagent_containers/food/snacks/store/bread/tumor_bread/bread_teleport() + visible_message(src, "[src] explodes in a horrible mess of tumor and flour!") + qdel(src) + +/obj/item/reagent_containers/food/snacks/breadslice/tumor_bread + name = "tumor bread slice" + desc = "A slice of bread filled with tumors!" + icon_state = "tumorbreadslice" + filling_color = "#B2D72C" + list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/toxin = 2) + foodtype = GROSS | GRAIN diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 24522503c1..a4287d3d19 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -54,7 +54,7 @@ H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") playsound(H, "desceration", 50, TRUE) if(!H.is_mouth_covered()) - reagents.trans_to(H,15) //Cream pie combat + reagents.trans_to(H, 15, log = TRUE) //Cream pie combat if(!H.creamed) // one layer at a time H.add_overlay(creamoverlay) H.creamed = TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index d9e3bc6165..6bdf3cff8e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -195,7 +195,7 @@ /obj/machinery/microwave/AltClick(mob/user) . = ..() if(user.canUseTopic(src, !hasSiliconAccessInArea(user))) - cook() + cook(user) return TRUE /obj/machinery/microwave/ui_interact(mob/user) @@ -226,7 +226,7 @@ if("eject") eject() if("use") - cook() + cook(user) if("examine") examine(user) @@ -236,7 +236,7 @@ AM.forceMove(drop_location()) ingredients.Cut() -/obj/machinery/microwave/proc/cook() +/obj/machinery/microwave/proc/cook(mob/user) if(stat & (NOPOWER|BROKEN)) return if(operating || broken > 0 || panel_open || !anchored || dirty == 100) @@ -257,7 +257,7 @@ start_can_fail() return break - start() + start(user) /obj/machinery/microwave/proc/turn_on() visible_message("\The [src] turns on.", "You hear a microwave humming.") @@ -277,9 +277,9 @@ #define MICROWAVE_MUCK 1 #define MICROWAVE_PRE 2 -/obj/machinery/microwave/proc/start() +/obj/machinery/microwave/proc/start(mob/user) turn_on() - loop(MICROWAVE_NORMAL, 10) + loop(MICROWAVE_NORMAL, 10, user = user) /obj/machinery/microwave/proc/start_can_fail() turn_on() @@ -292,7 +292,7 @@ update_icon() loop(MICROWAVE_MUCK, 4) -/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * productivity, 2)) // standard wait is 10 +/obj/machinery/microwave/proc/loop(type, time, wait = max(12 - 2 * productivity, 2), mob/user) // standard wait is 10 if(stat & (NOPOWER|BROKEN)) if(type == MICROWAVE_PRE) pre_fail() @@ -300,7 +300,7 @@ if(!time) switch(type) if(MICROWAVE_NORMAL) - loop_finish() + loop_finish(user) if(MICROWAVE_MUCK) muck_finish() if(MICROWAVE_PRE) @@ -308,16 +308,21 @@ return time-- use_power(500) - addtimer(CALLBACK(src, .proc/loop, type, time, wait), wait) + addtimer(CALLBACK(src, .proc/loop, type, time, wait, user), wait) -/obj/machinery/microwave/proc/loop_finish() +/obj/machinery/microwave/proc/loop_finish(mob/user) operating = FALSE var/metal = 0 + var/cooked_food = 0 for(var/obj/item/O in ingredients) - O.microwave_act(src) + var/cooked_result = O.microwave_act(src) + if(!istype(cooked_result, /obj/item/reagent_containers/food/snacks/badrecipe)) + cooked_food += 1 if(O.custom_materials?.len) metal += O.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] + if(cooked_food && user.client) + user.client.increment_progress("cook", cooked_food) if(metal) spark() @@ -336,8 +341,8 @@ spark() after_finish_loop() -/obj/machinery/microwave/proc/pre_success() - loop(MICROWAVE_NORMAL, 10) +/obj/machinery/microwave/proc/pre_success(mob/user) + loop(MICROWAVE_NORMAL, 10, user) /obj/machinery/microwave/proc/muck_finish() visible_message("\The [src] gets covered in muck!") diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index 117e03c357..31cfb1f26a 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -117,7 +117,7 @@ /obj/item/weldingtool = 3, /obj/item/wirecutters = 2, /obj/item/wrench = 4, - /obj/item/weaponcrafting/improvised_parts/shotgun_receiver = 1, + /obj/item/weaponcrafting/receiver = 1, /obj/item/geiger_counter = 3, /obj/item/reagent_containers/food/snacks/grown/citrus/orange = 5, /obj/item/assembly/infra = 1, diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index a1a177c028..8467d00124 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -130,7 +130,7 @@ reagents.remove_any(min(0.5, nutridrain)) else reagents.remove_any(nutridrain) - + // Lack of nutrients hurts non-weeds if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) adjustHealth(-rand(1,3)) @@ -501,7 +501,7 @@ if(visi_msg) visible_message("[visi_msg].") - + for(var/obj/machinery/hydroponics/H in trays) //cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener //This was originally in apply_chemicals, but due to apply_chemicals only holding nutrients, we handle it here now. @@ -675,7 +675,7 @@ idle_power_usage = 0 self_sustaining = FALSE update_icon() - + /// Tray Setters - The following procs adjust the tray or plants variables, and make sure that the stat doesn't go out of bounds./// /obj/machinery/hydroponics/proc/adjustWater(adjustamt) waterlevel = clamp(waterlevel + adjustamt, 0, maxwater) diff --git a/code/modules/mapping/map_config.dm b/code/modules/mapping/map_config.dm index d18ca1e1e3..1f4b558e21 100644 --- a/code/modules/mapping/map_config.dm +++ b/code/modules/mapping/map_config.dm @@ -18,6 +18,8 @@ var/map_name = "Box Station" var/map_path = "map_files/BoxStation" var/map_file = "BoxStation.dmm" + /// Persistence key: Defaults to ckey(map_name). If set to "NO_PERSIST", this map will have NO persistence. + var/persistence_key var/traits = null var/space_ruin_levels = 4 @@ -99,6 +101,16 @@ map_path = json["map_path"] map_file = json["map_file"] + + persistence_key = ckey(map_name) + + var/json_persistence_key = json["persistence_key"] + if(json_persistence_key) + if(json_persistence_key == "NO_PERSIST") + persistence_key = null + else + persistence_key = json_persistence_key + // "map_file": "BoxStation.dmm" if (istext(map_file)) if (!fexists("_maps/[map_path]/[map_file]")) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 0953ea138d..9c39601b4e 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1104,7 +1104,7 @@ if(1) new /obj/item/mayhem(src) if(2) - new /obj/item/gun/ballistic/revolver/doublebarrel/super(src) + new /obj/item/book/granter/spell/asura(src) if(3) new /obj/item/guardiancreator(src) @@ -1187,6 +1187,13 @@ unique_reskin = null sawn_off = TRUE +/obj/item/book/granter/spell/asura + spell = /obj/effect/proc_holder/spell/self/asura + spellname = "asuras wrath" + icon_state = "bookasura" + desc = "This crimson novel emanates rage incarnate." + remarks = list("Kaio-What?", "It can only be sustained for a short time...", "It's like a massive upsurge of energy...", "Takes a heavy toll on the user's body...?", "Extra arms not included...", "There's stronger levels? Why aren't they in the book...") + //Colossus /obj/structure/closet/crate/necropolis/colossus name = "colossus chest" diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8bc9cc4512..26a3ca1b70 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -397,6 +397,17 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ else to_chat(user, "You need one length of cable to attach a string to the coin!") return + else if(istype(W, /obj/item/card/id)) + var/obj/item/card/id/ID = W + if(!ID.registered_account) + to_chat(user, "[ID] doesn't have a linked account to deposit into!") + return + for(var/obj/item/holochip/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/stack/spacecash/money in src.loc.contents) + ID.attackby(money, user) + for(var/obj/item/coin/money in src.loc.contents) + ID.attackby(money, user) else ..() diff --git a/code/modules/mining/point_bank.dm b/code/modules/mining/point_bank.dm index 11f23a5d7c..f18b62635f 100644 --- a/code/modules/mining/point_bank.dm +++ b/code/modules/mining/point_bank.dm @@ -30,6 +30,8 @@ if(points) if(I) I.mining_points += points + if(usr.client) + usr.client.increment_progress("miner", points) points = 0 else to_chat(usr, "No ID detected.") 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 6c510807b4..4e5f010964 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 @@ -243,6 +243,10 @@ icon_state = "none" relevant_layers = null +/datum/sprite_accessory/insect_fluff/brown + name = "Brown" + icon_state = "brown" + /datum/sprite_accessory/insect_fluff/punished name = "Burnt Off" icon_state = "punished" @@ -271,6 +275,10 @@ name = "Deathshead" icon_state = "deathhead" +/datum/sprite_accessory/insect_fluff/featherymoth + name = "Feathery Moth" + icon_state = "featherymoth" + /datum/sprite_accessory/insect_fluff/firewatch name = "Firewatch" icon_state = "firewatch" @@ -291,18 +299,22 @@ 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/plasmafire + name = "Plasma Fire" + icon_state = "plasmafire" + /datum/sprite_accessory/insect_fluff/poison name = "Poison" icon_state = "poison" +/datum/sprite_accessory/insect_fluff/oakworm + name = "Oak Worm" + icon_state = "oakworm" + /datum/sprite_accessory/insect_fluff/ragged name = "Ragged" icon_state = "ragged" @@ -311,6 +323,10 @@ name = "Reddish" icon_state = "redish" +/datum/sprite_accessory/insect_fluff/rosy + name = "Rosy" + icon_state = "rosy" + /datum/sprite_accessory/insect_fluff/royal name = "Royal" icon_state = "royal" @@ -325,4 +341,4 @@ /datum/sprite_accessory/insect_fluff/witchwing name = "Witch Wing" - icon_state = "witchwing" + icon_state = "witchwing" \ No newline at end of file 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 fb71bb483d..800682b8cf 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -58,9 +58,7 @@ 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" +//nonmoth wings /datum/sprite_accessory/deco_wings/bat name = "Bat" @@ -70,18 +68,76 @@ name = "Bee" icon_state = "bee" -/datum/sprite_accessory/deco_wings/deathhead - name = "Deathshead" - icon_state = "deathhead" +/datum/sprite_accessory/deco_wings/bee2 + name = "Small Bee" + icon_state = "beewings" + +/datum/sprite_accessory/deco_wings/dragon + name = "Dragon" + icon_state = "dragon" + +/datum/sprite_accessory/deco_wings/dragonfly + name = "Dragonfly" + icon_state = "dragonfly" /datum/sprite_accessory/deco_wings/fairy name = "Fairy" icon_state = "fairy" -/datum/sprite_accessory/deco_wings/feathery +/datum/sprite_accessory/deco_wings/featheredwing name = "Feathery" icon_state = "feathery" +/datum/sprite_accessory/deco_wings/featheredwingmedium + name = "Medium Feathered" + icon_state = "feathered3" + +/datum/sprite_accessory/deco_wings/featheredwinglarge + name = "Large Feathered" + icon_state = "feathered2" + +/datum/sprite_accessory/deco_wings/harpywings + name = "Harpy" + icon_state = "harpywings" + +/datum/sprite_accessory/deco_wings/roboticwing + name = "Robotic" + icon_state = "drago" + +/datum/sprite_accessory/deco_wings/succubusblack + name = "Succubus Black" + icon_state = "succubusblack" + +/datum/sprite_accessory/deco_wings/succubuspurple + name = "Succubus Purple" + icon_state = "succubuspurple" + +/datum/sprite_accessory/deco_wings/succubusred + name = "Succubus Red" + icon_state = "succubusred" + +/datum/sprite_accessory/deco_wings/xenobackplate + name = "Xenomorph Backplate" + icon_state = "snagbackplate" + +//moth wings + +/datum/sprite_accessory/deco_wings/atlas + name = "Atlas" + icon_state = "atlas" + +/datum/sprite_accessory/deco_wings/brown + name = "Brown" + icon_state = "brown" + +/datum/sprite_accessory/deco_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/deco_wings/featherymoth + name = "Feathery Moth Wings" + icon_state = "featherymoth" + /datum/sprite_accessory/deco_wings/firewatch name = "Firewatch" icon_state = "firewatch" @@ -90,6 +146,10 @@ name = "Gothic" icon_state = "gothic" +/datum/sprite_accessory/deco_wings/jungle + name = "Jungle" + icon_state = "jungle" + /datum/sprite_accessory/deco_wings/lovers name = "Lovers" icon_state = "lovers" @@ -106,10 +166,18 @@ name = "Moon Fly" icon_state = "moonfly" +/datum/sprite_accessory/deco_wings/oakworm + name = "Oak Worm" + icon_state = "oakworm" + /datum/sprite_accessory/deco_wings/plain name = "Plain" icon_state = "plain" +/datum/sprite_accessory/deco_wings/plasmafire + name = "Plasma Fire" + icon_state = "plasmafire" + /datum/sprite_accessory/deco_wings/poison name = "Poison" icon_state = "poison" @@ -126,6 +194,10 @@ name = "Reddish" icon_state = "redish" +/datum/sprite_accessory/deco_wings/rosy + name = "Rosy" + icon_state = "rosy" + /datum/sprite_accessory/deco_wings/royal name = "Royal" icon_state = "royal" @@ -138,6 +210,10 @@ name = "White Fly" icon_state = "whitefly" +/datum/sprite_accessory/deco_wings/witchwing + name = "Witch Wing" + icon_state = "witchwing" + //INSECT WINGS /datum/sprite_accessory/insect_wings @@ -145,6 +221,69 @@ color_src = WINGCOLOR relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) +//non insect wings +/datum/sprite_accessory/deco_wings/bat + name = "Bat" + icon_state = "bat" + +/datum/sprite_accessory/insect_wings/bee + name = "Bee" + icon_state = "bee" + +/datum/sprite_accessory/insect_wings/bee2 + name = "Small Bee" + icon_state = "beewings" + +/datum/sprite_accessory/insect_wings/dragon + name = "Dragon" + icon_state = "dragon" + +/datum/sprite_accessory/insect_wings/dragonfly + name = "Dragonfly" + icon_state = "dragonfly" + +/datum/sprite_accessory/insect_wings/fairy + name = "Fairy" + icon_state = "fairy" + +/datum/sprite_accessory/insect_wings/featheredwing + name = "Feathery" + icon_state = "feathery" + +/datum/sprite_accessory/insect_wings/featheredwingmedium + name = "Medium Feathered" + icon_state = "feathered3" + +/datum/sprite_accessory/insect_wings/featheredwinglarge + name = "Large Feathered" + icon_state = "feathered2" + +/datum/sprite_accessory/insect_wings/harpywings + name = "Harpy" + icon_state = "harpywings" + +/datum/sprite_accessory/insect_wings/roboticwing + name = "Robotic" + icon_state = "drago" + +/datum/sprite_accessory/insect_wings/succubusblack + name = "Succubus Black" + icon_state = "succubusblack" + +/datum/sprite_accessory/insect_wings/succubuspurple + name = "Succubus Purple" + icon_state = "succubuspurple" + +/datum/sprite_accessory/insect_wings/succubusred + name = "Succubus Red" + icon_state = "succubusred" + +/datum/sprite_accessory/insect_wings/xenobackplate + name = "Xenomorph Backplate" + icon_state = "snagbackplate" + +//moth wings + /datum/sprite_accessory/insect_wings/none name = "None" icon_state = "none" @@ -154,25 +293,17 @@ name = "Atlas" icon_state = "atlas" -/datum/sprite_accessory/insect_wings/bat - name = "Bat" - icon_state = "bat" - -/datum/sprite_accessory/insect_wings/bee - name = "Bee" - icon_state = "bee" +/datum/sprite_accessory/insect_wings/brown + name = "Brown" + icon_state = "brown" /datum/sprite_accessory/insect_wings/deathhead name = "Deathshead" icon_state = "deathhead" -/datum/sprite_accessory/insect_wings/fairy - name = "Fairy" - icon_state = "fairy" - -/datum/sprite_accessory/insect_wings/feathery - name = "Feathery" - icon_state = "feathery" +/datum/sprite_accessory/insect_wings/featherymoth + name = "Feathery Moth Wings" + icon_state = "featherymoth" /datum/sprite_accessory/insect_wings/firewatch name = "Firewatch" @@ -210,6 +341,10 @@ name = "Plain" icon_state = "plain" +/datum/sprite_accessory/insect_wings/plasmafire + name = "Plasma Fire" + icon_state = "plasmafire" + /datum/sprite_accessory/insect_wings/poison name = "Poison" icon_state = "poison" @@ -226,6 +361,10 @@ name = "Reddish" icon_state = "redish" +/datum/sprite_accessory/insect_wings/rosy + name = "Rosy" + icon_state = "rosy" + /datum/sprite_accessory/insect_wings/royal name = "Royal" icon_state = "royal" @@ -253,45 +392,25 @@ icon_state = "none" relevant_layers = null -/datum/sprite_accessory/insect_markings/reddish - name = "Reddish" - icon_state = "reddish" - -/datum/sprite_accessory/insect_markings/royal - name = "Royal" - icon_state = "royal" - -/datum/sprite_accessory/insect_markings/gothic - name = "Gothic" - icon_state = "gothic" - -/datum/sprite_accessory/insect_markings/whitefly - name = "White Fly" - icon_state = "whitefly" - -/datum/sprite_accessory/insect_markings/lovers - name = "Lovers" - icon_state = "lovers" - -/datum/sprite_accessory/insect_markings/punished - name = "Punished" - icon_state = "punished" +/datum/sprite_accessory/insect_markings/deathhead + name = "Deathshead" + icon_state = "deathhead" /datum/sprite_accessory/insect_markings/firewatch name = "Firewatch" icon_state = "firewatch" -/datum/sprite_accessory/insect_markings/deathhead - name = "Deathshead" - icon_state = "deathhead" +/datum/sprite_accessory/insect_markings/gothic + name = "Gothic" + icon_state = "gothic" -/datum/sprite_accessory/insect_markings/poison - name = "Poison" - icon_state = "poison" +/datum/sprite_accessory/insect_markings/jungle + name = "Jungle" + icon_state = "jungle" -/datum/sprite_accessory/insect_markings/ragged - name = "Ragged" - icon_state = "ragged" +/datum/sprite_accessory/insect_markings/lovers + name = "Lovers" + icon_state = "lovers" /datum/sprite_accessory/insect_markings/moonfly name = "Moon Fly" @@ -301,10 +420,42 @@ name = "Oak Worm" icon_state = "oakworm" -/datum/sprite_accessory/insect_markings/jungle - name = "Jungle" - icon_state = "jungle" +/datum/sprite_accessory/insect_markings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/insect_markings/punished + name = "Punished" + icon_state = "punished" + +/datum/sprite_accessory/insect_markings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/insect_markings/reddish + name = "Reddish" + icon_state = "reddish" + +/datum/sprite_accessory/insect_markings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/insect_markings/whitefly + name = "White Fly" + icon_state = "whitefly" /datum/sprite_accessory/insect_markings/witchwing name = "Witch Wing" icon_state = "witchwing" + +//DONATOR WINGS + +/datum/sprite_accessory/deco_wings/eyestalks + name = "gazer eyestalks" + icon_state = "eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/insect_wings/eyestalks + name = "gazer eyestalks" + icon_state = "eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 399efc4b29..28d311b034 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -68,7 +68,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/plant name = "Plant Weeds" - desc = "Plants some alien weeds." + desc = "Plants Alien weeds which spread resin which heals any alien. These weeds also regenerate plasma faster. Costs 50 Plasma." plasma_cost = 50 check_turf = TRUE action_icon_state = "alien_plant" @@ -83,7 +83,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/whisper name = "Whisper" - desc = "Whisper to someone." + desc = "Whisper to someone through the hivemind. Costs 10 Plasma." plasma_cost = 10 action_icon_state = "alien_whisper" @@ -143,7 +143,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/acid name = "Corrosive Acid" - desc = "Drench an object in acid, destroying it over time." + desc = "Drench an object in acid, destroying it over time. Costs 200 Plasma." plasma_cost = 200 action_icon_state = "alien_acid" @@ -189,7 +189,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/neurotoxin name = "Spit Neurotoxin" - desc = "Spits neurotoxin at someone, paralyzing them for a short time." + desc = "Activates your Neurotoxin glands. You can shoot paralyzing shots. Each shot costs 50 Plasma." action_icon_state = "alien_neurotoxin_0" active = FALSE @@ -254,7 +254,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/resin name = "Secrete Resin" - desc = "Secrete tough malleable resin." + desc = "Secrete tough malleable resin. Costs 55 Plasma." plasma_cost = 55 check_turf = TRUE var/list/structures = list( diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm index 4ec5780838..796a78d566 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -20,7 +20,7 @@ /obj/effect/proc_holder/alien/royal/praetorian/evolve name = "Evolve" - desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time." + desc = "Produce an internal egg sac capable of spawning children. Only one queen can exist at a time. Costs 500 Plasma." plasma_cost = 500 action_icon_state = "alien_evolve_praetorian" diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 1200220ce4..91a61efea6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -57,7 +57,7 @@ //Queen verbs /obj/effect/proc_holder/alien/lay_egg name = "Lay Egg" - desc = "Lay an egg to produce huggers to impregnate prey with." + desc = "Lay an egg to produce huggers to impregnate prey with. Costs 75 Plasma." plasma_cost = 75 check_turf = TRUE action_icon_state = "alien_egg" @@ -77,7 +77,7 @@ //Button to let queen choose her praetorian. /obj/effect/proc_holder/alien/royal/queen/promote name = "Create Royal Parasite" - desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian." + desc = "Produce a royal parasite to grant one of your children the honor of being your Praetorian. Costs 500 Plasma." plasma_cost = 500 //Plasma cost used on promotion, not spawning the parasite. action_icon_state = "alien_queen_promote" diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index a866049d65..1f3a174d0f 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -62,8 +62,8 @@ amount += BP.burn_dam return amount - -/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +//In both these procs, only_organic / only_robotic are only used for healing, not for damaging. For now at least. +/mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) return FALSE if(!forced && (status_flags & GODMODE)) @@ -71,10 +71,10 @@ if(amount > 0) take_overall_damage(amount, 0, 0, updating_health) else - heal_overall_damage(abs(amount), 0, 0, FALSE, TRUE, updating_health) + heal_overall_damage(abs(amount), 0, 0, only_robotic, only_organic, updating_health) return amount -/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. return FALSE if(!forced && (status_flags & GODMODE)) @@ -82,7 +82,7 @@ if(amount > 0) take_overall_damage(0, amount, 0, updating_health) else - heal_overall_damage(0, abs(amount), 0, FALSE, TRUE, updating_health) + heal_overall_damage(0, abs(amount), 0, only_robotic, only_organic, updating_health) return amount diff --git a/code/modules/mob/living/carbon/handle_corruption.dm b/code/modules/mob/living/carbon/handle_corruption.dm index 7b84c41e27..5ac2a2f616 100644 --- a/code/modules/mob/living/carbon/handle_corruption.dm +++ b/code/modules/mob/living/carbon/handle_corruption.dm @@ -80,10 +80,11 @@ if("shortlimbdisable") var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG)) ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM) + update_disabled_bodyparts() addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 5 SECONDS) to_chat(src, "Error - Limb control subsystem partially shutdown, rebooting.") if("shortblind") - ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM) + become_blind(CORRUPTED_SYSTEM) addtimer(CALLBACK(src, .proc/reenable_vision), 5 SECONDS) to_chat(src, "Visual receptor shutdown detected - Initiating reboot.") if("shortstun") @@ -105,10 +106,11 @@ if("longlimbdisable") var/disabled_type = pick(list(TRAIT_PARALYSIS_L_ARM, TRAIT_PARALYSIS_R_ARM, TRAIT_PARALYSIS_L_LEG, TRAIT_PARALYSIS_R_LEG)) ADD_TRAIT(src, disabled_type, CORRUPTED_SYSTEM) + update_disabled_bodyparts() addtimer(CALLBACK(src, .proc/reenable_limb, disabled_type), 25 SECONDS) to_chat(src, "Fatal error in limb control subsystem - rebooting.") if("blindmutedeaf") - ADD_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM) + become_blind(CORRUPTED_SYSTEM) addtimer(CALLBACK(src, .proc/reenable_vision), (rand(10, 25)) SECONDS) ADD_TRAIT(src, TRAIT_DEAF, CORRUPTED_SYSTEM) addtimer(CALLBACK(src, .proc/reenable_hearing), (rand(15, 35)) SECONDS) @@ -140,6 +142,7 @@ /mob/living/carbon/proc/reenable_limb(disabled_limb) REMOVE_TRAIT(src, disabled_limb, CORRUPTED_SYSTEM) + update_disabled_bodyparts() to_chat(src, "Limb control subsystem successfully rebooted.") /mob/living/carbon/proc/reenable_hearing() @@ -147,7 +150,7 @@ to_chat(src, "Hearing restored.") /mob/living/carbon/proc/reenable_vision() - REMOVE_TRAIT(src, TRAIT_BLIND, CORRUPTED_SYSTEM) + cure_blind(CORRUPTED_SYSTEM) to_chat(src, "Visual receptors back online.") /mob/living/carbon/proc/reenable_speech() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1b140af672..a74afc10f5 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -411,15 +411,18 @@ if(isrobotic(src)) apply_status_effect(/datum/status_effect/no_combat_mode/robotic_emp, severity / 20) severity *= 0.5 + var/do_not_stun = FALSE if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) severity *= 0.5 //Robotpeople take less limb damage, but instead suffer system corruption (see carbon emp_act) + do_not_stun = TRUE for(var/obj/item/bodypart/L in src.bodyparts) if(L.is_robotic_limb()) if(!informed) to_chat(src, "You feel a sharp pain as your robotic limbs overload.") informed = TRUE L.receive_damage(0,severity/10) - Stun(severity*2) + if(!do_not_stun) //Tiny bit better than checking for the trait another six times in succession + Stun(severity*2) /mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) var/list/damaged = list() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 341aa6a30f..a82151cc1d 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -15,6 +15,7 @@ block_parry_data = /datum/block_parry_data/unarmed/human default_block_parry_data = /datum/block_parry_data/unarmed/human + causes_dirt_buildup_on_floor = TRUE //Hair colour and style var/hair_color = "000" diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 509633c0d5..440400f889 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -100,3 +100,8 @@ if(dna.species.space_move(src)) return TRUE return ..() + +/mob/living/carbon/human/dirt_buildup(strength) + if(!shoes || !(shoes.body_parts_covered & FEET)) + return // barefoot advantage + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/anthromorph.dm index 95aec26d9f..d718db818c 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthromorph.dm @@ -18,3 +18,33 @@ species_category = SPECIES_CATEGORY_FURRY allowed_limb_ids = list("mammal","aquatic","avian") + +/datum/species/mammal/synthetic + name = "Synthetic Anthromorph" + id = SPECIES_MAMMAL_SYNTHETIC + + species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE,WINGCOLOR,HORNCOLOR) + inherent_traits = list(TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_NO_PROCESS_FOOD, TRAIT_ROBOTIC_ORGANISM) + inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID|MOB_BEAST + + meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc + gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) + //Just robo looking parts. + mutant_heart = /obj/item/organ/heart/ipc + mutantlungs = /obj/item/organ/lungs/ipc + mutantliver = /obj/item/organ/liver/ipc + mutantstomach = /obj/item/organ/stomach/ipc + mutanteyes = /obj/item/organ/eyes/ipc + mutantears = /obj/item/organ/ears/ipc + mutanttongue = /obj/item/organ/tongue/robot/ipc + mutant_brain = /obj/item/organ/brain/ipc + + //special cybernetic organ for getting power from apcs + mutant_organs = list(/obj/item/organ/cyberimp/arm/power_cord) + + + attack_verb = "claw" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + + allowed_limb_ids = list("mammal","aquatic","avian", "human") diff --git a/code/modules/mob/living/carbon/human/species_types/arachnid.dm b/code/modules/mob/living/carbon/human/species_types/arachnid.dm index a44177ced1..454625cf36 100644 --- a/code/modules/mob/living/carbon/human/species_types/arachnid.dm +++ b/code/modules/mob/living/carbon/human/species_types/arachnid.dm @@ -4,7 +4,7 @@ override_bp_icon = 'icons/mob/arachnid_parts.dmi' say_mod = "chitters" default_color = "00FF00" - species_traits = list(LIPS, NOEYES, NO_UNDERWEAR) + species_traits = list(LIPS, NOEYES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain") attack_verb = "slash" diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 803d3ec245..dc2269e19b 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -94,7 +94,7 @@ name = "Xenobiological Slime Entity" id = SPECIES_SLIME default_color = "00FFFF" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,HAS_FLESH) say_mod = "says" hair_color = "mutcolor" hair_alpha = 150 @@ -404,7 +404,7 @@ id = SPECIES_SLIME_HYBRID limbs_id = SPECIES_SLIME default_color = "00FFFF" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,HAS_FLESH) inherent_traits = list(TRAIT_TOXINLOVER) mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None", "legs" = "Plantigrade") say_mod = "says" 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 e02d15303f..4d0f88754f 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -4,7 +4,7 @@ id = SPECIES_LIZARD say_mod = "hisses" default_color = "00FF00" - species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) + species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,LIPS,HORNCOLOR,WINGCOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE mutanttongue = /obj/item/organ/tongue/lizard mutanttail = /obj/item/organ/tail/lizard @@ -48,7 +48,7 @@ name = "Ash Walker" id = SPECIES_ASHWALKER limbs_id = SPECIES_LIZARD - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE) + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,CAN_SCAR,HAS_FLESH,HAS_BONE) inherent_traits = list(TRAIT_CHUNKYFINGERS) mutantlungs = /obj/item/organ/lungs/ashwalker mutanteyes = /obj/item/organ/eyes/night_vision 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 45a1870ae8..c25c5efb6c 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -68,7 +68,7 @@ /datum/species/pod/pseudo_weak name = "Anthromorphic Plant" id = SPECIES_POD_WEAK - species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE) mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") limbs_id = SPECIES_POD light_nutrition_gain_factor = 3 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 4806813c04..33a2a09b70 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -203,6 +203,15 @@ var/obj/item/I = AM if(I.light_range && I.light_power) disintegrate(I) + else if (isstructure(AM)) + var/obj/structure/S = AM + if(istype(S, /obj/structure/glowshroom) || istype(S, /obj/structure/marker_beacon)) + qdel(S) + visible_message("[S] is disintegrated by [src]!") + else if(AM.light_range && AM.light_power && !(istype(AM, /obj/machinery/power/apc) || istype(AM, /obj/machinery/airalarm))) + var/obj/target_object = AM + target_object.take_damage(force * 5, BRUTE, "melee", 0) + /obj/item/light_eater/proc/disintegrate(obj/item/O) if(istype(O, /obj/item/pda)) 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 2757c624e7..9d5a700417 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -4,8 +4,8 @@ id = SPECIES_XENOHYBRID say_mod = "hisses" default_color = "00FF00" - 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") + species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE) + mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 44701a26b2..e7426aa1fa 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -141,7 +141,8 @@ /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +//only_robotic and only_organic arg only relevant for carbons +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(!forced && (status_flags & GODMODE)) return FALSE bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) @@ -215,7 +216,8 @@ /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) +//only_robotic and only_organic arg only relevant for carbons +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(!forced && (status_flags & GODMODE)) return FALSE fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index 16855d6f22..8d1ee38de6 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -17,6 +17,9 @@ /mob/living/proc/initiate_parry_sequence() if(parrying) return // already parrying + if(!(mobility_flags & MOBILITY_USE)) + to_chat(src, "You can't move your arms!") + return if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE)) to_chat(src, "You are not something that can parry attacks.") return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index d4ccc63b34..742d4d8624 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -63,6 +63,8 @@ //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt + /// Do we make floors dirty as we move? + var/causes_dirt_buildup_on_floor = FALSE var/list/roundstart_quirks = list() diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 0cdfe9dbf2..9e093d391e 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -101,7 +101,30 @@ if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) + if(causes_dirt_buildup_on_floor && (movement_type & GROUND)) + dirt_buildup() +/** + * Attempts to make the floor dirty. + */ +/mob/living/proc/dirt_buildup(strength = 1) + var/turf/open/T = loc + if(!istype(T) || !T.dirt_buildup_allowed) + return + var/area/A = T.loc + if(!A.dirt_buildup_allowed) + return + var/multiplier = CONFIG_GET(number/turf_dirty_multiplier) + strength *= multiplier + var/obj/effect/decal/cleanable/dirt/D = locate() in T + if(D) + D.dirty(strength) + else + T.dirtyness += strength + if(T.dirtyness >= (isnull(T.dirt_spawn_threshold)? CONFIG_GET(number/turf_dirt_threshold) : T.dirt_spawn_threshold)) + D = new /obj/effect/decal/cleanable/dirt(T) + D.dirty(T.dirt_spawn_threshold - T.dirtyness) + T.dirtyness = 0 // reset. /mob/living/Move_Pulled(atom/A) . = ..() diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index c5fa5ece1f..c339aa920f 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -81,10 +81,10 @@ to_chat(src, "The impact degrades your holochassis!") return amount -/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) return take_holo_damage(amount) -/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) return take_holo_damage(amount) /mob/living/silicon/pai/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, toxins_type = TOX_DEFAULT) diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 9a2921cc0e..f478458829 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -7,13 +7,13 @@ updatehealth() return amount -/mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BRUTE]) . = adjustHealth(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BURN]) diff --git a/code/modules/mob/living/simple_animal/hostile/bread.dm b/code/modules/mob/living/simple_animal/hostile/bread.dm new file mode 100644 index 0000000000..317827028d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/bread.dm @@ -0,0 +1,69 @@ +//funny reference to the video 'Expiration Date' + +/mob/living/simple_animal/hostile/bread + name = "tumor bread" + desc = "I have done nothing but teleport bread for three days." + icon_state = "tumorbread" + health = 1 + maxHealth = 1 + turns_per_move = 5 //this isn't player speed =| + speed = 2 //this is player speed + melee_damage_lower = 1 + melee_damage_upper = 2 + obj_damage = 0 + loot = list(/obj/item/reagent_containers/food/snacks/store/bread/tumor_bread) + 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) + minbodytemp = 270 + maxbodytemp = INFINITY + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + response_help_continuous = "pokes" + response_help_simple = "poke" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "punches" + response_harm_simple = "punch" + speak_emote = list("growls") + mouse_opacity = 2 + density = TRUE + ventcrawler = VENTCRAWLER_ALWAYS + verb_say = "growls" + verb_ask = "growls inquisitively" + verb_exclaim = "growls loudly" + verb_yell = "growls loudly" + del_on_death = TRUE + +/mob/living/simple_animal/bread/hostile/Initialize() + . = ..() + var/area/A = get_area(src) + if(A) + notify_ghosts("A tumor bread has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) + +/mob/living/simple_animal/hostile/bread/attack_ghost(mob/user) + if(key) //please stop using src. without a good reason. + return + if(CONFIG_GET(flag/use_age_restriction_for_jobs)) + if(!isnum(user.client.player_age)) + return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return + if(!SSticker.mode) + to_chat(user, "Can't become a tumor bread before the game has started.") + return + var/be_bread = alert("Become a tumor bread? (Warning, You can no longer be cloned!)",,"Yes","No") + if(be_bread == "No" || QDELETED(src) || !isobserver(user)) + return + if(key) + to_chat(user, "Someone else already took this tumor bread.") + return + sentience_act() + user.transfer_ckey(src, FALSE) + density = TRUE + +/mob/living/simple_animal/hostile/bread/ex_act() + return + +/mob/living/simple_animal/hostile/bread/start_pulling() + return FALSE diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 1f45e57718..ab59441572 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -225,7 +225,7 @@ . += "Power Level: [powerlevel]" -/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE) if(!forced) amount = -abs(amount) return ..() //Heals them diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 7a69026922..605f0a2d55 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -508,7 +508,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(LOG_EMOTE) colored_message = "(EMOTE) [colored_message]" - var/list/timestamped_message = list("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)]" = colored_message) + var/list/timestamped_message = list("\[[TIME_STAMP("hh:mm:ss", FALSE)]\] [key_name(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) logging[smessage_type] += timestamped_message diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 658d7e5874..c5c53dc876 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -148,8 +148,8 @@ proc/get_top_level_mob(var/mob/S) var/safety = 25 for(var/obj/structure/table/T in range(user, 1)) processing |= T - for(var/i in processing) - var/obj/structure/table/T = i + for(var/i = 1; i <= processing.len; ++i) + var/obj/structure/table/T = processing[i] if(safety-- <= 0) to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)") break diff --git a/code/modules/modular_computers/file_system/programs/arcade.dm b/code/modules/modular_computers/file_system/programs/arcade.dm index 87a3f1ec94..4c7b51a7fd 100644 --- a/code/modules/modular_computers/file_system/programs/arcade.dm +++ b/code/modules/modular_computers/file_system/programs/arcade.dm @@ -153,7 +153,7 @@ computer.visible_message("\The [computer] prints out paper.") if(ticket_count >= 1) new /obj/item/stack/arcadeticket((get_turf(computer)), 1) - to_chat(usr, "[src] dispenses a ticket!") + to_chat(usr, "[computer] dispenses a ticket!") ticket_count -= 1 printer.stored_paper -= 1 else diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index f6cf84eb83..d453124b71 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -141,6 +141,8 @@ var/mob/living/L = target if(!(L.mobility_flags & MOBILITY_STAND)) return + if(iscyborg(target)) + return max(1, existing - 1) var/static/datum/config_entry/number/movedelay/sprint_max_tiles_increase/SMTI if(!SMTI) SMTI = CONFIG_GET_ENTRY(number/movedelay/sprint_max_tiles_increase) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 13890ae69e..8863a098fc 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -182,8 +182,9 @@ if(..()) if(reagents.total_volume) if(M.reagents) + log_combat(user, M, "injected with sleepypen", src, reagents.log_list()) reagents.reaction(M, INJECT) - reagents.trans_to(M, reagents.total_volume) + reagents.trans_to(M, reagents.total_volume, log = "sleepypen inject") /obj/item/pen/sleepy/Initialize() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 8bf20fddc6..5b5292a020 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -78,6 +78,7 @@ set_security_level("delta") SSshuttle.registerHostileEnvironment(src) SSshuttle.lockdown = TRUE + SSpersistence.station_was_destroyed = TRUE sleep(600) if(resolved == FALSE) resolved = TRUE diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 37b23402f1..3e564a9ace 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -373,7 +373,6 @@ sawn_off = TRUE slot_flags = ITEM_SLOT_BELT - /obj/item/gun/ballistic/revolver/reverse //Fires directly at its user... unless the user is a clown, of course. clumsy_check = 0 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 7b3ac36ef6..796e544603 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -318,7 +318,7 @@ pump() return TRUE -// DOUBLE BARRELED SHOTGUN and IMPROVISED SHOTGUN are in revolver.dm +//due to code weirdness, and the fact that a refactor is coming soon anyway, the barman's shotgun and maint shotgun are in revolver.dm /obj/item/gun/ballistic/shotgun/doublebarrel/hook name = "hook modified sawn-off shotgun" diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index db16a10d1d..d1c18f0510 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -259,6 +259,7 @@ say("Not enough energy to complete operation!") return R.add_reagent(reagent, actual) + log_reagent("DISPENSER: ([COORD(src)]) ([REF(src)]) [key_name(usr)] dispensed [actual] of [reagent] to [beaker] ([REF(beaker)]).") work_animation() else @@ -281,11 +282,14 @@ var/list/chemicals_to_dispense = saved_recipes[params["recipe"]] if(!LAZYLEN(chemicals_to_dispense)) return + var/list/logstring = list() + var/earlyabort = FALSE for(var/key in chemicals_to_dispense) var/reagent = GLOB.name2reagent[translate_legacy_chem_id(key)] var/dispense_amount = chemicals_to_dispense[key] + logstring += "[reagent] = [dispense_amount]" if(!dispensable_reagents.Find(reagent)) - return + break if(!recording_recipe) if(!beaker) return @@ -295,11 +299,15 @@ if(actual) if(!cell.use(actual / powerefficiency)) say("Not enough energy to complete operation!") - return + earlyabort = TRUE + break R.add_reagent(reagent, actual) work_animation() else recording_recipe[key] += dispense_amount + logstring = logstring.Join(", ") + if(!recording_recipe) + log_reagent("DISPENSER: [key_name(usr)] dispensed recipe [params["recipe"]] with chemicals [logstring] to [beaker] ([REF(beaker)])[earlyabort? " (aborted early)":""]") . = TRUE if("clear_recipes") if(!is_operational()) @@ -322,15 +330,19 @@ if(saved_recipes[name] && alert("\"[name]\" already exists, do you want to overwrite it?",, "Yes", "No") == "No") return if(name && recording_recipe) + var/list/logstring = list() for(var/reagent in recording_recipe) var/reagent_id = GLOB.name2reagent[translate_legacy_chem_id(reagent)] + logstring += "[reagent_id] = [recording_recipe[reagent]]" if(!dispensable_reagents.Find(reagent_id)) visible_message("[src] buzzes.", "You hear a faint buzz.") to_chat(usr, "[src] cannot find [reagent]!") playsound(src, 'sound/machines/buzz-two.ogg', 50, TRUE) return saved_recipes[name] = recording_recipe + logstring = logstring.Join(", ") recording_recipe = null + log_reagent("DISPENSER: [key_name(usr)] recorded recipe [name] with chemicals [logstring]") . = TRUE if("cancel_recording") if(!is_operational()) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 32ac7cecba..89fdb52b2a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -257,9 +257,9 @@ var/amount = text2num(params["amount"]) if(amount == null) amount = text2num(input(usr, - "Max 10. Buffer content will be split evenly.", + "Max 20. Buffer content will be split evenly.", "How many to make?", 1)) - amount = clamp(round(amount), 0, 10) + amount = clamp(round(amount), 0, 20) if (amount <= 0) return FALSE // Get units per item diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e64647028c..193b96e841 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1126,7 +1126,7 @@ if(istype(O, /obj/item/stack/medical/gauze)) var/obj/item/stack/medical/gauze/G = O reac_volume = min((reac_volume / 10), G.amount) - new/obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume) + new /obj/item/stack/medical/gauze/adv(get_turf(G), reac_volume) G.use(reac_volume) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index ec26182813..6e1b753c32 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -455,7 +455,7 @@ grinded.on_grind() reagents.add_reagent_list(grinded.grind_results) if(grinded.reagents) //food and pills - grinded.reagents.trans_to(src, grinded.reagents.total_volume) + grinded.reagents.trans_to(src, grinded.reagents.total_volume, log = "mortar powdering") to_chat(user, "You break [grinded] into powder.") QDEL_NULL(grinded) return diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 5aeac1bc38..1f89af420e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -41,7 +41,7 @@ if(M.reagents) var/trans = 0 if(!infinite) - trans = reagents.trans_to(M, amount_per_transfer_from_this) + trans = reagents.trans_to(M, amount_per_transfer_from_this, log = TRUE) else trans = reagents.copy_to(M, amount_per_transfer_from_this) @@ -427,7 +427,7 @@ var/fraction = min(vial.amount_per_transfer_from_this/vial.reagents.total_volume, 1) vial.reagents.reaction(L, method, fraction) - vial.reagents.trans_to(target, vial.amount_per_transfer_from_this) + vial.reagents.trans_to(target, vial.amount_per_transfer_from_this, log = TRUE) var/long_sound = vial.amount_per_transfer_from_this >= 15 playsound(loc, long_sound ? 'sound/items/hypospray_long.ogg' : pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, 1, -1) to_chat(user, "You [fp_verb] [vial.amount_per_transfer_from_this] units of the solution. The hypospray's cartridge now contains [vial.reagents.total_volume] units.") diff --git a/code/modules/reagents/reagent_containers/medspray.dm b/code/modules/reagents/reagent_containers/medspray.dm index 052e85a3d1..8d30f25db2 100644 --- a/code/modules/reagents/reagent_containers/medspray.dm +++ b/code/modules/reagents/reagent_containers/medspray.dm @@ -80,7 +80,7 @@ playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) reagents.reaction(L, apply_type, fraction) - reagents.trans_to(L, amount_per_transfer_from_this) + reagents.trans_to(L, amount_per_transfer_from_this, log = TRUE) return /obj/item/reagent_containers/medspray/styptic diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 3c23794e5a..a5b4e5b8ab 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -56,7 +56,7 @@ log_combat(user, M, "fed", reagents.log_list()) if(reagents.total_volume) reagents.reaction(M, apply_type) - reagents.trans_to(M, reagents.total_volume) + reagents.trans_to(M, reagents.total_volume, log = TRUE) qdel(src) return TRUE @@ -76,7 +76,8 @@ user.visible_message("[user] slips something into [target]!", "You dissolve [src] in [target].", vision_distance = 2) - reagents.trans_to(target, reagents.total_volume) + log_combat(user, target, "spiked", src, reagents.log_list()) + reagents.trans_to(target, reagents.total_volume, log = TRUE) qdel(src) return STOP_ATTACK_PROC_CHAIN diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm index 469a8ef907..5d94e78809 100644 --- a/code/modules/reagents/reagent_containers/rags.dm +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -39,7 +39,7 @@ C.visible_message("[user] is trying to smother \the [C] with \the [src]!", "[user] is trying to smother you with \the [src]!", "You hear some struggling and muffled cries of surprise.") if(do_after(user, 20, target = C)) reagents.reaction(C, INGEST) - reagents.trans_to(C, 5) + reagents.trans_to(C, 5, log = TRUE) C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and a heavy breath taken.") log_combat(user, C, "smothered", log_object) else @@ -107,7 +107,7 @@ reagents.clear_reagents() else msg += "'s liquids into \the [target]" - reagents.trans_to(target, reagents.total_volume) + reagents.trans_to(target, reagents.total_volume, log = TRUE) to_chat(user, "[msg].") return TRUE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 926ed27854..eb3b80b693 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -81,6 +81,10 @@ else reagents.trans_to(D, amount_per_transfer_from_this, 1/range) D.color = mix_color_from_reagents(D.reagents.reagent_list) + var/turf/T = get_turf(src) + if(!T) + return + log_reagent("SPRAY: [key_name(usr)] fired [src] ([REF(src)]) [COORD(T)] at [A] ([REF(A)]) [COORD(A)] (chempuff: [D.reagents.log_list()])") var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2) last_spray = world.time INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f42ae668c7..93a07b1a6e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -113,7 +113,7 @@ to_chat(user, "You cannot directly remove reagents from [target]!") return - var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares? + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, log = TRUE) // transfer from, transfer to - who cares? to_chat(user, "You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.") if (round(reagents.total_volume, 0.1) >= reagents.maximum_volume) @@ -158,7 +158,7 @@ L.log_message("injected themselves ([contained]) with [src.name]", LOG_ATTACK, color="orange") var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) reagents.reaction(L, INJECT, fraction) - reagents.trans_to(target, amount_per_transfer_from_this) + reagents.trans_to(target, amount_per_transfer_from_this, log = TRUE) to_chat(user, "You inject [amount_per_transfer_from_this] units of the solution. The syringe now contains [reagents.total_volume] units.") if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index ffa3f7478b..39ccdd23a2 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -182,7 +182,7 @@ if(W.reagents.has_reagent(/datum/reagent/fuel, W.max_fuel)) to_chat(user, "Your [W.name] is already full!") return - reagents.trans_to(W, W.max_fuel) + reagents.trans_to(W, W.max_fuel, log = TRUE) user.visible_message("[user] refills [user.p_their()] [W.name].", "You refill [W].") playsound(src, 'sound/effects/refill.ogg', 50, 1) W.update_icon() diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm index 61d0594d3b..bf9d5886a0 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_sec_and_hacked.dm @@ -74,12 +74,12 @@ build_path = /obj/item/restraints/handcuffs category = list("hacked", "Security") -/datum/design/rifle_receiver - name = "Rifle Receiver" - id = "rifle_receiver" +/datum/design/reciever + name = "Modular Receiver" + id = "modular_receiver" build_type = AUTOLATHE materials = list(/datum/material/iron = 24000) - build_path = /obj/item/weaponcrafting/improvised_parts/rifle_receiver + build_path = /obj/item/weaponcrafting/receiver category = list("hacked", "Security") /datum/design/shotgun_slug diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm index 539232bbcd..1b1c710e8c 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_tcomms_and_misc.dm @@ -282,10 +282,3 @@ build_path = /obj/item/vending_refill/custom category = list("initial", "Misc") -/datum/design/trigger_assembly - name = "Trigger Assembly" - id = "trigger_assembly" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 6500, /datum/material/glass = 50) - build_path = /obj/item/weaponcrafting/improvised_parts/trigger_assembly - category = list("initial", "Misc") diff --git a/code/modules/research/designs/machine_desings/machine_designs_engi.dm b/code/modules/research/designs/machine_desings/machine_designs_engi.dm index 4f70b6ee78..8908241b83 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_engi.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_engi.dm @@ -104,3 +104,11 @@ build_path = /obj/item/circuitboard/machine/thermomachine category = list ("Engineering Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/spaceship_navigation_beacon + name = "Machine Design (Bluespace Navigation Gigabeacon)" + desc = "The circuit board for a Bluespace Navigation Gigabeacon." + id = "spaceship_navigation_beacon" + build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon + category = list ("Teleportation Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE \ No newline at end of file diff --git a/code/modules/research/designs/machine_desings/machine_designs_sci.dm b/code/modules/research/designs/machine_desings/machine_designs_sci.dm index 59fae9d09b..28b1235a42 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_sci.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_sci.dm @@ -161,3 +161,11 @@ build_path = /obj/item/circuitboard/machine/circuit_imprinter category = list("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/board/explosive_compressor + name = "Explosive Compressor (Machine Board)" + desc = "The circuit board for an explosive compressor, used to compress raw into finished anomaly cores." + id = "explosive_compressor" + build_path = /obj/item/circuitboard/machine/explosive_compressor + category = list("Research Machinery") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 445ce39ce5..9879171e71 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -308,7 +308,7 @@ materials = list(/datum/material/iron = 16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000) build_path = /obj/item/disk/medical/defib_heal construction_time = 10 - category = list("Misc") + category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/defib_shock @@ -319,7 +319,7 @@ materials = list(/datum/material/iron = 16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000) build_path = /obj/item/disk/medical/defib_shock construction_time = 10 - category = list("Misc") + category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/defib_decay @@ -330,7 +330,7 @@ materials = list(/datum/material/iron = 16000, /datum/material/glass = 18000, /datum/material/gold = 16000, /datum/material/silver = 6000, /datum/material/titanium = 2000) build_path = /obj/item/disk/medical/defib_decay construction_time = 10 - category = list("Misc") + category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/defib_speed @@ -341,7 +341,7 @@ build_path = /obj/item/disk/medical/defib_speed materials = list(/datum/material/iron = 16000, /datum/material/glass = 8000, /datum/material/gold = 26000, /datum/material/silver = 26000) construction_time = 10 - category = list("Misc") + category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/defibrillator_compact @@ -637,20 +637,20 @@ name = "Cybernetic Liver" desc = "A cybernetic liver" id = "cybernetic_liver" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/liver/cybernetic - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_heart name = "Cybernetic Heart" desc = "A cybernetic heart" id = "cybernetic_heart" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/heart/cybernetic - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_heart_u @@ -668,40 +668,40 @@ name = "Upgraded Cybernetic Liver" desc = "An upgraded cybernetic liver" id = "cybernetic_liver_u" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/liver/cybernetic/upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_lungs name = "Cybernetic Lungs" desc = "A pair of cybernetic lungs." id = "cybernetic_lungs" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/lungs/cybernetic - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_lungs_u name = "Upgraded Cybernetic Lungs" desc = "A pair of upgraded cybernetic lungs." id = "cybernetic_lungs_u" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500) build_path = /obj/item/organ/lungs/cybernetic/upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_tongue name = "Cybernetic tongue" desc = "A fancy cybernetic tongue." id = "cybernetic_tongue" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/organ/tongue/cybernetic - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/cybernetic_ears @@ -726,6 +726,32 @@ category = list("Misc", "Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +///////////////////// +/////Synth Organs//// +///////////////////// + +/datum/design/ipc_stomach + name = "IPC cell" + desc = "Effectively the robot equivalent of a stomach, handling power storage." + id = "ipc_stomach" + build_type = PROTOLATHE | MECHFAB + construction_time = 40 + materials = list(/datum/material/iron = 1000, /datum/material/glass = 300, /datum/material/silver = 500, /datum/material/gold = 400) + build_path = /obj/item/organ/stomach/ipc + category = list("Misc", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/cyberimp_power_cord + name = "IPC power cord" + desc = "A implant for Robots designed to siphon power from APCs to recharge their own cell." + id = "ci-power-cord" + build_type = PROTOLATHE | MECHFAB + construction_time = 75 + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1500, /datum/material/silver = 1200, /datum/material/gold = 1600, /datum/material/plasma = 1000) + build_path = /obj/item/organ/cyberimp/arm/power_cord + category = list("Misc", "Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + ///////////////////// ///Surgery Designs/// ///////////////////// @@ -899,88 +925,88 @@ name = "Surplus prosthetic left arm" desc = "Basic outdated and fragile prosthetic left arm." id = "basic_l_arm" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500) construction_time = 20 build_path = /obj/item/bodypart/l_arm/robot/surplus - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/basic_r_arm name = "Surplus prosthetic right arm" desc = "Basic outdated and fragile prosthetic left arm." id = "basic_r_arm" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500) construction_time = 20 build_path = /obj/item/bodypart/r_arm/robot/surplus - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/basic_l_leg name = "Surplus prosthetic left leg" desc = "Basic outdated and fragile prosthetic left leg." id = "basic_l_leg" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500) construction_time = 20 build_path = /obj/item/bodypart/l_leg/robot/surplus - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/basic_r_leg name = "Surplus prosthetic right leg" desc = "Basic outdated and fragile prosthetic right leg." id = "basic_r_leg" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500) construction_time = 20 build_path = /obj/item/bodypart/r_leg/robot/surplus - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/adv_r_leg name = "Advanced prosthetic right leg" desc = "A renforced prosthetic right leg." id = "adv_r_leg" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 6000, /datum/material/glass = 3500, /datum/material/gold = 500, /datum/material/titanium = 800) construction_time = 40 build_path = /obj/item/bodypart/r_leg/robot/surplus_upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/adv_l_leg name = "Advanced prosthetic left leg" desc = "A renforced prosthetic left leg." id = "adv_l_leg" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 6000, /datum/material/glass = 3500, /datum/material/gold = 500, /datum/material/titanium = 800) construction_time = 40 build_path = /obj/item/bodypart/l_leg/robot/surplus_upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/adv_l_arm name = "Advanced prosthetic left arm" desc = "A renforced prosthetic left arm." id = "adv_l_arm" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 6000, /datum/material/glass = 3500, /datum/material/gold = 500, /datum/material/titanium = 800) construction_time = 40 build_path = /obj/item/bodypart/l_arm/robot/surplus_upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/adv_r_arm name = "Advanced prosthetic right arm" desc = "A renforced prosthetic right arm." id = "adv_r_arm" - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list(/datum/material/iron = 6000, /datum/material/glass = 3500, /datum/material/gold = 500, /datum/material/titanium = 800) construction_time = 40 build_path = /obj/item/bodypart/r_arm/robot/surplus_upgraded - category = list("Medical Designs") + category = list("Misc","Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index a54fe857e9..7dfe19f635 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -481,7 +481,7 @@ build_path = /obj/item/holosign_creator/atmos category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - +/* /datum/design/holosignfirelock name = "ATMOS Holofirelock Projector" desc = "A holographic projector that creates holographic barriers that prevent changes in temperature conditions." @@ -491,7 +491,7 @@ build_path = /obj/item/holosign_creator/firelock category = list("Tool Designs") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - +*/ /datum/design/holosigncombifan name = "ATMOS Holo-Combifan Projector" desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric and temperature conditions." diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm index 977f8685d6..3c89f0bbab 100644 --- a/code/modules/research/techweb/nodes/biotech_nodes.dm +++ b/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -5,7 +5,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner","chem_pack") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv", "medspray","genescanner","chem_pack", "portable_chem_mixer") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/adv_biotech diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm index b0705a0b76..ae9fdd6485 100644 --- a/code/modules/research/techweb/nodes/bluespace_nodes.dm +++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm @@ -70,7 +70,7 @@ display_name = "Basic Shuttle Research" description = "Research the technology required to create and use basic shuttles." prereq_ids = list("practical_bluespace", "adv_engi") - design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker") + design_ids = list("shuttle_creator", "engine_plasma", "engine_heater", "shuttle_control", "shuttle_docker","spaceship_navigation_beacon") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) /datum/techweb_node/shuttle_route_upgrade diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm index f4dce58740..2b5d6f3cc1 100644 --- a/code/modules/research/techweb/nodes/engineering_nodes.dm +++ b/code/modules/research/techweb/nodes/engineering_nodes.dm @@ -26,7 +26,7 @@ display_name = "Anomaly Research" description = "Unlock the potential of the mysterious anomalies that appear on station." prereq_ids = list("adv_engi", "practical_bluespace") - design_ids = list("reactive_armour", "anomaly_neutralizer") + design_ids = list("reactive_armour", "anomaly_neutralizer", "explosive_compressor") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) /datum/techweb_node/high_efficiency diff --git a/code/modules/research/techweb/nodes/medical_nodes.dm b/code/modules/research/techweb/nodes/medical_nodes.dm index 2c0240f1da..914a6174ab 100644 --- a/code/modules/research/techweb/nodes/medical_nodes.dm +++ b/code/modules/research/techweb/nodes/medical_nodes.dm @@ -80,7 +80,7 @@ display_name = "Upgraded Cybernetic Organs" description = "We have the technology to upgrade him." prereq_ids = list("cyber_organs") - design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u") + design_ids = list("cybernetic_ears_u", "cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u", "ipc_stomach") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500) /datum/techweb_node/cyber_implants @@ -88,7 +88,7 @@ display_name = "Cybernetic Implants" description = "Electronic implants that improve humans." prereq_ids = list("adv_biotech", "adv_datatheory") - design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service") + design_ids = list("ci-nutriment", "ci-breather", "ci-gloweyes", "ci-welding", "ci-medhud", "ci-sechud", "ci-service", "ci-power-cord") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/adv_cyber_implants diff --git a/code/modules/research/techweb/nodes/misc_nodes.dm b/code/modules/research/techweb/nodes/misc_nodes.dm index 1bdc144232..94a19924b8 100644 --- a/code/modules/research/techweb/nodes/misc_nodes.dm +++ b/code/modules/research/techweb/nodes/misc_nodes.dm @@ -38,7 +38,7 @@ display_name = "Electromagnetic Theory" description = "Study into usage of frequencies in the electromagnetic spectrum." prereq_ids = list("base") - design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos", "holosignfirelock", "inducer", "tray_goggles", "holopad") + design_ids = list("holosign", "holosignsec", "holosignengi", "holosignatmos",/* "holosignfirelock",*/ "inducer", "tray_goggles", "holopad") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/emp_adv @@ -75,15 +75,14 @@ prereq_ids = list("base") design_ids = list("sticky_tape") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) - hidden = TRUE - experimental = TRUE + starting_node = TRUE -// Can be researched after getting the basic sticky technology from the BEPIS major reward +// now a BEPIS locked thing /datum/techweb_node/sticky_advanced id = "sticky_advanced" display_name = "Advanced Sticky Technology" description = "Taking a good joke too far? Nonsense!" - prereq_ids = list("sticky_basic") design_ids = list("super_sticky_tape", "pointy_tape") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) hidden = TRUE + experimental = TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index cbfbbe2a36..9b19516f26 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -884,6 +884,7 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/oil/tick() if(owner.stat == DEAD) explosion(get_turf(owner),1,2,4,flame_range = 5) + owner.remove_status_effect(/datum/status_effect/stabilized/oil) return ..() /datum/status_effect/stabilized/black diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index e87382cd6a..5e2fc3d7e4 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -136,10 +136,13 @@ return if(ishuman(AM)) var/mob/living/carbon/human/H = AM - if(user.real_name != H.dna.real_name) - user.real_name = H.dna.real_name - H.dna.transfer_identity(user, transfer_SE=1) - user.updateappearance(mutcolor_update=1) - user.domutcheck() - user.visible_message("[user]'s appearance shifts into [H]'s!", \ - "[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.") + if(!(NOTRANSSTING in H.dna.species.species_traits)) + if(user.real_name != H.dna.real_name) + user.real_name = H.dna.real_name + H.dna.transfer_identity(user, transfer_SE=1) + user.updateappearance(mutcolor_update=1) + user.domutcheck() + user.visible_message("[user]'s appearance shifts into [H]'s!", \ + "[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.") + else + to_chat(user, "You are unable to transform into [H]!") diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 21a9c6c5d7..36abcb41dc 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -11,6 +11,7 @@ var/list/jumpto_ports = list() //hashset of ports to jump to and ignore for collision purposes var/obj/docking_port/stationary/my_port //the custom docking port placed by this console var/obj/docking_port/mobile/shuttle_port //the mobile docking port of the connected shuttle + var/list/locked_traits = list(ZTRAIT_RESERVED, ZTRAIT_CENTCOM, ZTRAIT_AWAY, ZTRAIT_REEBE) //traits forbided for custom docking var/view_range = 0 var/x_offset = 0 var/y_offset = 0 @@ -186,7 +187,7 @@ var/turf/eyeturf = get_turf(the_eye) if(!eyeturf) return SHUTTLE_DOCKER_BLOCKED - if(z_lock.len && !(eyeturf.z in z_lock)) + if(!eyeturf.z || SSmapping.level_has_any_trait(eyeturf.z, locked_traits)) return SHUTTLE_DOCKER_BLOCKED . = SHUTTLE_DOCKER_LANDING_CLEAR @@ -224,9 +225,9 @@ if(hidden_turf_info) . = SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT - if(space_turfs_only) + if(length(whitelist_turfs)) var/turf_type = hidden_turf_info ? hidden_turf_info[2] : T.type - if(!ispath(turf_type, /turf/open/space)) + if(!is_type_in_typecache(turf_type, whitelist_turfs)) return SHUTTLE_DOCKER_BLOCKED if(length(whitelist_turfs)) @@ -324,12 +325,25 @@ var/list/L = list() for(var/V in SSshuttle.stationary) if(!V) + stack_trace("SSshuttle.stationary have null entry!") continue var/obj/docking_port/stationary/S = V if(console.z_lock.len && !(S.z in console.z_lock)) continue if(console.jumpto_ports[S.id]) - L[S.name] = S + L["([L.len])[S.name]"] = S + + for(var/V in SSshuttle.beacons) + if(!V) + stack_trace("SSshuttle.beacons have null entry!") + continue + var/obj/machinery/spaceship_navigation_beacon/nav_beacon = V + if(!nav_beacon.z || SSmapping.level_has_any_trait(nav_beacon.z, console.locked_traits)) + break + if(!nav_beacon.locked) + L["([L.len]) [nav_beacon.name] located: [nav_beacon.x] [nav_beacon.y] [nav_beacon.z]"] = nav_beacon + else + L["([L.len]) [nav_beacon.name] locked"] = null playsound(console, 'sound/machines/terminal_prompt.ogg', 25, 0) var/selected = input("Choose location to jump to", "Locations", null) as null|anything in L diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm new file mode 100644 index 0000000000..f1861e0477 --- /dev/null +++ b/code/modules/shuttle/spaceship_navigation_beacon.dm @@ -0,0 +1,63 @@ +/obj/item/circuitboard/machine/spaceship_navigation_beacon + name = "Bluespace Navigation Gigabeacon (Machine Board)" + build_path = /obj/machinery/spaceship_navigation_beacon + req_components = list() + + +/obj/machinery/spaceship_navigation_beacon + name = "Bluespace Navigation Gigabeacon" + desc = "A device that creates a bluespace anchor that allow ships jump near to it." + icon = 'icons/obj/abductor.dmi' + icon_state = "core" + use_power = IDLE_POWER_USE + idle_power_usage = 0 + density = TRUE + circuit = /obj/item/circuitboard/machine/spaceship_navigation_beacon + + var/locked = FALSE //Locked beacons don't allow to jump to it. + + +/obj/machinery/spaceship_navigation_beacon/Initialize() + . = ..() + SSshuttle.beacons |= src + +obj/machinery/spaceship_navigation_beacon/emp_act() + locked = TRUE + +/obj/machinery/spaceship_navigation_beacon/Destroy() + SSshuttle.beacons -= src + return ..() + +// update the icon_state +/obj/machinery/spaceship_navigation_beacon/update_icon() + if(powered()) + icon_state = "core" + else + icon_state = "core-open" + +/obj/machinery/spaceship_navigation_beacon/power_change() + . = ..() + update_icon() + +/obj/machinery/spaceship_navigation_beacon/multitool_act(mob/living/user, obj/item/multitool/I) + if(panel_open) + var/new_name = "Beacon_[input("Enter the custom name for this beacon", "It be Beacon ..your input..") as text]" + if(new_name && Adjacent(user)) + name = new_name + to_chat(user, "You change beacon name to [name].") + else + locked =!locked + to_chat(user, "You [locked ? "" : "un"]lock [src].") + return TRUE + +/obj/machinery/spaceship_navigation_beacon/examine() + .=..() + . += "Status: [locked ? "LOCKED" : "Stable"] " + +/obj/machinery/spaceship_navigation_beacon/attackby(obj/item/W, mob/user, params) + if(default_deconstruction_screwdriver(user, "core-open", "core", W)) + return + if(default_deconstruction_crowbar(W)) + return + + return ..() \ No newline at end of file diff --git a/code/modules/spells/spell_types/togglebuff.dm b/code/modules/spells/spell_types/togglebuff.dm new file mode 100644 index 0000000000..4b8f3d02e1 --- /dev/null +++ b/code/modules/spells/spell_types/togglebuff.dm @@ -0,0 +1,39 @@ +/obj/effect/proc_holder/spell/self/mantra + name = "Inner Mantra" + desc = "Control your Inner Mantra, gaining strength and durability for a cost." + clothes_req = NONE + mobs_whitelist = list(/mob/living/carbon/human) + charge_max = 100 + antimagic_allowed = TRUE + invocation = "SU'UP'AH S'EI YEN" + invocation_type = "shout" + level_max = 0 + cooldown_min = 100 + action_icon = 'icons/obj/magic.dmi' + action_icon_state = "iconmantra" + +/obj/effect/proc_holder/spell/self/mantra/cast(mob/living/carbon/human/user) + if(user.has_status_effect(STATUS_EFFECT_MANTRA)) + user.remove_status_effect(STATUS_EFFECT_MANTRA) + else + user.apply_status_effect(STATUS_EFFECT_MANTRA) + +/obj/effect/proc_holder/spell/self/asura + name = "Asura's Wrath" + desc = "Unleash your rage as corrosive power fills your muscles." + clothes_req = NONE + mobs_whitelist = list(/mob/living/carbon/human) + charge_max = 100 + antimagic_allowed = TRUE + invocation = "KYE Y'O'KEN" + invocation_type = "shout" + level_max = 0 + cooldown_min = 100 + action_icon = 'icons/obj/magic.dmi' + action_icon_state = "iconasura" + +/obj/effect/proc_holder/spell/self/asura/cast(mob/living/carbon/human/user) + if(user.has_status_effect(STATUS_EFFECT_ASURA)) + user.remove_status_effect(STATUS_EFFECT_ASURA) + else + user.apply_status_effect(STATUS_EFFECT_ASURA) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index cd0ac28daf..2ca7d07e73 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -394,11 +394,10 @@ var/datum/wound/new_wound if(replaced_wound) new_wound = replaced_wound.replace_wound(possible_wound) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned else new_wound = new possible_wound new_wound.apply_wound(src) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned return new_wound // try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 9d304b0727..311c886c9d 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -36,6 +36,6 @@ log_combat(owner, null, "swallowed an implanted pill", target) if(target.reagents.total_volume) target.reagents.reaction(owner, INGEST) - target.reagents.trans_to(owner, target.reagents.total_volume) + target.reagents.trans_to(owner, target.reagents.total_volume, log = TRUE) qdel(target) return 1 diff --git a/code/modules/surgery/emergency_reboot.dm b/code/modules/surgery/emergency_reboot.dm new file mode 100644 index 0000000000..046edd884c --- /dev/null +++ b/code/modules/surgery/emergency_reboot.dm @@ -0,0 +1,62 @@ +//Emergency Reboot: A surgery that allows for revival of Synthetics without the need for a defib. Doesn't all all the organs like the Revival surgery though. + +/datum/surgery/emergency_reboot + name = "Emergency Reboot" + desc = "A surgery forcing the posibrain of a robot to begin it's reboot procedure, if their body can sustain its operation." + possible_locs = list(BODY_ZONE_HEAD) + requires_bodypart_type = BODYPART_ROBOTIC //If you are a Synth with a organic head (somehow), this won't work. + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/force_reboot, /datum/surgery_step/mechanic_wrench, /datum/surgery_step/mechanic_close) + +/datum/surgery/emergency_reboot/can_start(mob/user, mob/living/carbon/target, obj/item/tool) + if(!..()) + return FALSE + if(target.stat != DEAD) + return FALSE + if(target.suiciding || HAS_TRAIT(target, TRAIT_NOCLONE) || target.hellbound) + return FALSE + if(!HAS_TRAIT(target, TRAIT_ROBOTIC_ORGANISM)) + return FALSE + var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!B || !istype(B, /obj/item/organ/brain/ipc)) + return FALSE + return TRUE + +/datum/surgery_step/force_reboot + name = "initiate system reboot" + implements = list(TOOL_MULTITOOL = 100, /obj/item/borg/upgrade/restart = 100) + time = 100 + +/datum/surgery_step/force_reboot/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You prepare to begin rebooting [target]'s posibrain.", + "[user] prepares to reboot [target]'s posibrain with [tool].", + "[user] prepares to reboot [target]'s posibrain with [tool].") + target.notify_ghost_cloning("Someone is trying to reboot you! Re-enter your corpse if you want to be revived!", source = target) + +/datum/surgery_step/force_reboot/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You successfully initiate a reboot in [target]'s posibrain...", + "[user] initiates a reboot in [target]'s posibrain...", + "[user] initiates a reboot in [target]'s posibrain...") + target.adjustOxyLoss(-50, 0) + target.updatehealth() + var/tplus = world.time - target.timeofdeath + if(target.revive()) + target.visible_message("...[target]'s posibrain flickers to life once again!") + target.emote("ping") + var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds + var/late = timelimit && (tplus > timelimit) + var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] + if(policy) + to_chat(target, policy) + target.log_message("revived using surgical revival, [tplus] deciseconds from time of death, considered [late? "late" : "memory-intact"] revival under configured policy limits.", LOG_GAME) + return TRUE + else + target.visible_message("...[target]'s posibrain flickers a few times, before the lights fade yet again...") + return FALSE + +/datum/surgery_step/force_reboot/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, "You attempt to reboot [target]'s posibrain, but [target.p_they()] doesn't react.", + "[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react.", + "[user] attempts to reboot [target]'s posibrain, but [target.p_they()] doesn't react") + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 199) + return FALSE diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 059a5aaa34..c65f5f11f6 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -31,6 +31,12 @@ target_mobtypes = list(/mob/living/carbon/human) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) requires_real_bodypart = TRUE + +//The augmentation surgery for synthetic limbs +/datum/surgery/augmentation/synth + requires_bodypart_type = BODYPART_HYBRID + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/pry_off_plating, /datum/surgery_step/cut_wires, /datum/surgery_step/prepare_electronics, /datum/surgery_step/replace_limb) + //SURGERY STEP SUCCESSES /datum/surgery_step/replace_limb/success(mob/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery) if(L) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 25b7e8fa48..6b3d47b587 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -114,7 +114,7 @@ obj/item/organ/heart/slime var/last_pump = 0 var/add_colour = TRUE //So we're not constantly recreating colour datums var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal) - var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?) + var/blood_loss = 50 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?) //How much to heal per pump, negative numbers would HURT the player var/heal_brute = 0 @@ -123,7 +123,11 @@ obj/item/organ/heart/slime /obj/item/organ/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target) + if(H == user && istype(H)) + if(NOBLOOD in H.dna.species.species_traits) + to_chat(user, "[src] refuses to become one with [H]") + return playsound(user,'sound/effects/singlebeat.ogg',40,1) user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) @@ -137,6 +141,8 @@ obj/item/organ/heart/slime if(world.time > (last_pump + pump_delay)) if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. var/mob/living/carbon/human/H = owner + if(NOBLOOD in H.dna.species.species_traits) //Otherwise people without will be eternally stuck red + return if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) H.blood_volume = max(H.blood_volume - blood_loss, 0) to_chat(H, "You have to keep pumping your blood!") @@ -156,6 +162,8 @@ obj/item/organ/heart/slime return ..() /datum/action/item_action/organ_action/cursed_heart + check_flags = AB_CHECK_ALIVE //We wanna be able to do this always, else thisll just stupidly kill whoever has it + required_mobility_flags = NONE name = "Pump your blood" //You are now brea- pumping blood manually @@ -175,7 +183,8 @@ obj/item/organ/heart/slime var/mob/living/carbon/human/H = owner if(istype(H)) if(H.dna && !(NOBLOOD in H.dna.species.species_traits)) - H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_MAXIMUM) + if(H.blood_volume < BLOOD_VOLUME_NORMAL) //We don't need to go too high, otherwise we get annoying messages. + H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss * 0.5, BLOOD_VOLUME_MAXIMUM) H.remove_client_colour(/datum/client_colour/cursed_heart_blood) cursed_heart.add_colour = TRUE H.adjustBruteLoss(-cursed_heart.heal_brute) @@ -184,7 +193,7 @@ obj/item/organ/heart/slime /datum/client_colour/cursed_heart_blood - priority = 100 //it's an indicator you're dieing, so it's very high priority + priority = 100 //it's an indicator you're dying, so it's very high priority colour = "red" /obj/item/organ/heart/cybernetic diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index f974c39bb4..dfdb1f7eca 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -2,11 +2,17 @@ name = "removal of embedded objects" steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/remove_object) possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + +/datum/surgery/embedded_removal/robot + requires_bodypart_type = BODYPART_ROBOTIC + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/remove_object) + /datum/surgery_step/remove_object name = "remove embedded objects" time = 32 accept_hand = 1 var/obj/item/bodypart/L = null + /datum/surgery_step/remove_object/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) L = surgery.operated_bodypart if(L) diff --git a/code/modules/uplink/uplink_items/uplink_roles.dm b/code/modules/uplink/uplink_items/uplink_roles.dm index b384106396..4edbe2f2c7 100644 --- a/code/modules/uplink/uplink_items/uplink_roles.dm +++ b/code/modules/uplink/uplink_items/uplink_roles.dm @@ -142,6 +142,14 @@ cost = 4 // Has syndie tools + gloves + a robust weapon restricted_roles = list("Assistant", "Curator") //Curator due to this being made of gold - It fits the theme +/datum/uplink_item/role_restricted/oldtoolboxclean // this is the fourth item relating to toolboxes to be placed into this godforsaken bloated uplink + name = "Ancient Toolbox" + desc = "An iconic toolbox design notorious with Assistants everywhere, this design was especially made to become more robust the more telecrystals it has inside it! Tools and insulated gloves included." + item = /obj/item/storage/toolbox/mechanical/old/clean + cost = 2 // with eighteen telecrystals you are still weaker than a desword and without any of its defenses -- the scary part comes from collaborating with allies for a fifty eight force toolbox oh fuck + restricted_roles = list("Assistant") + surplus = 0 + /datum/uplink_item/role_restricted/mimery name = "Guide to Advanced Mimery Series" desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \ @@ -242,3 +250,11 @@ cost = 2 item = /obj/item/clothing/shoes/magboots/crushing restricted_roles = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + +/datum/uplink_item/role_restricted/turretbox + name = "Disposable Sentry Gun" + desc = "A disposable sentry gun deployment system cleverly disguised as a toolbox, apply wrench for functionality." + item = /obj/item/storage/toolbox/emergency/turret + cost = 11 + restricted_roles = list("Station Engineer") + diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 655ca21b93..0b75dbf4db 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -139,6 +139,7 @@ /obj/vehicle/sealed/car/clowncar/twitch_plays key_type = null + explode_on_death = FALSE /obj/vehicle/sealed/car/clowncar/twitch_plays/Initialize() . = ..() diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 28f6b1cca8..63c7c9f858 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -1,6 +1,7 @@ /obj/vehicle/sealed enclosed = TRUE // you're in a sealed vehicle dont get dinked idiot var/enter_delay = 20 + var/explode_on_death = TRUE flags_1 = BLOCK_FACE_ATOM_1 /obj/vehicle/sealed/generate_actions() @@ -87,7 +88,8 @@ /obj/vehicle/sealed/Destroy() DumpMobs() - explosion(loc, 0, 1, 2, 3, 0) + if(explode_on_death) + explosion(loc, 0, 1, 2, 3, 0) return ..() /obj/vehicle/sealed/proc/DumpMobs(randomstep = TRUE) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e15e02f0d5..482cdb7d86 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -17,8 +17,8 @@ product_ads = "Beat perps in style!;It's red so you can't see the blood!;You have the right to be fashionable!;Now you can be the fashion police you always wanted to be!" vend_reply = "Thank you for using the SecDrobe!" products = list(/obj/item/clothing/suit/hooded/wintercoat/security = 2, - /obj/item/storage/backpack/security = 2, - /obj/item/storage/backpack/satchel/sec = 2, + /obj/item/storage/backpack/security = 3, + /obj/item/storage/backpack/satchel/sec = 3, /obj/item/storage/backpack/duffelbag/sec = 3, /obj/item/clothing/under/rank/security/officer = 5, /obj/item/clothing/shoes/jackboots = 5, @@ -88,9 +88,9 @@ vend_reply = "Thank you for using the MediDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 5, /obj/item/clothing/head/beret/med = 5, - /obj/item/storage/backpack/duffelbag/med = 5, /obj/item/storage/backpack/medic = 5, /obj/item/storage/backpack/satchel/med = 5, + /obj/item/storage/backpack/duffelbag/med = 5, /obj/item/clothing/suit/hooded/wintercoat/medical = 5, /obj/item/clothing/suit/hooded/wintercoat/paramedic = 2, /obj/item/clothing/under/rank/medical/doctor/nurse = 5, @@ -131,9 +131,9 @@ vend_reply = "Thank you for using the EngiDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 5, /obj/item/clothing/head/beret/eng = 3, - /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/storage/backpack/industrial = 3, /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering = 3, /obj/item/clothing/under/rank/engineering/engineer = 5, /obj/item/clothing/under/rank/engineering/engineer/skirt = 5, @@ -162,9 +162,9 @@ vend_reply = "Thank you for using the AtmosDrobe!" products = list(/obj/item/clothing/accessory/pocketprotector = 3, /obj/item/clothing/head/beret/atmos = 3, - /obj/item/storage/backpack/duffelbag/engineering = 3, - /obj/item/storage/backpack/satchel/eng = 3, /obj/item/storage/backpack/industrial = 3, + /obj/item/storage/backpack/satchel/eng = 3, + /obj/item/storage/backpack/duffelbag/engineering = 3, /obj/item/clothing/head/hardhat/weldhat/dblue = 3, /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 3, /obj/item/clothing/under/rank/engineering/atmospheric_technician = 5, @@ -238,6 +238,7 @@ /obj/item/clothing/head/beret/sci = 3, /obj/item/storage/backpack/science = 3, /obj/item/storage/backpack/satchel/tox = 3, + /obj/item/storage/backpack/duffelbag = 3, /obj/item/clothing/suit/hooded/wintercoat/science = 3, /obj/item/clothing/under/rank/rnd/scientist = 4, /obj/item/clothing/under/rank/rnd/scientist/util = 4, @@ -261,7 +262,9 @@ product_ads = "Do you love soil? Then buy our clothes!;Get outfits to match your green thumb here!" vend_reply = "Thank you for using the Hydrobe!" products = list(/obj/item/storage/backpack/botany = 3, + /obj/item/storage/backpack = 3, /obj/item/storage/backpack/satchel/hyd = 3, + /obj/item/storage/backpack/duffelbag = 3, /obj/item/clothing/suit/hooded/wintercoat/hydro = 2, /obj/item/clothing/suit/apron = 3, /obj/item/clothing/suit/apron/overalls = 5, @@ -375,7 +378,7 @@ /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, - /obj/item/caution = 8, + /obj/item/clothing/suit/caution = 8, /obj/item/holosign_creator = 2, /obj/item/lightreplacer = 2, /obj/item/soap = 2, @@ -468,7 +471,7 @@ /obj/item/storage/backpack/chemistry = 3, /obj/item/storage/backpack/satchel/chem = 3, /obj/item/storage/bag/chemistry = 3, - /obj/item/fermichem/pHbooklet = 3)//pH indicator) + /obj/item/fermichem/pHbooklet = 3) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe payment_department = ACCOUNT_MED cost_multiplier_per_dept = list(ACCOUNT_MED = 0) @@ -544,7 +547,7 @@ /obj/item/clothing/glasses/sunglasses/gar/supergar = 1, /obj/item/clothing/gloves/color/captain = 1) refill_canister = /obj/item/vending_refill/wardrobe/cap_wardrobe - payment_department = ACCOUNT_CIV + payment_department = ACCOUNT_SEC default_price = PRICE_ALMOST_EXPENSIVE extra_price = PRICE_ABOVE_EXPENSIVE diff --git a/config/config.txt b/config/config.txt index 72df74beb1..c7bb36af0e 100644 --- a/config/config.txt +++ b/config/config.txt @@ -11,6 +11,7 @@ $include dynamic_config.txt $include plushies/defines.txt $include job_threats.txt $include policy.txt +$include persistence.txt $include respawns.txt # You can use the @ character at the beginning of a config option to lock it from being edited in-game diff --git a/config/game_options.txt b/config/game_options.txt index bc5fdf940e..3c53d9fecb 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -668,4 +668,10 @@ ALLOW_CUSTOM_SKINTONES ## Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. ## Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. -#USE_FIELD_OF_VISION \ No newline at end of file +#USE_FIELD_OF_VISION + +## Default turf threshold to get dirt +TURF_DIRT_THRESHOLD 100 + +## Default alpha of dirt on spawn +DIRT_ALPHA_STARTING 127 diff --git a/config/persistence.txt b/config/persistence.txt new file mode 100644 index 0000000000..7d65a150e2 --- /dev/null +++ b/config/persistence.txt @@ -0,0 +1,14 @@ +### Whether or not cleanable object persistence is on +PERSISTENT_DEBRIS + +### Whether or not ONLY persistent cleanable objects should be spawned, for supported objects +PERSISTENT_DEBRIS_ONLY + +### Max objects to store, total +PERSISTENT_DEBRIS_GLOBAL_MAX 10000 + +### Max objects to store per type, total +PERSISTENT_DEBRIS_TYPE_MAX 2000 + +### Wipe objects on nuke for the above +PERSISTENT_DEBRIS_WIPE_ON_NUKE diff --git a/config/respawns.txt b/config/respawns.txt index 337a691b07..804a856a93 100644 --- a/config/respawns.txt +++ b/config/respawns.txt @@ -25,5 +25,5 @@ RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0 ## Gamemode (config tags!) banlist for respawn RESPAWN_CHAOS_GAMEMODES WIZARD RESPAWN_CHAOS_GAMEMODES NUCLEAR -RESPAWN_CHAOS_GAMEMODES CLONWOPS -RESPAWN_CHOAS_GAMEMODES REVOLUTION +RESPAWN_CHAOS_GAMEMODES CLOWNOPS +RESPAWN_CHAOS_GAMEMODES REVOLUTION diff --git a/html/changelogs/AutoChangeLog-pr-13834.yml b/html/changelogs/AutoChangeLog-pr-13834.yml new file mode 100644 index 0000000000..46cedff5d5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13834.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "Traitor assistants can now purchase the patented POGBox! Put TC into it for even higher damage!" diff --git a/html/changelogs/AutoChangeLog-pr-13856.yml b/html/changelogs/AutoChangeLog-pr-13856.yml new file mode 100644 index 0000000000..583fb38cc2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13856.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "gear harness alt-click is now sane" + - code_imp: "rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden and behavior-that-shouldn't-be-overridden in ways that make no sense." diff --git a/html/changelogs/AutoChangeLog-pr-13859.yml b/html/changelogs/AutoChangeLog-pr-13859.yml new file mode 100644 index 0000000000..2d6dc5c25a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13859.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "adds unlockable loadout items, corresponding category in loadouts, etc" diff --git a/html/changelogs/AutoChangeLog-pr-13871.yml b/html/changelogs/AutoChangeLog-pr-13871.yml new file mode 100644 index 0000000000..f667abe816 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13871.yml @@ -0,0 +1,5 @@ +author: "NT Cleaning Crews On Break" +delete-after: True +changes: + - rscadd: "Most kinds of dirt, grime, and debris are now persistent. Get to work, jannies." + - rscadd: "Dirt can now be removed by tile replacements. Other cleanable decals can't, though." diff --git a/html/changelogs/AutoChangeLog-pr-13924.yml b/html/changelogs/AutoChangeLog-pr-13924.yml new file mode 100644 index 0000000000..71092c567d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13924.yml @@ -0,0 +1,4 @@ +author: "SandPoot" +delete-after: True +changes: + - tweak: "You can attack a pile of money on the floor with your id to put it all in quickly." diff --git a/html/changelogs/AutoChangeLog-pr-13930.yml b/html/changelogs/AutoChangeLog-pr-13930.yml new file mode 100644 index 0000000000..282f3fa30a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13930.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Small fixes on security on boxstation" diff --git a/html/changelogs/AutoChangeLog-pr-13931.yml b/html/changelogs/AutoChangeLog-pr-13931.yml new file mode 100644 index 0000000000..fd903f2d6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13931.yml @@ -0,0 +1,4 @@ +author: "shellspeed1" +delete-after: True +changes: + - rscadd: "Adds the disposable sentry gun from tg for 11tc each." diff --git a/html/changelogs/AutoChangeLog-pr-13932.yml b/html/changelogs/AutoChangeLog-pr-13932.yml new file mode 100644 index 0000000000..955d9f5741 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13932.yml @@ -0,0 +1,4 @@ +author: "shellspeed1" +delete-after: True +changes: + - tweak: "Xenomorph powers now list plasma cost in their description." diff --git a/html/changelogs/AutoChangeLog-pr-13934.yml b/html/changelogs/AutoChangeLog-pr-13934.yml new file mode 100644 index 0000000000..74f8ece6fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13934.yml @@ -0,0 +1,4 @@ +author: "shellspeed1" +delete-after: True +changes: + - rscadd: "The bluespace navigation gigabeacon design has been added to shuttle research for those wanting to take their ships around space more." diff --git a/html/changelogs/AutoChangeLog-pr-13936.yml b/html/changelogs/AutoChangeLog-pr-13936.yml new file mode 100644 index 0000000000..9b15d2232a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13936.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - bugfix: "Polychromic hoodies that were obtained from the loadout have functional colorable hoods now." diff --git a/html/changelogs/AutoChangeLog-pr-13938.yml b/html/changelogs/AutoChangeLog-pr-13938.yml new file mode 100644 index 0000000000..34d76a190b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13938.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "anthromorphic synth species" diff --git a/html/changelogs/AutoChangeLog-pr-13940.yml b/html/changelogs/AutoChangeLog-pr-13940.yml new file mode 100644 index 0000000000..60cbcc9a19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13940.yml @@ -0,0 +1,4 @@ +author: "Chiirno" +delete-after: True +changes: + - rscadd: "Added the paramedics EVA suit as a purchase from the cargo console." diff --git a/html/changelogs/AutoChangeLog-pr-13941.yml b/html/changelogs/AutoChangeLog-pr-13941.yml new file mode 100644 index 0000000000..5a72376ebb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13941.yml @@ -0,0 +1,4 @@ +author: "Chiirno" +delete-after: True +changes: + - bugfix: "Portable Chem Mixer now researchable from biotech node." diff --git a/html/changelogs/AutoChangeLog-pr-13943.yml b/html/changelogs/AutoChangeLog-pr-13943.yml new file mode 100644 index 0000000000..405d6b0d93 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13943.yml @@ -0,0 +1,6 @@ +author: "Hatterhat" +delete-after: True +changes: + - spellcheck: "Utility uniforms now comply with the \"nonproper equipment names\" thing." + - bugfix: "The CapDrobe now allows the captain to get his own clothes for free. Probably." + - tweak: "All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently only the suit and tie and its suitskirt subtype have this wound armor, which is dumb." diff --git a/html/changelogs/AutoChangeLog-pr-13945.yml b/html/changelogs/AutoChangeLog-pr-13945.yml new file mode 100644 index 0000000000..91b8bb9498 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13945.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - rscadd: "IPC cells & power cords are now printable after they are researched." diff --git a/html/changelogs/AutoChangeLog-pr-13946.yml b/html/changelogs/AutoChangeLog-pr-13946.yml new file mode 100644 index 0000000000..d7f3e15024 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13946.yml @@ -0,0 +1,4 @@ +author: "Ryll/Shaps" +delete-after: True +changes: + - admin: "Fixed an issue with player logs becoming confused when someone triggers multiple events within one second (like being attacked by two people at the same time) that would cause holes in the logs" diff --git a/html/changelogs/AutoChangeLog-pr-13947.yml b/html/changelogs/AutoChangeLog-pr-13947.yml new file mode 100644 index 0000000000..0388efc701 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13947.yml @@ -0,0 +1,4 @@ +author: "Chiirno" +delete-after: True +changes: + - tweak: "Chem masters can now dispense 20 instances of its outputs instead of 10." diff --git a/html/changelogs/AutoChangeLog-pr-13948.yml b/html/changelogs/AutoChangeLog-pr-13948.yml new file mode 100644 index 0000000000..73c5ba6b1a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13948.yml @@ -0,0 +1,11 @@ +author: "necromanceranne" +delete-after: True +changes: + - rscadd: "Bokken now come in two lengths; full and wakizashi, and two varieties: wood and ironwood. They have different stats for all four." + - rscadd: "Bokken require menu crafting and part construction, as well as more complicated materials." + - tweak: "Bokken (long and short) require wood, cloth and leather to craft with a hatchet and screwdriver." + - tweak: "Ironwood bokken (long and short) require ironcap logs, cloth and leather to craft with a hatchet, screwdriver and welder." + - balance: "Twin sheathes can only fit a pair of blades (longsword + shortsword) or they can fit two shortswords." + - bugfix: "Fixed a twin sheath runtime." + - imageadd: "A lot of bokken related sprites received an overhaul. Added overlay sprites for weapons sheathed in the twin sheathes." + - imageadd: "The extradimensional blade received improved sprites for inhands/back sprites." diff --git a/html/changelogs/AutoChangeLog-pr-13950.yml b/html/changelogs/AutoChangeLog-pr-13950.yml new file mode 100644 index 0000000000..28affe7ebe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13950.yml @@ -0,0 +1,6 @@ +author: "TripleShades" +delete-after: True +changes: + - rscadd: "New Paramedic Office next to Genetics where the old Genetics Reception used to be +change: Surgery, Surgery Observation, and Recovery Hall layout revamped drastically +change: Maints below Surgery lowered by one tile to recover lost tile space from Surgery expansion" diff --git a/html/changelogs/AutoChangeLog-pr-13951.yml b/html/changelogs/AutoChangeLog-pr-13951.yml new file mode 100644 index 0000000000..fe3ac84523 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13951.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - tweak: "You can now have a max-roundstart-dicksize-config inch long johnson before you start suffering blood loss and slowdowns instead of a 20 inch one." diff --git a/html/changelogs/AutoChangeLog-pr-13954.yml b/html/changelogs/AutoChangeLog-pr-13954.yml new file mode 100644 index 0000000000..a8751d66ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13954.yml @@ -0,0 +1,6 @@ +author: "EmeraldSundisk" +delete-after: True +changes: + - rscadd: "Adds a new \"Computer Core\" area designation for CogStation" + - bugfix: "Fixes some missing area strings" + - tweak: "Replaces some firelocks with directional ones as to ensure desks/counters can still be accessed" diff --git a/html/changelogs/AutoChangeLog-pr-13955.yml b/html/changelogs/AutoChangeLog-pr-13955.yml new file mode 100644 index 0000000000..1d43dd6b95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13955.yml @@ -0,0 +1,5 @@ +author: "Chiirno" +delete-after: True +changes: + - tweak: "Nightmare now deals additional damage to most light sources." + - bugfix: "Nightmare now one-shots miners beacons and glowshrooms" diff --git a/html/changelogs/AutoChangeLog-pr-13959.yml b/html/changelogs/AutoChangeLog-pr-13959.yml new file mode 100644 index 0000000000..1303768344 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13959.yml @@ -0,0 +1,6 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "You can now make all the variants of the bokken." + - bugfix: "Removes a duplicate sprite." + - tweak: "Renames all instances of 'ironwood' to 'steelwood'." diff --git a/html/changelogs/AutoChangeLog-pr-13961.yml b/html/changelogs/AutoChangeLog-pr-13961.yml new file mode 100644 index 0000000000..f0a6cc267d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13961.yml @@ -0,0 +1,6 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Removed the wires connecting the AI from the rest of the station on cogstation." + - tweak: "Fixes experimenter on cogstation." + - tweak: "Less pipes in the overall area in toxins on cogstation" diff --git a/html/changelogs/AutoChangeLog-pr-13965.yml b/html/changelogs/AutoChangeLog-pr-13965.yml new file mode 100644 index 0000000000..69f5a90122 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13965.yml @@ -0,0 +1,7 @@ +author: "Xantholne" +delete-after: True +changes: + - rscadd: "You can now tuck disky into bed" + - rscadd: "You can now make beds by applying a bed sheet to them" + - rscadd: "You can now tuck in pai cards into bed" + - rscadd: "Added bed tucking element, can be added to any held object to allow tucking into beds" diff --git a/html/changelogs/AutoChangeLog-pr-13967.yml b/html/changelogs/AutoChangeLog-pr-13967.yml new file mode 100644 index 0000000000..d2e580b531 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13967.yml @@ -0,0 +1,6 @@ +author: "keronshb" +delete-after: True +changes: + - balance: "Blob Resource Tower to 2 points per instead of 1 point per." + - balance: "Blob Factory Towers can be placed 5 tiles apart instead of 7." + - bugfix: "Fixes Blobbernaut Factories consuming Factories if no naut is chosen." diff --git a/html/changelogs/AutoChangeLog-pr-13968.yml b/html/changelogs/AutoChangeLog-pr-13968.yml new file mode 100644 index 0000000000..e3ce9e4615 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13968.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - tweak: "Prayers to admins now do a wee ding sound for all prayers, instead of just chaplains" diff --git a/html/changelogs/AutoChangeLog-pr-13970.yml b/html/changelogs/AutoChangeLog-pr-13970.yml new file mode 100644 index 0000000000..54d8d9992d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13970.yml @@ -0,0 +1,8 @@ +author: "TripleShades" +delete-after: True +changes: + - rscadd: "Firelock to Surgery Bay drapes +change: Swapped Nanomed and Fire Alarm button locations in both Surgery Bays +change: Removes the double mirror in both Surgery Bays to be a singular mirror +change: Moved an intercom to not be doorstuck below Paramedical Office +remove: One Surgery Observation Fire Alarm button" diff --git a/html/changelogs/AutoChangeLog-pr-13972.yml b/html/changelogs/AutoChangeLog-pr-13972.yml new file mode 100644 index 0000000000..fdfdd4786d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13972.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Fixes maint area in boxstation" diff --git a/html/changelogs/AutoChangeLog-pr-13975.yml b/html/changelogs/AutoChangeLog-pr-13975.yml new file mode 100644 index 0000000000..ff643cd19c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13975.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - imageadd: "fuck the r*d cr*ss" diff --git a/html/changelogs/AutoChangeLog-pr-13976.yml b/html/changelogs/AutoChangeLog-pr-13976.yml new file mode 100644 index 0000000000..dac85f8e9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13976.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "you can teleport bread" diff --git a/html/changelogs/AutoChangeLog-pr-13978.yml b/html/changelogs/AutoChangeLog-pr-13978.yml new file mode 100644 index 0000000000..94c19edec4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13978.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - balance: "c4 can no longer gib mobs" diff --git a/html/changelogs/AutoChangeLog-pr-13980.yml b/html/changelogs/AutoChangeLog-pr-13980.yml new file mode 100644 index 0000000000..6838ba48a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13980.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - rscadd: "Makes gas sensors fireproof." diff --git a/html/changelogs/AutoChangeLog-pr-13983.yml b/html/changelogs/AutoChangeLog-pr-13983.yml new file mode 100644 index 0000000000..ba0bf62e6a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13983.yml @@ -0,0 +1,6 @@ +author: "shellspeed1" +delete-after: True +changes: + - rscadd: "Xenomorph hybrids can now select wings +~~add: Xenomorph hybrids can now speak xenomorph~~" + - rscadd: "Xenomorph tongues are available for customization." diff --git a/html/changelogs/AutoChangeLog-pr-13988.yml b/html/changelogs/AutoChangeLog-pr-13988.yml new file mode 100644 index 0000000000..262e5f804f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13988.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Cargo packs marked as 'no private buying' now actually register as such." diff --git a/html/changelogs/AutoChangeLog-pr-13993.yml b/html/changelogs/AutoChangeLog-pr-13993.yml new file mode 100644 index 0000000000..d99ed0e0d1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13993.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - tweak: "The cursed heart now only takes away half as much blood every loop, and can be used as long as you are alive, instead if only you are awake/able to use your hands" diff --git a/html/changelogs/AutoChangeLog-pr-13995.yml b/html/changelogs/AutoChangeLog-pr-13995.yml new file mode 100644 index 0000000000..e58ee3103c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13995.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Attacking some certain objects no longer has no clickdelay." diff --git a/html/changelogs/AutoChangeLog-pr-13996.yml b/html/changelogs/AutoChangeLog-pr-13996.yml new file mode 100644 index 0000000000..5bea075460 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13996.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Bugfix of a morph becoming an AI eye" diff --git a/html/changelogs/AutoChangeLog-pr-13997.yml b/html/changelogs/AutoChangeLog-pr-13997.yml new file mode 100644 index 0000000000..354f66010a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13997.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Porting garbage collection tweak from /tg/" diff --git a/html/changelogs/AutoChangeLog-pr-14001.yml b/html/changelogs/AutoChangeLog-pr-14001.yml new file mode 100644 index 0000000000..31c9e560ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14001.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Fixes two chairs on one table" diff --git a/html/changelogs/AutoChangeLog-pr-14005.yml b/html/changelogs/AutoChangeLog-pr-14005.yml new file mode 100644 index 0000000000..253f4e137a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14005.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Loot items mobs drop are no longer always failing to initialize." diff --git a/html/changelogs/AutoChangeLog-pr-14006.yml b/html/changelogs/AutoChangeLog-pr-14006.yml new file mode 100644 index 0000000000..519ad32752 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14006.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs." diff --git a/html/changelogs/AutoChangeLog-pr-14007.yml b/html/changelogs/AutoChangeLog-pr-14007.yml new file mode 100644 index 0000000000..498aa6b807 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14007.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Antagging / Deantagging Heretics now properly sets their special role." diff --git a/html/changelogs/AutoChangeLog-pr-14008.yml b/html/changelogs/AutoChangeLog-pr-14008.yml new file mode 100644 index 0000000000..836eefd99a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14008.yml @@ -0,0 +1,4 @@ +author: "TheSpaghetti" +delete-after: True +changes: + - bugfix: "no more tumor bread double punctuation" diff --git a/html/changelogs/AutoChangeLog-pr-14009.yml b/html/changelogs/AutoChangeLog-pr-14009.yml new file mode 100644 index 0000000000..03a1ca39dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14009.yml @@ -0,0 +1,7 @@ +author: "shellspeed1" +delete-after: True +changes: + - rscadd: "Wings from Cit RP have been ported over" + - rscadd: "Moth wings from cit have been ported over" + - bugfix: "Cleaned up some pixels on existing moth wings." + - tweak: "Organized the lists for wings by if they are for moths or not and than by alphabetical." diff --git a/html/changelogs/AutoChangeLog-pr-14010.yml b/html/changelogs/AutoChangeLog-pr-14010.yml new file mode 100644 index 0000000000..643f28dc99 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14010.yml @@ -0,0 +1,5 @@ +author: "shellspeed1" +delete-after: True +changes: + - rscadd: "The exofab can now print prosthetic limbs" + - bugfix: "The exofab was missing access to multiple cybernetic organs. This has now been rectified." diff --git a/html/changelogs/AutoChangeLog-pr-14014.yml b/html/changelogs/AutoChangeLog-pr-14014.yml new file mode 100644 index 0000000000..ac29b1567b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14014.yml @@ -0,0 +1,4 @@ +author: "necromanceranne" +delete-after: True +changes: + - bugfix: "Fixes various sprites for bokken, as well as being unable to craft certain parts and duplicate entries." diff --git a/html/changelogs/AutoChangeLog-pr-14015.yml b/html/changelogs/AutoChangeLog-pr-14015.yml new file mode 100644 index 0000000000..fe507d0a1e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14015.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - balance: "Some synth damage stuff has been a bit rebalanced, see the PR for details." diff --git a/html/changelogs/AutoChangeLog-pr-14016.yml b/html/changelogs/AutoChangeLog-pr-14016.yml new file mode 100644 index 0000000000..1aab587190 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14016.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - bugfix: "disabling adminhelp noises no longer disables looc" diff --git a/html/changelogs/AutoChangeLog-pr-14019.yml b/html/changelogs/AutoChangeLog-pr-14019.yml new file mode 100644 index 0000000000..37bdd52948 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14019.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - bugfix: "species with NOTRANSSTING cannot have envy's knife used on them" diff --git a/html/changelogs/AutoChangeLog-pr-14021.yml b/html/changelogs/AutoChangeLog-pr-14021.yml new file mode 100644 index 0000000000..aab94ae724 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14021.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Combat mode now will not stay permanently disabled due to status effects not working as intended." diff --git a/html/changelogs/AutoChangeLog-pr-14025.yml b/html/changelogs/AutoChangeLog-pr-14025.yml new file mode 100644 index 0000000000..6db185baa3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14025.yml @@ -0,0 +1,7 @@ +author: "DeltaFire15" +delete-after: True +changes: + - rscadd: "A new surgery, allowing revival of synths without a defib at hand." + - balance: "Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15." + - tweak: "The embed removal surgery now has a version for Synths." + - balance: "EMPs no longer hardstun Synths." diff --git a/html/changelogs/AutoChangeLog-pr-14026.yml b/html/changelogs/AutoChangeLog-pr-14026.yml new file mode 100644 index 0000000000..1ae9cb5c28 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14026.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - bugfix: "Fixes noodle size appearance for 12+ inch members." diff --git a/html/changelogs/AutoChangeLog-pr-14032.yml b/html/changelogs/AutoChangeLog-pr-14032.yml new file mode 100644 index 0000000000..67f0a80f83 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14032.yml @@ -0,0 +1,8 @@ +author: "kappa-sama" +delete-after: True +changes: + - rscadd: "A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active." + - rscadd: "A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second." + - balance: "bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns" + - soundadd: "a powerup and powerdown sound effect" + - imageadd: "two icons for two buff spells" diff --git a/html/changelogs/AutoChangeLog-pr-14033.yml b/html/changelogs/AutoChangeLog-pr-14033.yml new file mode 100644 index 0000000000..db6a6b0691 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14033.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - rscadd: "Color Mates have been added to all stations (except Snaxi). Enjoy coloring your attire without having to bug science!" diff --git a/html/changelogs/AutoChangeLog-pr-14034.yml b/html/changelogs/AutoChangeLog-pr-14034.yml new file mode 100644 index 0000000000..ecd0d4ca10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14034.yml @@ -0,0 +1,4 @@ +author: "DeltaFire15" +delete-after: True +changes: + - bugfix: "Some edge cases causing issues with system corruption shouldn't be able to occur anymore." diff --git a/html/changelogs/AutoChangeLog-pr-14035.yml b/html/changelogs/AutoChangeLog-pr-14035.yml new file mode 100644 index 0000000000..b8690368a3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14035.yml @@ -0,0 +1,4 @@ +author: "SiliconMain" +delete-after: True +changes: + - tweak: "hololocks (which haven't worked for god knows how long) commented out until auxmos is merged" diff --git a/html/changelogs/AutoChangeLog-pr-14036.yml b/html/changelogs/AutoChangeLog-pr-14036.yml new file mode 100644 index 0000000000..a2bb654233 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14036.yml @@ -0,0 +1,4 @@ +author: "BlueWildrose" +delete-after: True +changes: + - tweak: "You will now only unbuckle fireman-carried/piggybacked people on disarm or harm intent." diff --git a/html/changelogs/AutoChangeLog-pr-14038.yml b/html/changelogs/AutoChangeLog-pr-14038.yml new file mode 100644 index 0000000000..906f6f7053 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14038.yml @@ -0,0 +1,9 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscadd: "The nature interaction shuttle with the monkeys now has tiny fans on the airlocks in, because that's apparently a feature that was missing." + - rscadd: "More bags have been added to department vendors." + - balance: "Every roundstart species (and also ash walkers) now has flesh and bone that can be wounded." + - balance: "Recipes for sutures, regen mesh, and sterilized gauze have been adjusted to be easier, mostly." + - balance: "Sterilized gauze is better at absorbing blood and being a splint." + - bugfix: "Energy sabres now have an off inhand." diff --git a/html/changelogs/AutoChangeLog-pr-14039.yml b/html/changelogs/AutoChangeLog-pr-14039.yml new file mode 100644 index 0000000000..a799003a02 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14039.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscadd: "Basic sticky technology is now a roundstart tech. Advanced sticky technology is BEPIS-locked, though. Theoretically." diff --git a/html/changelogs/AutoChangeLog-pr-14040.yml b/html/changelogs/AutoChangeLog-pr-14040.yml new file mode 100644 index 0000000000..6202f0b3e1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14040.yml @@ -0,0 +1,4 @@ +author: "LetterN" +delete-after: True +changes: + - bugfix: "fixed telecomms pda log" diff --git a/html/changelogs/AutoChangeLog-pr-14042.yml b/html/changelogs/AutoChangeLog-pr-14042.yml new file mode 100644 index 0000000000..a924ff582f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14042.yml @@ -0,0 +1,4 @@ +author: "kiwedespars" +delete-after: True +changes: + - rscadd: "the robust dildo weapon now has sound." diff --git a/html/changelogs/AutoChangeLog-pr-14044.yml b/html/changelogs/AutoChangeLog-pr-14044.yml new file mode 100644 index 0000000000..e19b6266a7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14044.yml @@ -0,0 +1,4 @@ +author: "corin9090" +delete-after: True +changes: + - tweak: "The chaplain's prayer beads can now be worn on your belt slot" diff --git a/html/changelogs/AutoChangeLog-pr-14048.yml b/html/changelogs/AutoChangeLog-pr-14048.yml new file mode 100644 index 0000000000..b7b1448b37 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14048.yml @@ -0,0 +1,4 @@ +author: "MrJWhit" +delete-after: True +changes: + - tweak: "Updates suit storage info on Tip Of the Round." diff --git a/html/changelogs/AutoChangeLog-pr-14054.yml b/html/changelogs/AutoChangeLog-pr-14054.yml new file mode 100644 index 0000000000..406e6b2713 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14054.yml @@ -0,0 +1,5 @@ +author: "TheObserver" +delete-after: True +changes: + - rscadd: "Re-adds the rifle stock, and sets the improv shotgun to be as it was." + - rscdel: "The maintenance rifle has been shelved - for now. Watch this space." diff --git a/html/changelogs/AutoChangeLog-pr-14060.yml b/html/changelogs/AutoChangeLog-pr-14060.yml new file mode 100644 index 0000000000..f9750fc9be --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14060.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - rscdel: "Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again." diff --git a/html/changelogs/AutoChangeLog-pr-14062.yml b/html/changelogs/AutoChangeLog-pr-14062.yml new file mode 100644 index 0000000000..84e40850ec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14062.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - bugfix: "super saiyan" diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 8db32b304b..68e6170969 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 8594af8ec2..2afd1b510b 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 f84e360179..adcd7b64e1 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 62d6644311..4b0c56c4d2 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/head_muzzled.dmi b/icons/mob/clothing/head_muzzled.dmi index 0c72221833..e99f1ff6d4 100644 Binary files a/icons/mob/clothing/head_muzzled.dmi and b/icons/mob/clothing/head_muzzled.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 276b5c9458..084a2c3649 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index d4bb1224cc..a3d75644da 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/suit_digi.dmi b/icons/mob/clothing/suit_digi.dmi index 9f6e3ffb84..b109c2095e 100644 Binary files a/icons/mob/clothing/suit_digi.dmi and b/icons/mob/clothing/suit_digi.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 5ff248de68..e4f22de1cd 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 0332e60fb5..8716c3627f 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 4523403344..92de5c150c 100644 Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ diff --git a/icons/obj/bedsheets.dmi b/icons/obj/bedsheets.dmi index 05535334cf..f62dd34c66 100644 Binary files a/icons/obj/bedsheets.dmi and b/icons/obj/bedsheets.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 3653635c56..70f5001c26 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index cdb2567268..1178588ee7 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 95a31f8b9f..ee6cf90597 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index c12720bc8b..f9eabaa44c 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/food/burgerbread.dmi b/icons/obj/food/burgerbread.dmi index 7ef3a7d418..c5bf88ab6e 100644 Binary files a/icons/obj/food/burgerbread.dmi and b/icons/obj/food/burgerbread.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 9b73fa706b..119e612c40 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 6e14c4c6ca..7e3b8058b8 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/magic.dmi b/icons/obj/magic.dmi index c376dc7321..6555373ae1 100644 Binary files a/icons/obj/magic.dmi and b/icons/obj/magic.dmi differ diff --git a/icons/obj/smith.dmi b/icons/obj/smith.dmi index a40b9a2b19..cbd6b9e85e 100644 Binary files a/icons/obj/smith.dmi and b/icons/obj/smith.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 1f1709a10c..b0e542f618 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 0e971d4ced..8f48e90068 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -32,82 +32,6 @@ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/status_effect/chem/breast_enlarger - id = "breast_enlarger" - alert_type = null - var/moveCalc = 1 - var/cachedmoveCalc = 1 - var/last_checked_size //used to prevent potential cpu waste from happening every tick. - -/datum/status_effect/chem/breast_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_reagent("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]") - return ..() - -/datum/status_effect/chem/breast_enlarger/tick()//If you try to wear clothes, you fail. Slows you down if you're comically huge - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS) - if(!B) - H.remove_status_effect(src) - return - moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click. - - if(last_checked_size != B.cached_size) - H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy, multiplicative_slowdown = moveCalc) - - if (B.size == "huge") - if(prob(1)) - to_chat(owner, "Your back is feeling sore.") - var/target = H.get_bodypart(BODY_ZONE_CHEST) - H.apply_damage(0.1, BRUTE, target) - else - if(prob(1)) - to_chat(H, "Your back is feeling a little sore.") - last_checked_size = B.cached_size - ..() - -/datum/status_effect/chem/breast_enlarger/on_remove() - log_reagent("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]") - to_chat(owner, "Your expansive chest has become a more managable size, liberating your movements.") - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/breast_hypertrophy) - return ..() - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/datum/status_effect/chem/penis_enlarger - id = "penis_enlarger" - alert_type = null - var/bloodCalc - var/moveCalc - var/last_checked_size //used to prevent potential cpu waste, just like the above. - -/datum/status_effect/chem/penis_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now. - log_reagent("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]") - return ..() - - -/datum/status_effect/chem/penis_enlarger/tick() - var/mob/living/carbon/human/H = owner - var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - if(!P) - owner.remove_status_effect(src) - return - moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move - bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.) - if(P.length < 22 && H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) - to_chat(owner, "Your rascally willy has become a more managable size, liberating your movements.") - H.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) - else if(P.length >= 22 && !H.has_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy)) - to_chat(H, "Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!") - H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy, multiplicative_slowdown = moveCalc) - H.AdjustBloodVol(bloodCalc) - ..() - -/datum/status_effect/chem/penis_enlarger/on_remove() - log_reagent("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]") - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/penis_hypertrophy) - owner.ResetBloodVol() - return ..() - /////////////////////////////////////////////// // Astral INSURANCE /////////////////////////////////////////////// diff --git a/modular_citadel/code/modules/client/loadout/unlockable.dm b/modular_citadel/code/modules/client/loadout/unlockable.dm new file mode 100644 index 0000000000..6e522812b8 --- /dev/null +++ b/modular_citadel/code/modules/client/loadout/unlockable.dm @@ -0,0 +1,30 @@ +/datum/gear/unlockable + category = LOADOUT_CATEGORY_UNLOCKABLE + slot = SLOT_NECK + + var/progress_required //what does our progress need to be to unlock it + var/progress_key //what is the key used to retrieve existing progress for this unlockable + +/datum/gear/unlockable/janitor + name = "Janitor Bedsheet" + description = "Clean 100 messes with a mop to unlock this. It has a warning sign on!" + path = /obj/item/bedsheet/unlockable/janitor + + progress_required = 100 + progress_key = "janitor" + +/datum/gear/unlockable/cook + name = "Cook Bedsheet" + description = "Cook 250 items using the microwave to unlock this. It has a microwave on!" + path = /obj/item/bedsheet/unlockable/cook + + progress_required = 250 + progress_key = "cook" + +/datum/gear/unlockable/miner + name = "Miner Bedsheet" + description = "Redeem a total of 100,000 miner points to unlock this. It's made out of goliath hide!" + path = /obj/item/bedsheet/unlockable/miner + + progress_required = 100000 + progress_key = "miner" \ No newline at end of file diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 7403de6215..ac3ef96505 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -232,7 +232,8 @@ P.Insert(H) P.modify_size(0.1) - if (ISINRANGE_EX(P.length, 20.5, 21) && (H.w_uniform || H.wear_suit)) + var/max_D = CONFIG_GET(number/penis_max_inches_prefs) + if (ISINRANGE_EX(P.length, max_D + 0.5, max_D + 1) && (H.w_uniform || H.wear_suit)) var/target = H.get_bodypart(BODY_ZONE_CHEST) if(!message_spam) to_chat(H, "Your cock begin to strain against your clothes tightly!") diff --git a/sound/effects/ding.ogg b/sound/effects/ding.ogg new file mode 100644 index 0000000000..33516f793f Binary files /dev/null and b/sound/effects/ding.ogg differ diff --git a/sound/magic/powerdown.ogg b/sound/magic/powerdown.ogg new file mode 100644 index 0000000000..9d514c64ca Binary files /dev/null and b/sound/magic/powerdown.ogg differ diff --git a/sound/magic/powerup.ogg b/sound/magic/powerup.ogg new file mode 100644 index 0000000000..909c2a33c7 Binary files /dev/null and b/sound/magic/powerup.ogg differ diff --git a/strings/tips.txt b/strings/tips.txt index 5336f767a5..68d1cbe57a 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -295,7 +295,7 @@ In a pinch, stripping yourself naked will give you a sizeable resistance to bein 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. +Suit storage units, when hacked, 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/tgstation.dme b/tgstation.dme index 2b00eb6b98..532e57148a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -292,6 +292,7 @@ #include "code\controllers\configuration\entries\fail2topic.dm" #include "code\controllers\configuration\entries\game_options.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\persistence.dm" #include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\configuration\entries\policy.dm" #include "code\controllers\configuration\entries\resources.dm" @@ -340,7 +341,6 @@ #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" #include "code\controllers\subsystem\pathfinder.dm" -#include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\profiler.dm" #include "code\controllers\subsystem\radiation.dm" #include "code\controllers\subsystem\radio.dm" @@ -363,6 +363,13 @@ #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vore.dm" #include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\persistence\_persistence.dm" +#include "code\controllers\subsystem\persistence\cleanable_debris.dm" +#include "code\controllers\subsystem\persistence\panic_bunker.dm" +#include "code\controllers\subsystem\persistence\poly_parrot.dm" +#include "code\controllers\subsystem\persistence\recent_votes_etc.dm" +#include "code\controllers\subsystem\persistence\secret_satchels.dm" +#include "code\controllers\subsystem\persistence\trophies.dm" #include "code\controllers\subsystem\processing\chemistry.dm" #include "code\controllers\subsystem\processing\circuit.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" @@ -586,6 +593,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\beauty.dm" +#include "code\datums\elements\bed_tucking.dm" #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\decal.dm" @@ -2716,6 +2724,7 @@ #include "code\modules\mob\living\simple_animal\hostile\banana_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\bear.dm" #include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\bread.dm" #include "code\modules\mob\living\simple_animal\hostile\carp.dm" #include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" @@ -3343,6 +3352,7 @@ #include "code\modules\shuttle\shuttle.dm" #include "code\modules\shuttle\shuttle_rotate.dm" #include "code\modules\shuttle\snaxi.dm" +#include "code\modules\shuttle\spaceship_navigation_beacon.dm" #include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" @@ -3392,6 +3402,7 @@ #include "code\modules\spells\spell_types\taeclowndo.dm" #include "code\modules\spells\spell_types\telepathy.dm" #include "code\modules\spells\spell_types\the_traps.dm" +#include "code\modules\spells\spell_types\togglebuff.dm" #include "code\modules\spells\spell_types\touch_attacks.dm" #include "code\modules\spells\spell_types\trigger.dm" #include "code\modules\spells\spell_types\turf_teleport.dm" @@ -3415,6 +3426,7 @@ #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\embalming.dm" #include "code\modules\surgery\emergency_cardioversion_recovery.dm" +#include "code\modules\surgery\emergency_reboot.dm" #include "code\modules\surgery\experimental_dissection.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\graft_synthtissue.dm" @@ -3609,6 +3621,7 @@ #include "modular_citadel\code\modules\client\loadout\shoes.dm" #include "modular_citadel\code\modules\client\loadout\suit.dm" #include "modular_citadel\code\modules\client\loadout\uniform.dm" +#include "modular_citadel\code\modules\client\loadout\unlockable.dm" #include "modular_citadel\code\modules\client\verbs\who.dm" #include "modular_citadel\code\modules\clothing\neck.dm" #include "modular_citadel\code\modules\clothing\trek.dm" diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index f1ab17a264..f72ac63d1f 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -3,7 +3,7 @@ "name": "tgui-dev-server", "version": "4.2.0", "dependencies": { - "axios": "^0.19.2", + "axios": "^0.21.1", "common": "workspace:*", "esm": "^3.2.25", "glob": "^7.1.4", diff --git a/tgui/packages/tgui/interfaces/ChemMaster.js b/tgui/packages/tgui/interfaces/ChemMaster.js index 9d16dc82e6..ddca187244 100644 --- a/tgui/packages/tgui/interfaces/ChemMaster.js +++ b/tgui/packages/tgui/interfaces/ChemMaster.js @@ -205,7 +205,7 @@ const PackagingControlsItem = props => { stepPixelSize={15} value={amount} minValue={1} - maxValue={10} + maxValue={20} onChange={onChangeAmount} />