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 7693ea16a2..cb257efeba 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -11030,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 @@ -11440,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, @@ -14255,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, @@ -45279,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" = ( @@ -53350,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 @@ -53734,7 +53720,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 @@ -54930,7 +54916,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" @@ -56208,7 +56194,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{ @@ -56998,7 +56984,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, @@ -57590,7 +57576,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" @@ -59057,7 +59043,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 @@ -59648,12 +59634,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{ @@ -59773,7 +59753,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, @@ -60210,7 +60190,7 @@ dir = 8 }, /turf/open/floor/wood/wood_diagonal, -/area/maintenance/fore) +/area/maintenance/port/fore) "trb" = ( /obj/machinery/light{ dir = 4 @@ -60628,7 +60608,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" @@ -82433,7 +82413,7 @@ lZN amC jIW ddI -arP +alU fgG rqW aGD @@ -82684,13 +82664,13 @@ amC htu alU edj -rWw +ygb gKG -arP -aqR -awb +alU +amC +ntt ugq -arP +alU rPU fne aGr @@ -82943,11 +82923,11 @@ alU tqG spR qGw -arP -aGh -awb -axo -arP +alU +aFJ +ntt +aAY +alU aCh pIf kCo @@ -83197,14 +83177,14 @@ ali ali ali alU -arP +alU lzk -arP -arP -arP -avZ +alU +alU +alU +atO axp -ayC +aue azH eEe aGv diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm index a62dfcf0a2..482ddc3f22 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"; @@ -33778,7 +33797,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 +34901,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 +35595,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 +35624,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 +35670,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 +35806,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 +35944,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 +36046,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 +36056,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 +36135,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 +36165,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 +36573,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 +36651,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 +37026,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 +37383,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 +38199,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 +38795,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 +38921,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 @@ -38946,7 +38970,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 +39546,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 +40086,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 +40148,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 +40254,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 +40349,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 +40593,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 +40999,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 +42616,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 +42665,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 +42846,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 +43321,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 +43338,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 +43401,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 +43771,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 +44267,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 +44394,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 +44446,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 +44480,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 +44487,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 +44694,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 +45214,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 +45311,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 +46083,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 +46293,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 +46432,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 +46533,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 +48764,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 +49117,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 +49611,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 +51446,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 +51529,6 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable, /obj/structure/cable{ icon_state = "0-2" }, @@ -51950,9 +51921,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 +52028,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) @@ -54609,26 +54569,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 +55002,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 +55048,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 +55072,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 +56688,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 +56696,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 +57948,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 +58167,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 +59528,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 +60669,7 @@ pixel_y = 24 }, /obj/machinery/power/apc{ + areastring = "/area/crew_quarters/toilet/restrooms"; dir = 4; name = "Restrooms APC"; pixel_x = 24 @@ -61860,7 +61826,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 +62925,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 +67068,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 +67674,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 +68094,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 +68241,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 +68374,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 +68418,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 +68648,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 +68684,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 +70770,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 +70796,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 +70815,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 +70845,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 +71009,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 +71041,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 +71084,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 +71095,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 +71244,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) @@ -71230,6 +71273,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 +71325,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 +71352,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 +90864,10 @@ bOv bfo blI bfo -bWS -bcw -bcw -bcw +bXg +ebG +ebG +iCa bcy cbu csR @@ -91321,9 +91376,9 @@ boJ fuR bzX bAl -boL +bdf bAG -cnT +bdf boQ cKJ bAP @@ -91576,11 +91631,11 @@ bcy bcy bcy bcy -bcy +bWS bgC bdf boR -bDL +bdf boQ cKJ bAP @@ -91833,11 +91888,11 @@ bQe aaU aaU aaU -bcw +boL bdf bdf bpM -bFp +bvj bvj cKK bAU @@ -92090,7 +92145,7 @@ aye aaU aaU aaU -bcw +bDL cnL bdf bpR @@ -92116,7 +92171,7 @@ cHj cqS cav cav -ccL +ctb caX caX caX @@ -92349,8 +92404,8 @@ abp abp bcy biK -bdf -bpR +bFp +cnT bJT bLl cKM @@ -92370,13 +92425,13 @@ aVF caw caA cHk -caP +ccL caT caX -caX +eJy caX cbh -caX +sSg caX cbx cav @@ -94872,11 +94927,11 @@ aUV aYB bbg bcH -bnZ +aYW bqi bIl bcJ -bOY +bod bdr beJ beJ @@ -95129,11 +95184,11 @@ bcN aYJ aNL aVJ -aYW +aYX baF bIr bcx -cvZ +bOY bdr beJ beT @@ -95386,11 +95441,11 @@ bcQ aUC aNL aVJ -aYX +bnZ baD bIV bKg -cwa +bVY bdr beJ bfd @@ -105699,7 +105754,7 @@ cgD cdV chy chN -bWQ +uYy bWQ cdo aPg @@ -107000,7 +107055,7 @@ cvb cvd cvd cNa -cNp +ctE ber cIQ cgB @@ -107257,7 +107312,7 @@ cuV cyv cuV cNb -cNq +cvZ beW cIM cgB @@ -108022,7 +108077,7 @@ cqs cqG crt cdm -ctl +cmT cuL cvd cAp @@ -108279,7 +108334,7 @@ bxz bwP cBn cBH -ctE +ctl cuM cvg cBa @@ -111626,7 +111681,7 @@ ciL cLr cwQ bPx -bod +cwa beW bXX cIM @@ -111883,7 +111938,7 @@ con coo cwR bPy -bVY +cNm bWn bYO cJc @@ -117286,7 +117341,7 @@ bdM cNA bhb ciE -cmT +cNp cnB csh cHV @@ -118800,7 +118855,7 @@ bNE cww cpO bYP -cRg +cMI cMH cww cMb @@ -119577,7 +119632,7 @@ chn eCy chL cMv -cMI +cMJ anr aaa aaa @@ -119834,7 +119889,7 @@ chp chx chM gDY -jiZ +mqE anr aaa aaa @@ -120088,7 +120143,7 @@ uVD mqB dpO tZC -qWY +cwB rUl cMw cfs @@ -120602,8 +120657,8 @@ sRD nAF cgz cJH -cwB -cMl +qWY +cJH cMx cMJ cxc @@ -121366,7 +121421,7 @@ bSb cKS cKY bQO -cLc +cMO eIh bYd tXV @@ -121376,7 +121431,7 @@ cwB cMc cMm cMy -cML +dSZ cLa cKY cLu @@ -122394,7 +122449,7 @@ bTH cKU cKY cLa -cLc +cMO fgS car cwB @@ -122404,7 +122459,7 @@ cwB cMg cMq cMB -cML +dSZ cMQ cKY cLw @@ -123175,8 +123230,8 @@ cLs cLs cMs cME -cMN -aaU +mDW +dnN bZR caJ bpq @@ -123422,7 +123477,7 @@ bTK cKW cKY bQV -cLc +cMO cLk ctk prx @@ -123433,7 +123488,7 @@ prx iQY cMF cMO -cMS +jAv cMT cLy blM diff --git a/_maps/map_files/LambdaStation/dorms.dmm b/_maps/map_files/LambdaStation/dorms.dmm index a38d2b9e1d..b7adb4a518 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{ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 3c160180da..c2953916e0 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -12681,7 +12681,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 }, @@ -39921,9 +39921,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 +52007,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 +53086,6 @@ }, /area/maintenance/port/aft) "cbG" = ( -/obj/item/storage/box/lights/mixed, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -53178,8 +53178,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 +55171,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 +55713,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 +56418,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 +57084,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 +57153,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 +57168,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 +57180,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 +57781,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 +57880,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 +57961,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 +58431,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 +58899,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 +59585,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 +60394,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 +61114,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 +61588,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 +61635,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 +62233,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 +62288,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 +62380,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 +62650,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 +62867,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 +62914,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 +62929,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 +62972,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 +63274,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 +63456,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 +63770,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 +63789,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 +63983,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 +63999,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 +64015,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 +64240,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 +64307,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 +64425,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 +64447,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 +64510,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 +64525,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 +64658,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 +64852,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 +64860,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 +65253,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 +65260,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 +65332,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 +65340,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 +65895,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 +67825,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 +67844,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 +67869,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 +68302,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 +68322,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 +68811,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 +68822,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 +72299,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 +72873,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 +75875,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 +79623,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 +80227,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 +81348,12 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/engine/engineering) +"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 +81452,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 +81540,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 +81792,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) @@ -81982,8 +82017,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 +82106,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 +82163,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 +82322,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 +82582,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 +82700,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 +82733,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 +82849,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 +82874,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 +83059,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 +83186,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 @@ -100807,7 +100927,7 @@ cwi dux dux dux -aaa +dux aaa cBR cCK @@ -101062,10 +101182,10 @@ cuf cvk cwh bXE +bXE dvq dux aaa -aaa cBR cBR cDE @@ -101318,10 +101438,10 @@ chZ chZ cvl cbx +cfD ceu dux -dux -aaf +mqC aaa aaa cBR @@ -101568,7 +101688,7 @@ cia cia cia cia -cpT +cDP cia cia cia @@ -101576,11 +101696,11 @@ ceu dyg dvt bXE +bXE dvE dux aaf aaf -aaf dBN cDG cEJ @@ -101823,21 +101943,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 +102196,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 +102453,11 @@ bXE bYJ dux dwe +cia +cjB +cpT cic -cjy -ckW -cmk -cno +cnr coA cUH crl @@ -102346,12 +102466,12 @@ cia ceu ceu dyg +ceu dux dux dux aaa aaa -aaa cBR cDJ cEM @@ -102590,25 +102710,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 +102967,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 +103224,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 +103481,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 +103738,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 +103995,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 +104252,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 +104521,7 @@ csr duH bXE cvn -cwn +dvE cxd cxU cyN @@ -104655,9 +104775,9 @@ coI cqd crs css -dux -dux -dux +cvp +cvp +cvp cxU cxU cxU @@ -108773,7 +108893,7 @@ cvA cwB cxt cyg -cyZ +reM cAd ctA dbr @@ -109285,10 +109405,10 @@ ctA ctA ctA ctA -cxv -cyi ctA ctA +cym +ctA ctA cCi cCW @@ -109538,12 +109658,12 @@ coV cqt cga cKJ -ctB +cyl cuw cvC cwD cxw -cyj +cyl czb cAf cBc @@ -110052,18 +110172,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 +110430,11 @@ coY cga csI ctD -cuz cvF -ctB -ctB -cym +sBC +cyl +cyi +cyl cze ctB cBd @@ -110825,18 +110945,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 +111202,7 @@ crH csL ctG cgc -cvG +qee chh cxB cyo @@ -111093,7 +111213,7 @@ cCm cpa cEh cFc -chh +umv chh cvG cIG diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 0356dd1d07..d367ed82b1 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -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" = ( 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/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/__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/_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/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/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index 753adf7ff4..6786f0c0f7 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,7 +294,7 @@ 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 @@ -434,3 +480,51 @@ time = 20 category = CAT_WEAPONRY subcategory = CAT_PARTS + +// BOKKEN CRAFTING + +/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 + +/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/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 += " 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/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/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/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 8526727464..9f126f492b 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -253,7 +253,6 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ 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 +793,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/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/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/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/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_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/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..bc4727ab9f 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -620,6 +620,8 @@ This is here to make the tiles around the station mininuke change when it's arme /obj/item/disk/nuclear/Initialize() . = ..() + AddElement(/datum/element/bed_tuckable, 6, -6, 0) + if(!fake) GLOB.poi_list |= src last_disk_move = world.time @@ -634,7 +636,19 @@ This is here to make the tiles around the station mininuke change when it's arme 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. + 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/arousal/organs/penis.dm b/code/modules/arousal/organs/penis.dm index 5a451359f3..a8e95673ae 100644 --- a/code/modules/arousal/organs/penis.dm +++ b/code/modules/arousal/organs/penis.dm @@ -40,17 +40,18 @@ var/rounded_length = round(length) var/new_size var/enlargement = FALSE + var/max_D = CONFIG_GET(number/penis_max_inches_prefs) 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 max_D) //If massive new_size = 3 - if(21 to 34) //If massive and due for large effects + if(max_D + 1 to max_D+13) //If massive and due for large effects, modified in case some server owner running recent citcode decides to be insane with dick sizes in the config new_size = 3 enlargement = TRUE - if(35 to INFINITY) //If comical + if(max_D+14 to INFINITY) //If comical new_size = 4 //no new sprites for anything larger yet enlargement = TRUE if(owner) 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/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/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/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/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index fb71bb483d..37ef2a7d19 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -138,6 +138,18 @@ name = "White Fly" icon_state = "whitefly" +/datum/sprite_accessory/deco_wings/oakworm + name = "Oak Worm" + icon_state = "oakworm" + +/datum/sprite_accessory/deco_wings/witchwing + name = "Witch Wing" + icon_state = "witchwing" + +/datum/sprite_accessory/deco_wings/jungle + name = "Jungle" + icon_state = "jungle" + //INSECT WINGS /datum/sprite_accessory/insect_wings 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/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/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..f88ccc876f 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -5,7 +5,7 @@ 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") + 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/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/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/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/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/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/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/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/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 445ce39ce5..1fc61c9bed 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -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/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/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/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/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/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/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/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/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e15e02f0d5..0b47c7218f 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -375,7 +375,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, @@ -544,7 +544,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/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-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-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-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-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/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/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..21d2f872f1 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index 5ff248de68..8685b882f0 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..50b0064de5 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/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/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/suits.dmi b/icons/obj/clothing/suits.dmi index c12720bc8b..935e9ead02 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/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/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/tgstation.dme b/tgstation.dme index 2b00eb6b98..99130d1740 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" @@ -3609,6 +3619,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} />