diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3def1e0390c..ca988698e47 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -62,7 +62,11 @@ # ninjanomnom +/code/__DEFINES/dcs/ @ninjanomnom +/code/controllers/subsystem/dcs.dm @ninjanomnom /code/controllers/subsystem/shuttle.dm @ninjanomnom +/code/datums/components/ @ninjanomnom +/code/datums/elements/ @ninjanomnom /code/modules/shuttle/ @ninjanomnom # ShizCalev @@ -83,10 +87,7 @@ # Multiple Owners -/code/__DEFINES/components.dm @Cyberboss @ninjanomnom /code/controllers/subsystem/air.dm @duncathan @MrStonedOne -/code/datums/components/ @Cyberboss @ninjanomnom - #SIC SEMPER TYRANNIS /code/modules/hydroponics/grown/citrus.dm @optimumtact diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 5cacb35367b..cb6c58f858c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -2,87 +2,31 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ad" = ( -/obj/structure/flora/ausbushes/leafybush, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"ae" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/stack/cable_coil, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/ruin/powered/beach) "af" = ( -/obj/structure/table, -/obj/item/clothing/mask/gas, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/item/clothing/glasses/sunglasses/big, -/obj/item/clothing/glasses/sunglasses/big, -/obj/item/clothing/glasses/sunglasses/big, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"ag" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"ah" = ( -/obj/effect/mob_spawn/human/bartender/alive, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"ai" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "aj" = ( /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"ak" = ( -/obj/structure/toilet, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"al" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) "am" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"an" = ( -/obj/item/flashlight/lantern, -/obj/machinery/light/small{ +/obj/machinery/light{ dir = 1 }, -/turf/open/floor/plating, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "ao" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 +/obj/machinery/door/airlock/public/glass{ + name = "Resort Lobby" }, -/obj/effect/turf_decal/sand, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, /area/ruin/powered/beach) "ap" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"aq" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) "ar" = ( /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) @@ -90,67 +34,46 @@ /turf/open/floor/plating, /area/ruin/powered/beach) "at" = ( -/obj/item/tank/internals/oxygen, -/turf/open/floor/plating, +/mob/living/simple_animal/crab{ + name = "Eddie" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "au" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/plating, +/obj/structure/sign/poster/contraband/space_cola{ + pixel_y = 32 + }, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "av" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Lavatory" +/obj/effect/overlay/coconut, +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"aw" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Bar Storage" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"ax" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"ay" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/door/airlock/sandstone{ - name = "Restroom" - }, -/turf/open/floor/plating, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "az" = ( -/obj/item/clothing/neck/necklace/dope, -/obj/item/reagent_containers/spray/spraytan, -/turf/open/floor/plating/beach/sand, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, /area/ruin/powered/beach) "aA" = ( /obj/effect/turf_decal/sand, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "aB" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, /area/ruin/powered/beach) "aC" = ( /turf/open/floor/wood, /area/ruin/powered/beach) -"aD" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/chem_dispenser/drinks, -/turf/open/floor/wood, -/area/ruin/powered/beach) "aE" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/wood, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/carpet/orange, /area/ruin/powered/beach) "aF" = ( /obj/machinery/vending/boozeomat{ @@ -158,63 +81,32 @@ }, /turf/open/floor/wood, /area/ruin/powered/beach) -"aH" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, -/turf/open/floor/wood, -/area/ruin/powered/beach) "aI" = ( /obj/structure/table, /obj/machinery/microwave, /turf/open/floor/wood, /area/ruin/powered/beach) -"aJ" = ( -/obj/structure/closet/crate/bin, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/trash/candy, -/obj/item/toy/talking/owl, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, -/area/ruin/powered/beach) "aK" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, -/area/ruin/powered/beach) -"aM" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/wood, +/obj/structure/flora/junglebush/large, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "aN" = ( /obj/machinery/vending/cigarette/beach, /obj/effect/turf_decal/sand, +/obj/structure/sign/poster/contraband/have_a_puff{ + pixel_x = -32 + }, /turf/open/floor/plasteel, /area/ruin/powered/beach) "aO" = ( -/obj/structure/weightmachine/stacklifter, -/turf/open/floor/plating/beach/sand, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, /area/ruin/powered/beach) "aP" = ( /obj/structure/table/wood, /turf/open/floor/wood, /area/ruin/powered/beach) -"aQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aR" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/tequila, -/turf/open/floor/wood, -/area/ruin/powered/beach) "aS" = ( /obj/machinery/processor, /turf/open/floor/wood, @@ -228,20 +120,9 @@ /obj/effect/overlay/palmtree_l, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"aV" = ( -/obj/effect/mob_spawn/human/beach/alive, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) "aW" = ( -/obj/structure/chair/stool, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, -/area/ruin/powered/beach) -"aX" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, +/obj/machinery/deepfryer, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/ruin/powered/beach) "aY" = ( @@ -254,58 +135,20 @@ /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "bb" = ( -/obj/structure/weightmachine/weightlifter, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bc" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Bar Access" - }, +/obj/structure/closet/crate/bin, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/trash/candy, +/obj/item/toy/talking/owl, /obj/effect/turf_decal/sand, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"bd" = ( -/obj/structure/closet/secure_closet/freezer/kitchen{ - req_access = null +/obj/machinery/light{ + dir = 8 }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"be" = ( -/obj/vehicle/ridden/scooter/skateboard{ - dir = 4 - }, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bg" = ( -/obj/structure/sign/barsign, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"bl" = ( -/obj/effect/turf_decal/caution, -/obj/effect/turf_decal/sand, /turf/open/floor/plasteel, /area/ruin/powered/beach) "bx" = ( /obj/structure/flora/rock, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"bz" = ( -/mob/living/simple_animal/crab, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bA" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/bikehorn/airhorn, -/obj/structure/table/wood, -/obj/item/storage/firstaid/regular, -/obj/item/storage/firstaid/brute, -/turf/open/floor/wood, -/area/ruin/powered/beach) "bB" = ( /obj/structure/window/reinforced{ dir = 4 @@ -315,15 +158,25 @@ layer = 2.9 }, /obj/structure/chair/stool, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/red, +/obj/item/clothing/glasses/sunglasses, /turf/open/floor/wood, /area/ruin/powered/beach) -"bE" = ( -/obj/item/reagent_containers/spray/spraytan, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bF" = ( -/obj/item/toy/beach_ball, -/turf/open/floor/plating/beach/sand, +"bC" = ( +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = -7; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + pixel_x = 4; + pixel_y = -3 + }, +/turf/open/floor/carpet/red, /area/ruin/powered/beach) "bG" = ( /obj/structure/window/reinforced{ @@ -344,10 +197,6 @@ /obj/structure/chair, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"bK" = ( -/obj/item/storage/backpack/duffelbag, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) "bL" = ( /obj/effect/turf_decal/sand{ density = 1 @@ -361,28 +210,14 @@ /turf/open/floor/plasteel/stairs/old, /area/ruin/powered/beach) "bN" = ( -/obj/structure/flora/ausbushes/reedbush, +/obj/structure/extinguisher_cabinet{ + pixel_y = -32 + }, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"bO" = ( -/obj/item/camera, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bP" = ( -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) -"bQ" = ( -/obj/structure/flora/ausbushes/reedbush, -/turf/open/floor/plating/beach/coastline_t, -/area/ruin/powered/beach) "bR" = ( /turf/open/floor/plating/beach/coastline_t, /area/ruin/powered/beach) -"bS" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/floor/plating/beach/coastline_t, -/area/ruin/powered/beach) "bT" = ( /turf/open/floor/plating/beach/coastline_b, /area/ruin/powered/beach) @@ -394,26 +229,28 @@ /turf/open/floor/plating/beach/water, /area/ruin/powered/beach) "bW" = ( -/turf/closed/wall/r_wall, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"bY" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, /area/ruin/powered/beach) "cd" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"ce" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plating/beach/sand, -/area/ruin/powered/beach) "cg" = ( -/obj/machinery/light{ - dir = 8 +/obj/structure/girder{ + damage_deflection = 22 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "ch" = ( /obj/machinery/light{ @@ -422,156 +259,625 @@ /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "cj" = ( -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 4; + name = "old sink"; + pixel_x = -12 }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, -/area/ruin/powered/beach) -"cs" = ( -/obj/effect/overlay/palmtree_l, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating/beach/sand, +/turf/open/floor/wood, /area/ruin/powered/beach) "ct" = ( -/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"cz" = ( +/obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/plating/beach/water, /area/ruin/powered/beach) "cR" = ( -/obj/structure/table/wood, -/obj/item/tank/internals/oxygen, -/obj/item/pickaxe, -/obj/item/clothing/mask/gas, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"dw" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Beach Access" +/obj/structure/chair/wood, +/obj/machinery/light{ + dir = 1 }, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"gg" = ( -/obj/structure/table, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/beakers, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"hY" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"iw" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"jF" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"jP" = ( -/obj/item/toy/seashell, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"lF" = ( +"cV" = ( +/obj/structure/closet/secure_closet/freezer/meat{ + req_access = null + }, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawbacon, +/obj/item/reagent_containers/food/snacks/meat/rawcutlet, +/obj/item/reagent_containers/food/snacks/meat/rawcutlet, +/obj/item/reagent_containers/food/snacks/meat/rawcrab, +/obj/item/reagent_containers/food/snacks/meat/rawcrab, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"de" = ( +/obj/structure/bookcase/random/reference, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"dX" = ( +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"ek" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/beach) +"et" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"eE" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"fB" = ( +/turf/open/floor/plasteel/stairs/medium, +/area/ruin/powered/beach) +"fL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"fP" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"gg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/door/airlock/public/glass{ + name = "Resort Casino" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"gs" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"gC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"gF" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/sepia, +/area/ruin/powered/beach) +"gT" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Surfer Shack 2" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon = 'icons/misc/beach.dmi'; + icon_state = "sand" + }, +/area/ruin/powered/beach) +"hq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/item/bedsheet/dorms, +/obj/structure/bed, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hv" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/food_cart, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"hy" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo"; + pixel_x = -4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hF" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Resort Bathroom" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hO" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/lsd, +/obj/item/reagent_containers/pill/lsd, +/obj/item/reagent_containers/pill/lsd, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hS" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"hX" = ( +/obj/structure/punching_bag, +/turf/open/floor/pod/dark, +/area/ruin/powered/beach) +"hY" = ( +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"jc" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/morphine, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"kb" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/ambrosia_vulgaris{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"kd" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/tray, +/obj/item/reagent_containers/food/drinks/colocup, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"kg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"kh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"kj" = ( +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"kn" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plating/beach/coastline_b{ + dir = 10 + }, +/area/ruin/powered/beach) +"li" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Bar Access" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"lq" = ( +/obj/effect/turf_decal/sand, +/turf/open/floor/sepia, +/area/ruin/powered/beach) +"lL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"lT" = ( +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"mh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"nw" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/washing_machine, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"og" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/pod/dark, +/area/ruin/powered/beach) +"oF" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"oQ" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"oU" = ( +/obj/machinery/seed_extractor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"pB" = ( +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/mayonnaise, +/obj/item/reagent_containers/food/condiment/milk, +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"pE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/sign/warning/gasmask{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"pS" = ( /obj/machinery/light{ dir = 4 }, -/turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel{ + icon = 'icons/misc/beach.dmi'; + icon_state = "sand" }, /area/ruin/powered/beach) -"lM" = ( -/obj/structure/dresser, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"mh" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"oK" = ( -/obj/effect/turf_decal/caution{ +"qc" = ( +/obj/structure/mirror{ + pixel_x = -32 + }, +/obj/structure/sink/kitchen{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, +/turf/open/floor/wood, /area/ruin/powered/beach) -"pg" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/shower{ - dir = 4 - }, +"qf" = ( +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/ruin/powered/beach) -"pI" = ( -/obj/machinery/door/airlock/hatch{ - name = "Lava Beach Club" - }, -/obj/structure/fans/tiny, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"pU" = ( -/obj/machinery/light/small{ +"qt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/turf/open/floor/pod/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"qa" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/pod/dark, +"qx" = ( +/obj/structure/table/wood, +/obj/structure/bedsheetbin, +/turf/open/floor/wood, /area/ruin/powered/beach) -"qT" = ( -/obj/machinery/shower{ +"qy" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/zoom, +/obj/item/reagent_containers/pill/zoom, +/obj/item/reagent_containers/pill/zoom, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"qF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/pod/light, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"sy" = ( -/obj/effect/turf_decal/caution{ +"qT" = ( +/obj/machinery/light{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"rU" = ( +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 + }, +/obj/structure/table, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"sl" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"sM" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/secure_closet{ + icon_state = "cabinet"; + name = "bartender's closet"; + req_access = list(25) + }, +/obj/item/clothing/shoes/sandal{ + desc = "A very fashionable pair of flip-flops."; + name = "flip-flops" + }, +/obj/item/clothing/neck/beads, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/clothing/suit/hawaiian, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"sV" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"sZ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/layer3, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"ta" = ( +/obj/structure/curtain, +/turf/open/floor/plasteel/white, +/area/ruin/powered/beach) +"tf" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris, +/obj/machinery/light, +/obj/item/disk/plantgene, +/obj/item/disk/plantgene, +/obj/item/disk/plantgene, +/obj/item/disk/plantgene, +/obj/item/disk/plantgene, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"tg" = ( +/obj/structure/closet/crate/freezer{ + name = "Cooler" + }, +/obj/item/reagent_containers/food/drinks/ice, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer{ + desc = "Beer advertised to be the best in space."; + name = "Masterbrand Beer" + }, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"tn" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"tB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"tQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"tR" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/carpet/red, +/area/ruin/powered/beach) +"uz" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/ruin/powered/beach) +"vf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/structure/table/wood/poker, +/obj/item/storage/pill_bottle/dice, +/obj/item/stack/spacecash/c1000, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"vi" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/beach/coastline_b{ + dir = 9 + }, +/area/ruin/powered/beach) +"vK" = ( /obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, +/obj/machinery/icecream_vat, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"sO" = ( -/obj/machinery/jukebox/disco/indestructible, -/turf/open/floor/light/colour_cycle, +"ww" = ( +/obj/structure/sign/poster/official/fruit_bowl, +/turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) -"vl" = ( -/obj/structure/closet/athletic_mixed, -/turf/open/floor/pod/dark, +"wW" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/beach/coastline_b{ + dir = 4 + }, /area/ruin/powered/beach) "wY" = ( /turf/open/floor/pod/light, /area/ruin/powered/beach) -"yp" = ( -/obj/item/reagent_containers/spray/spraytan, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, +"xa" = ( +/obj/structure/sign/warning/securearea, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall/mineral/sandstone, /area/ruin/powered/beach) -"zw" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/sand, -/turf/open/floor/pod/dark, +"xe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/wood/nonmetal, /area/ruin/powered/beach) -"zO" = ( -/obj/structure/flora/ausbushes/leafybush, -/obj/item/toy/seashell, +"xg" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"xE" = ( +/obj/structure/easel, +/obj/item/canvas/twentythreeXtwentythree, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) +"xS" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 1 + }, +/area/ruin/powered/beach) +"yb" = ( +/obj/structure/flora/junglebush/large, +/obj/structure/flora/junglebush, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"yc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"yk" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/ruin/powered/beach) +"yB" = ( +/mob/living/simple_animal/crab{ + name = "Jonny" + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"yN" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"zm" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/morphine, +/obj/item/reagent_containers/pill/morphine, +/obj/item/reagent_containers/pill/morphine, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"zv" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/cas{ + pixel_x = -6 + }, +/obj/item/toy/cards/deck/cas/black{ + pixel_x = -6; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"zT" = ( +/obj/structure/chair/stool, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ay" = ( +/obj/item/toy/beach_ball, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"AE" = ( +/obj/item/melee/skateboard/hoverboard, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"AY" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/shovel/spade, +/obj/item/reagent_containers/glass/bucket, +/obj/item/cultivator, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) "Bl" = ( /obj/effect/turf_decal/sand, /obj/machinery/light{ @@ -579,34 +885,442 @@ }, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"Ec" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Beach Access" - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/pod/dark, +"Bn" = ( +/turf/open/floor/carpet/blue, /area/ruin/powered/beach) -"Ga" = ( -/obj/effect/turf_decal/caution{ +"Bp" = ( +/turf/closed/mineral/random/volcanic, +/area/lavaland/surface/outdoors/explored) +"Br" = ( +/obj/item/melee/skateboard/hoverboard, +/mob/living/simple_animal/chicken{ + name = "Chicken Joe" + }, +/turf/open/floor/plating/beach/coastline_t, +/area/ruin/powered/beach) +"BE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"BL" = ( +/obj/structure/extinguisher_cabinet{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"BN" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"Cl" = ( +/turf/open/floor/plating/beach/coastline_b{ dir = 8 }, -/obj/effect/turf_decal/sand, -/turf/open/floor/plasteel, /area/ruin/powered/beach) -"Gc" = ( +"Cq" = ( +/obj/structure/sign/departments/restroom{ + pixel_x = 32 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Cs" = ( +/obj/structure/girder{ + damage_deflection = 22 + }, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"Cv" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"CE" = ( +/obj/structure/flora/junglebush, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"CK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"CU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"CZ" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"Dg" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"Dn" = ( +/obj/effect/overlay/palmtree_r, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ds" = ( +/obj/structure/closet/secure_closet/freezer/kitchen{ + req_access = null + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"DI" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"DK" = ( +/turf/open/floor/plating/beach/coastline_t/sandwater_inner, +/area/ruin/powered/beach) +"DL" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Eq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"EB" = ( +/obj/structure/flora/ausbushes/stalkybush, +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating/beach/water, +/area/ruin/powered/beach) +"EE" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"EF" = ( /obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/structure/chair/stool/bar, +/turf/open/floor/sepia, +/area/ruin/powered/beach) +"EN" = ( +/obj/structure/table/reinforced, +/obj/machinery/plantgenes{ + pixel_y = 6 + }, /turf/open/floor/pod/light, /area/ruin/powered/beach) -"HC" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/effect/turf_decal/sand, -/turf/open/floor/pod/dark, +"ER" = ( +/obj/structure/fluff/beach_umbrella/security, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"Ml" = ( +"Fi" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Fr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"FF" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/barman_recipes, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/reagent_containers/glass/rag, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"FR" = ( +/obj/structure/chair/sofa/left, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"FZ" = ( +/obj/structure/sign/poster/contraband/space_up{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Ga" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/head/chefhat, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"GB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/peppermill, +/obj/item/reagent_containers/food/condiment/soysauce, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"GR" = ( +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/item/toy/beach_ball/holoball/dodgeball, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/ruin/powered/beach) +"Hn" = ( +/obj/machinery/light, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"Hy" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/stairs/left, +/area/ruin/powered/beach) +"HV" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 5 + }, +/area/ruin/powered/beach) +"HW" = ( +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/vending_refill/cigarette, +/obj/item/vending_refill/boozeomat, +/obj/structure/closet/secure_closet{ + icon_state = "cabinet"; + name = "booze storage"; + req_access = list(25) + }, +/obj/item/storage/backpack/duffelbag, +/obj/item/etherealballdeployer, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/beer/light, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/obj/item/reagent_containers/food/drinks/colocup, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Il" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Iq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"Ir" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"Iv" = ( +/turf/open/floor/plasteel/stairs/right, +/area/ruin/powered/beach) +"IG" = ( +/turf/open/floor/carpet/royalblue, +/area/ruin/powered/beach) +"IJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"IL" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"Jf" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/departments/botany{ + pixel_y = -32 + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Jr" = ( +/turf/open/floor/carpet/purple, +/area/ruin/powered/beach) +"Jv" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"JO" = ( +/turf/open/floor/plating/beach/coastline_b{ + dir = 6 + }, +/area/ruin/powered/beach) +"JP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"Km" = ( +/mob/living/simple_animal/crab{ + name = "Jon" + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ky" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"KK" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Lp" = ( +/obj/structure/extinguisher_cabinet{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Md" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Mf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"MO" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"MZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"ND" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/bikehorn/airhorn, +/obj/structure/table/wood, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/brute, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"NJ" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"NK" = ( +/obj/machinery/grill, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"NV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"OE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"OI" = ( +/obj/structure/flora/ausbushes/sparsegrass, /obj/item/toy/seashell, -/turf/open/floor/plating/beach/coastline_t, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"OP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 + }, +/obj/machinery/light, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Pr" = ( +/obj/machinery/vending/hydronutrients, +/turf/open/floor/plasteel/grimy, +/area/ruin/powered/beach) +"PN" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/jukebox, +/obj/item/coin/gold, +/turf/open/floor/sepia, +/area/ruin/powered/beach) +"PY" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 4; + name = "old sink"; + pixel_x = -12 + }, +/turf/open/floor/pod/light, +/area/ruin/powered/beach) +"QF" = ( +/obj/machinery/light, +/turf/open/floor/wood, /area/ruin/powered/beach) "QS" = ( /obj/effect/turf_decal/sand, @@ -615,24 +1329,281 @@ }, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) -"TP" = ( +"Rk" = ( /obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"RB" = ( +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/blue, +/obj/item/clothing/suit/ianshirt, +/obj/item/clothing/shoes/sandal{ + desc = "A very fashionable pair of flip-flops."; + name = "flip-flops" + }, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/neck/beads, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"RE" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"Sn" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Supply Room" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"SK" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/pod/dark{ - initial_gas_mix = "LAVALAND_ATMOS" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 }, +/obj/structure/mineral_door/wood{ + name = "Croupier's Booth" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"ST" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"SZ" = ( +/obj/item/storage/crayons, +/obj/structure/closet/crate/wooden, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, +/obj/item/canvas/twentythreeXtwentythree, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ti" = ( +/turf/open/floor/carpet/red, +/area/ruin/powered/beach) +"Tu" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating/beach/coastline_b{ + dir = 8 + }, +/area/ruin/powered/beach) +"TC" = ( +/obj/effect/mob_spawn/human/beach/alive{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"TL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"TU" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/sepia, +/area/ruin/powered/beach) +"TV" = ( +/obj/item/toy/seashell, +/obj/effect/turf_decal/sand, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ui" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/ruin/powered/beach) +"Uk" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"Up" = ( +/obj/structure/noticeboard/staff, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"Ut" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/poster/contraband/sun_kist{ + pixel_y = 32 + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Ux" = ( +/obj/item/toy/plush/lizardplushie{ + name = "Soaks-The-Rays" + }, +/turf/open/floor/carpet/orange, +/area/ruin/powered/beach) +"UZ" = ( +/obj/item/stack/sheet/metal/fifty, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/ruin/powered/beach) +"Vf" = ( +/obj/machinery/light, +/turf/open/floor/plating/beach/coastline_b{ + dir = 1 + }, +/area/ruin/powered/beach) +"Vl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Vs" = ( +/obj/structure/toilet, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Vt" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 8 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"VL" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/closet/crate{ + name = "fuel crate" + }, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"VN" = ( +/obj/item/toy/seashell, +/turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "VO" = ( /turf/open/floor/pod/dark, /area/ruin/powered/beach) -"Xp" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/small{ - brightness = 3; - dir = 8 +"Wa" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/pod/dark, +/area/ruin/powered/beach) +"Wd" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/pill/happy, +/obj/item/toy/figure/bartender{ + pixel_x = -8; + pixel_y = -1 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Wf" = ( +/obj/machinery/computer/arcade/battle, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Wy" = ( +/obj/structure/closet/cabinet, +/obj/item/storage/backpack/duffelbag, +/obj/item/clothing/under/shorts/purple, +/obj/item/clothing/suit/vapeshirt, +/obj/item/clothing/shoes/cookflops{ + desc = "A very fashionable pair of flip flops."; + name = "flip-flops" + }, +/obj/item/clothing/glasses/sunglasses/big, +/obj/item/clothing/neck/beads, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"WF" = ( +/obj/effect/turf_decal/sand, +/mob/living/simple_animal/crab{ + name = "James" + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"Xt" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Surfer Shack 1" + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"Xu" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"XW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/powered/beach) +"Zi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/closed/wall/mineral/sandstone, +/area/ruin/powered/beach) +"Zj" = ( +/obj/item/instrument/guitar, +/turf/open/floor/carpet/blue, +/area/ruin/powered/beach) +"Zq" = ( +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, +/obj/effect/mob_spawn/human/bartender/alive{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/powered/beach) +"ZA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/spawner/structure/window, +/obj/structure/curtain, +/turf/open/floor/plating, +/area/ruin/powered/beach) +"ZN" = ( +/obj/effect/turf_decal/sand, +/obj/structure/sign/warning/nosmoking/circle{ + pixel_x = 32 + }, +/turf/open/floor/plating/beach/sand, +/area/ruin/powered/beach) +"ZS" = ( +/turf/closed/mineral/random/volcanic, +/area/template_noop) +"ZZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod/light, /area/ruin/powered/beach) (1,1,1) = {" @@ -640,32 +1611,32 @@ aa aa aa aa -aa -aa -aa -aa -aa -lF -aa +Bp +Bp +Bp +Bp bW bW bW -pI -bW -pI -bW -bW -bW -aa -lF -aa -aa -aa +Bp aa aa aa aa aa +Zi +BE +BE +BE +BE +BE +BE +BE +BE +BE +yc +Bp +Bp "} (2,1,1) = {" aa @@ -674,562 +1645,498 @@ aa aa aa aa -bW -bW -bW -bW -bW -bW -vl -iw -wY -pg -wY -Xp +aa +aj +gs +gs +aj +aj +aa +aa +aa +Zi +BE +Mf cR -bW -bW -bW -bW -bW -aa -aa -aa -aa -aa -aa +yB +ap +aj +oQ +Zq +FF +Fi +aF +Fr +yc +Bp "} (3,1,1) = {" aa aa aa aa -bW -bW -bW -ap +aa +aa +aa +aj cg +Cs +Cs +aj +Zi +xa +BE +Mf +kj +IG ar -ar -bW -HC -VO -Gc -Gc -wY -VO -lM -bW -zO -bQ -bT -bW -bW -bW -aa -aa -aa -aa +ap +bx +aj +HW +aC +aC +Eq +ct +hS +cd +Bp "} (4,1,1) = {" aa -aa -aa -bW -bW -ap +aj +aj +aj +aj +aj +aj +aj +as +Wa +as +pE +mh +Ui +gs +ar +ar +IG ar ar ar -ar -ar -bW -mh -mh -mh -dw -mh -mh -mh -bW -ap -Ml -bT -bU -ct -bW -bW -aa -aa -aa +aj +sM +aC +aC +CK +IJ +MO +CU +Bp "} (5,1,1) = {" aa -aa -bW -bW -ad +aj +NJ +DI +xg +aC +aj +aj +aj +lT +as +yk +Jv +as +gs ar ar -aO -ar -bb -ar -cg ar ar -Bl -aA -Bl ar -ar -cg bN -bR -bT -bU -bU -bU -bW -bW -aa -aa +aj +aj +li +kd +aP +Wd +aj +MZ +Bp "} (6,1,1) = {" aa -aa -bW -aq +aj +NJ +tR +Ti +DI +zv +aC +Zi +BE +BE +BE +Mf +aj +aj +aU +ar +ap +SZ ar ar ar -ar -aV -ar -ar -ar -ar -ar -ar -ar -ar -bz -ar -bJ -ar -bS -bT -bU -bU -bU -bU -bW -aa -aa +Hy +TU +EF +EF +EF +gF +MZ +Bp "} (7,1,1) = {" aa -bW -bW -ar -ap +aj +Wf +tR +Ti az -ar +Vl aO -ar +CU bb -ar -ar -ar -aU +aN +aT +aY +Bl aZ ar ar ar +xE +zT +ap ar -ar -ar -bR -bT -bU -bU -bU -ct -bW -bW -aa +fB +lq +uz +uz +uz +lq +MZ +Bp "} (8,1,1) = {" aa -bW -ad +aj +tn +Ti +Ti +Xu +vf +ct +BN +aA +aA +WF +aA +aA +ar +Ay +ar +ar +ap ar ar ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -bJ -bE -bR -bT -bU -bU -bU -bU -bU -bW -aa +fB +lq +uz +uz +uz +PN +MZ +Bp "} (9,1,1) = {" aa -bW -bW -bW -bW -ce -aA -aA -aA -aA -aA -aA -aA -aA -ar +aj +FR +aC +aC +Zi +BE +SK +Mf +au ar ar ap ar +aK ar -bO -bR -bT -bU -bU -bU -bU -bU -bW -aa +yb +ar +ar +ar +ar +ar +fB +lq +uz +uz +uz +lq +MZ +Bp "} (10,1,1) = {" aa -bW -ae +Zi +BE gg -bW -aB -aK -aK -aK -aK -aK -aK -yp -aA +gg +Mf +aZ +hk ar ar -ap -bx ar -bJ ar -bR -bT -bU -bU -bV -bU -bU -bW -aa +ar +ar +ar +ar +ar +ar +ar +ar +ar +DK +Iv +lq +lq +lq +lq +lq +Fr +yc "} (11,1,1) = {" aa -bW +MZ af -as -aj -aj -aj -aj -aB -aK -aK -aK -aK +ar +ar +ar +ar +pS aA +aA +aA +aA +aA +aA +aA +QS ar ar -ar -ar -ar -ar +ER +tg ar bR -bT -bU -bU -bU -bU -bU -bW -aa +vi +wW +wW +wW +wW +wW +kn +MZ "} (12,1,1) = {" aa -bW -ag -as -aw -aC -aC -aP -aW -aK +MZ +ar +ar +ap +ar +ar +xe +RE +RE Ga -aK -aK -aA +jc +Il +GB +RE +Uk ar ar -ap -ar -ar -bJ +bC +Ti ar bR bT -bU -bU -bU -bU -ct -bW -aa -"} -(13,1,1) = {" -aa -bW -ah -as -aj -aD -aC -aQ -aW -oK -sO -bl -aK -aA -ar -bx -ar -ar -ar -bK -ar -bR -bT -bU -bU -bU -bU -bU -bW -aa -"} -(14,1,1) = {" -aa -bW -ai -at -ax -hY -aC -aP -aW -aK -sy -aK -aK -aA -ar -ap -ar -ar -ar -bJ -ar -bR -bT -bU -bU -bU -bU -bU -bW -aa -"} -(15,1,1) = {" -aa -bW -cd -aj -aj -aF -aC -aR -aW -aK -aK -aK -aK -aA -ar -ar -ar -ar -bE -ar -ar -Ml -bT -bU -bU -bU -bU -bU -bW -aa -"} -(16,1,1) = {" -aa -bW -ak -au -aj -aE -aC -aj -aj -bc -aj -cj -aK -aA -ar -ar -ar -ar -ar -bJ -ar -bR -bT -bU -bU -bU -bU -bU -bW -aa -"} -(17,1,1) = {" -aa -bW -aj -av -aj -aH -aC -aC -aC -aC -bg -aB -aK -aA -ar -ar -aU -ar -ar -ar -ar -bR -bT -bU bV bU bU bU -bW -aa +cz +xS +MZ "} -(18,1,1) = {" -aa -bW -al -as -aj +(13,1,1) = {" +Bp +Fr +yc +ar +ar +ar +ar +XW aI -aM -aS -aX -bd -aj -aB -aK -aA -ar -aZ +OE +aC +aC +aC +aC +cV +RE ar ar -bF +KK ar -bz +VN bR bT bU bU bU bU -ct -bW -aa +bU +xS +MZ "} -(19,1,1) = {" -aa +(14,1,1) = {" +Bp bW -am -as -aj -aj -aj -aj -aj -aj -aj +MZ +at +ar +hY +ar +NV +aW +fL +aC +aC +aC +aC +aC +qy +ar +ar +Jr +Jr +ar +bR +bT +bU +bU +bU +bU +bU +xS +MZ +"} +(15,1,1) = {" +Bp +sZ +cd +ar +aU +Ux +ar +tQ +rU +aC +fP +RE +ww +NK +aC +hO +ar +ar +kj +ar +ar +bR +bT +bU +bU +bV +bV +bU +Vf +MZ +"} +(16,1,1) = {" +Bp +bW +MZ +dX +Dn +aE +ar +sl +hy +TL +aC cj -aK -aA +aC +aC +aC +zm +ar +ar +Bn +Zj +ar +bR +bT +bV +bU +bV +EB +bU +xS +MZ +"} +(17,1,1) = {" +Bp +bW +MZ +av ar ar ar +RE +aS +Rk +aC +aC +pB +Ds +yN +RE ar +OI ch ar ar @@ -1240,358 +2147,422 @@ bU bU bU bU -bW -aa +xS +MZ "} -(20,1,1) = {" -aa -bW -an -au -aj -aJ -aN -aT -aY -aK -aK -aK -aK -aA +(18,1,1) = {" +Bp +Zi +Mf +ap ar ar ar -bA +RE +RE +RE +RE +aB +RE +RE +RE +Up +ar +ND bG bL ar bR bT bU +cz bU bU -bU -bU -bW -aa +bV +xS +MZ "} -(21,1,1) = {" +(19,1,1) = {" aa -bW -ao -au -ay -aK -aK -aK -aK -aK -aK -aK -aK +MZ +am +ar +ar +ap +ar +Bl aA -ar -ar +vK +hv +aA +aA +aA +aA +Bl ar bB bH bM ar -bR +Br bT bU bU bU bU bU -bW +Vf +MZ +"} +(20,1,1) = {" aa +MZ +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +ar +Cv +bR +HV +Tu +Cl +Cl +Cl +Cl +JO +MZ +"} +(21,1,1) = {" +aa +Ky +ao +ao +yc +aK +ar +ar +ar +ar +ar +ch +ar +ar +ar +ar +ar +ar +ar +ar +Jf +aj +aj +aj +aj +aj +aj +Zi +BE +Mf "} (22,1,1) = {" aa -bW -bW -bW -bW -ce -aA -aA -aA -aA -aA -aA -aA -aA +MZ +aC +aC +Fr +yc +DL +Zi +qF +ZA +Vt +yc +CE ar -ar -ar -ar -ar -ar -bP -bR -bT -bU -bU -bU -bV -bU -bW -aa -"} -(23,1,1) = {" -aa -bW ap ar ar ar ar -ar -ar -ar -ar -ar -ar -ar -ar -ar +Km +aA +wY +wY +wY +AE +AE +qf +MZ +Bp +Bp +"} +(23,1,1) = {" +aa +eE +IJ +fL +aC +Fr +BE +Mf +de +TC +hq +Fr +qF +ZA +Vt +yc ar ar ar bJ -ar -bR -bT -bU -bU -bU -bU -bU -bW -aa +aA +hX +VO +og +wY +wY +Hn +Fr +yc +Bp "} (24,1,1) = {" aa -bW -bW -jP -ap -ar -ar +lL +nw +TL +aC +aC +aC +Xt +tB +aC +kh +aj +de +TC +hq +MZ aU -bE -ar -ar -bz -ar -ar -ar -ar -ar aZ ar ar -ar -bR -bT -bU -bU -bU -ct -bW -bW -aa +aA +VO +VO +VO +Iq +wY +JP +PY +Fr +yc "} (25,1,1) = {" aa -aa -bW -aq +MZ +qx +aC +Cq +aC +aC +aj +EE +Rk +RB +aj +tB +aC +OP +MZ ar ar +ap ar -ar -aZ -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -ar -jP -bS -bT -bU -bU -bU -bU -bW -aa -aa +TV +hX +VO +og +gC +EN +kg +wY +Pr +MZ "} (26,1,1) = {" aa -aa -bW -bW -ap -ar -ar -aq -aV -be -ar -ch -ar -ar -QS +MZ +aj +hF +aj +bY +aC +aj +aj +aj +aj +aj +EE +aC +Wy +MZ +Ut aA -QS -ar -ar -cs -ar -bR -bT -bU -bU -bU -bW -bW -aa -aa +aA +aA +ZN +wY +ZZ +wY +gC +oF +oU +wY +tf +MZ "} (27,1,1) = {" aa -aa -aa -bW -bW -ad -ar -ar -ar -ar -ar -bW -mh -mh -mh -Ec -mh -mh -mh -bW -ap -bR -bT -bU -ct -bW -bW -aa -aa -aa +eE +qc +aC +aj +aC +aC +aC +aC +FZ +aC +aj +aj +gT +aj +Fr +ao +ao +ST +Sn +qF +BE +yc +kb +gC +wY +kg +wY +AY +MZ "} (28,1,1) = {" aa -aa -aa -aa -bW -bW -bW -ap -ch -ap -ar -bW -zw -VO -wY -Gc -Gc -jF -lM -bW -bN -bR -bT -bW -bW -bW -aa -aa -aa -aa +lL +Md +QF +aj +aj +aj +BL +aC +aC +aC +aC +aC +aC +aC +aC +aC +aC +MZ +GR +UZ +IL +MZ +sV +Dg +sV +CZ +sV +Zi +Mf "} (29,1,1) = {" aa -aa -aa -aa -aa -aa -bW -bW -bW -bW -bW -bW -HC -qa -wY +MZ +Vs +aC +ta +ek +Zi +BE +yc +aC +Rk +aC +aC +aC +Lp qT -Gc -pU -cR -bW -bW -bW -bW -bW -aa -aa -aa -aa -aa -aa +aC +aC +MZ +et +VL +aj +Fr +BE +qt +BE +Ir +BE +Mf +Bp "} (30,1,1) = {" aa -aa -aa -aa -aa -aa -aa -aa -aa -TP -aa -bW -bW -bW -pI -bW -pI -bW -bW -bW -aa -TP -aa -aa -aa -aa -aa -aa -aa -aa +Fr +BE +BE +BE +BE +Mf +ZS +Fr +BE +BE +BE +BE +BE +Ir +qt +BE +BE +Mf +aj +aj +aj +Bp +Bp +Bp +Bp +Bp +Bp +Bp +Bp "} diff --git a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm b/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm deleted file mode 100644 index 26bb9bf35af..00000000000 --- a/_maps/RandomRuins/SpaceRuins/cloning_facility.dmm +++ /dev/null @@ -1,595 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"c" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"d" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"e" = ( -/obj/machinery/defibrillator_mount/loaded, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"f" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plasteel/airless, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"g" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/effect/decal/cleanable/cobweb, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"h" = ( -/obj/structure/table, -/obj/item/pen, -/obj/item/paper/fluff/ruins/exp_cloning/log, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"i" = ( -/obj/machinery/dna_scannernew, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"j" = ( -/obj/machinery/computer/prototype_cloning, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/paper/fluff/ruins/exp_cloning/manual, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"k" = ( -/obj/machinery/clonepod/experimental, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"l" = ( -/obj/effect/decal/cleanable/vomit/old, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"m" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"n" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"o" = ( -/obj/machinery/vending/snack/teal, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/airless, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"p" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel/airless, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"q" = ( -/obj/structure/sign/directions/science{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"r" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"s" = ( -/obj/machinery/iv_drip, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"t" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"u" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"v" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"w" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"x" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"y" = ( -/obj/structure/chair{ - dir = 1 - }, -/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/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"z" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"A" = ( -/obj/structure/sign/departments/science, -/turf/closed/wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"B" = ( -/turf/open/floor/plasteel/airless, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"C" = ( -/turf/open/floor/plating/airless, -/area/space/nearstation) -"D" = ( -/obj/structure/chair/comfy{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"E" = ( -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"F" = ( -/obj/machinery/door/airlock/research/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"G" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"H" = ( -/obj/machinery/door/airlock/research/glass, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"I" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"J" = ( -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"K" = ( -/obj/machinery/door/airlock/research/glass, -/turf/open/floor/plasteel/airless, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"L" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg1" - }, -/area/space/nearstation) -"M" = ( -/obj/structure/fluff/broken_flooring{ - dir = 8; - icon_state = "plating"; - name = "broken plating" - }, -/turf/template_noop, -/area/space/nearstation) -"N" = ( -/obj/item/book/random/triple, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"O" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/bookcase/random/fiction, -/turf/open/floor/plasteel, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"P" = ( -/obj/structure/table/glass, -/obj/machinery/light, -/obj/structure/bedsheetbin, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"Q" = ( -/obj/structure/table/glass, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"R" = ( -/obj/structure/table/glass, -/obj/item/storage/firstaid/regular, -/obj/item/healthanalyzer{ - desc = "A prototype hand-held body scanner able to distinguish vital signs of the subject."; - name = "prototype health analyzer" - }, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"S" = ( -/obj/structure/table/glass, -/obj/item/storage/box/syringes, -/turf/open/floor/plasteel/white, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"T" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/powered/ancient_shuttle) -"U" = ( -/turf/open/floor/plating/airless{ - icon_state = "platingdmg2" - }, -/area/space/nearstation) -"V" = ( -/turf/closed/wall/r_wall/rust, -/area/space/nearstation) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -c -c -c -c -c -a -a -"} -(4,1,1) = {" -a -a -c -r -D -N -c -a -a -"} -(5,1,1) = {" -a -a -c -s -E -E -c -a -a -"} -(6,1,1) = {" -a -a -d -t -E -O -d -a -a -"} -(7,1,1) = {" -a -a -d -b -F -d -d -a -a -"} -(8,1,1) = {" -a -a -a -b -G -b -a -a -a -"} -(9,1,1) = {" -a -a -d -d -H -b -b -a -a -"} -(10,1,1) = {" -a -b -b -u -I -I -c -a -a -"} -(11,1,1) = {" -a -c -g -v -J -J -c -a -a -"} -(12,1,1) = {" -a -c -h -w -J -J -d -a -a -"} -(13,1,1) = {" -a -d -i -x -J -P -b -a -a -"} -(14,1,1) = {" -a -b -j -y -J -Q -c -a -a -"} -(15,1,1) = {" -a -b -k -x -J -R -c -a -a -"} -(16,1,1) = {" -a -e -l -x -J -S -d -a -a -"} -(17,1,1) = {" -a -d -m -z -J -J -d -a -a -"} -(18,1,1) = {" -a -d -n -A -K -T -b -a -a -"} -(19,1,1) = {" -a -f -o -B -p -C -V -a -a -"} -(20,1,1) = {" -a -f -p -p -C -U -M -a -a -"} -(21,1,1) = {" -a -d -q -C -L -M -a -a -a -"} -(22,1,1) = {" -a -a -b -f -M -a -a -a -a -"} -(23,1,1) = {" -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm new file mode 100644 index 00000000000..6e973667359 --- /dev/null +++ b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm @@ -0,0 +1,1773 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"ac" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"ad" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ae" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"af" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ag" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer3{ + dir = 1 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ah" = ( +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"ai" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer1{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer3{ + dir = 8 + }, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"aj" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/visible{ + dir = 4 + }, +/obj/structure/fluff/hedge/opaque, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ak" = ( +/obj/machinery/atmospherics/components/unary/tank/oxygen{ + gas_type = /datum/gas/water_vapor + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"al" = ( +/obj/structure/table/reinforced, +/obj/item/storage/cans/sixbeer, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"am" = ( +/obj/machinery/paystand, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"an" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ao" = ( +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ap" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aq" = ( +/obj/item/pressure_plate/hologrid{ + name = "bossman's hologrid"; + reward = /obj/item/stack/spacecash/c10000 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"ar" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/five, +/obj/item/grenade/firecracker, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"as" = ( +/obj/structure/holobox, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"at" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"au" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 6 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"av" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/structure/holobox, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aw" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"ax" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer3{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"ay" = ( +/obj/structure/fluff/hedge/opaque, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"az" = ( +/obj/item/trash/raisins, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aA" = ( +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"aB" = ( +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"aC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aD" = ( +/obj/structure/holobox, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aE" = ( +/obj/machinery/photocopier, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aF" = ( +/obj/item/trash/can, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aG" = ( +/obj/structure/table/reinforced, +/obj/item/storage/cans/sixsoda, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aH" = ( +/obj/structure/table/reinforced, +/obj/item/trash/popcorn, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aI" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aJ" = ( +/obj/structure/table/reinforced, +/obj/item/trash/candle, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aK" = ( +/obj/structure/table/reinforced, +/obj/item/rsf, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aL" = ( +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"aM" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 5 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aN" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aO" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3{ + dir = 9 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aP" = ( +/obj/structure/filingcabinet, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aQ" = ( +/obj/item/trash/can, +/obj/item/trash/can, +/obj/structure/closet/crate/bin, +/obj/item/trash/chips, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aR" = ( +/obj/item/ammo_casing/spent, +/obj/item/ammo_casing/spent{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/ammo_casing/spent{ + pixel_x = 4; + pixel_y = -10 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aS" = ( +/obj/structure/closet/crate, +/obj/item/stack/packageWrap, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"aT" = ( +/obj/effect/mine/gas/water_vapor, +/obj/machinery/door/window, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aU" = ( +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aV" = ( +/obj/effect/mine/gas/water_vapor, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"aW" = ( +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"aX" = ( +/obj/item/ammo_casing/spent{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/item/ammo_casing/spent, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"aY" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"aZ" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"ba" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor/auto, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bb" = ( +/obj/structure/window/reinforced/fulltile, +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bc" = ( +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bd" = ( +/obj/structure/sign/warning/coldtemp{ + name = "\improper BLAST FREEZER" + }, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"be" = ( +/obj/structure/table, +/obj/item/paper_bin/carbon, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bf" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/chair/plastic{ + pixel_y = 4 + }, +/obj/item/chair/plastic{ + pixel_y = 8 + }, +/obj/item/chair/plastic{ + pixel_y = 12 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bg" = ( +/obj/machinery/modular_computer/console/preset/civilian, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bh" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/keycard/office + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bi" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bj" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bk" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"bl" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/conveyor/auto, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bm" = ( +/obj/structure/table, +/obj/item/stamp/denied, +/obj/item/stamp{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bn" = ( +/obj/structure/closet/crate/trashcart, +/obj/item/soap/nanotrasen, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bo" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bp" = ( +/obj/structure/chair/plastic, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bq" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"br" = ( +/obj/machinery/door/keycard/stockroom, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactory) +"bs" = ( +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bt" = ( +/obj/structure/holobox, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bu" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bv" = ( +/obj/machinery/conveyor/auto{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bw" = ( +/obj/structure/table, +/obj/structure/window{ + dir = 8 + }, +/obj/item/pen/fourcolor, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bx" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/structure/window{ + dir = 8 + }, +/obj/structure/window, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"by" = ( +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bz" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bA" = ( +/obj/structure/closet/crate, +/obj/item/stack/packageWrap, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bB" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bC" = ( +/obj/structure/ore_box, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bD" = ( +/obj/effect/turf_decal/arrows, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bE" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bF" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bG" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/flask, +/obj/item/stack/sheet/glass, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bI" = ( +/obj/structure/fermenting_barrel, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bJ" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bK" = ( +/obj/machinery/light, +/obj/structure/rack, +/obj/item/book/manual/random, +/obj/item/poster/random_contraband, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"bM" = ( +/obj/structure/grille/broken, +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/stack/spacecash/c500 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bN" = ( +/obj/structure/ore_box, +/obj/machinery/conveyor/auto, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bO" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/stack/sheet/mineral/wood/fifty, +/obj/item/plunger, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bP" = ( +/obj/effect/turf_decal/arrows{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bQ" = ( +/obj/structure/mirror, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"bR" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/keycard/stockroom + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bS" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/stack/arcadeticket/thirty + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bT" = ( +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bU" = ( +/obj/structure/closet/crate/large, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bV" = ( +/obj/structure/closet/crate, +/obj/machinery/conveyor/auto{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/item/stack/sheet/cardboard, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bW" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bX" = ( +/obj/structure/sign/warning/chemdiamond, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"bY" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"bZ" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"ca" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cb" = ( +/obj/machinery/light/small, +/obj/structure/curtain, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cc" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cd" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate universal enzyme."; + dir = 2; + dispensable_reagents = list(/datum/reagent/consumable/enzyme); + reagent_id = /datum/reagent/consumable/enzyme + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ce" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate honey."; + dir = 2; + dispensable_reagents = list(/datum/reagent/consumable/honey); + reagent_id = /datum/reagent/consumable/honey + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cf" = ( +/obj/machinery/plumbing/synthesizer{ + desc = "Produces a single chemical at a given volume. This one seems to have been hotwired to produce... blood?"; + dir = 2; + dispensable_reagents = list(/datum/reagent/blood); + reagent_id = /datum/reagent/blood + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cg" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/glass, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ch" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/plumbing/tank, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ci" = ( +/obj/machinery/light/small, +/obj/effect/decal/remains/human, +/obj/structure/curtain, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"cj" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/cloth/five, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ck" = ( +/obj/machinery/plumbing/tank, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cl" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cm" = ( +/obj/structure/cable, +/obj/machinery/power/apc/highcap/ten_k{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cn" = ( +/obj/machinery/plumbing/output{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"co" = ( +/obj/effect/turf_decal/box/white/corners{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cp" = ( +/obj/effect/turf_decal/box/white/corners, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cq" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cr" = ( +/obj/structure/closet/crate/trashcart, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cs" = ( +/obj/structure/fermenting_barrel, +/obj/effect/turf_decal/box/white, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"ct" = ( +/obj/machinery/light/built, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cu" = ( +/obj/effect/turf_decal{ + dir = 9 + }, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cv" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cw" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/item/stack/tile/plasteel, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cx" = ( +/obj/effect/turf_decal{ + dir = 1 + }, +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cy" = ( +/obj/effect/turf_decal{ + dir = 5 + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cz" = ( +/obj/machinery/light/broken, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cA" = ( +/obj/item/trash/raisins, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cB" = ( +/obj/item/stack/tile/plasteel, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cC" = ( +/obj/structure/sign/warning/vacuum, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cD" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"cE" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"cF" = ( +/obj/effect/turf_decal/delivery/white, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cG" = ( +/obj/effect/turf_decal/delivery/white, +/obj/effect/turf_decal/delivery/red, +/obj/item/stack/tile/plasteel, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cH" = ( +/obj/effect/turf_decal/delivery/white, +/obj/structure/grille/broken, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cI" = ( +/obj/effect/turf_decal/delivery/white, +/obj/effect/turf_decal/delivery/red, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cJ" = ( +/obj/effect/turf_decal/delivery/white, +/obj/item/stack/tile/plasteel, +/obj/machinery/door/poddoor, +/turf/open/floor/plating{ + broken = 1; + icon_state = "platingdmg1" + }, +/area/ruin/space/has_grav/hellfactory) +"cK" = ( +/obj/machinery/power/port_gen/pacman, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cL" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cM" = ( +/obj/item/storage/toolbox/emergency/old, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cN" = ( +/obj/machinery/door/keycard/entry, +/obj/machinery/door/airlock/public, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cO" = ( +/obj/structure/holobox, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"cQ" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cR" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon{ + icon_state = "markerburgundy-on" + }, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cS" = ( +/obj/structure/lattice/catwalk, +/obj/item/keycard/entry, +/turf/open/space/basic, +/area/ruin/space/has_grav/hellfactory) +"cU" = ( +/obj/machinery/door/keycard/office, +/turf/open/floor/plasteel/dark, +/area/ruin/space/has_grav/hellfactoryoffice) +"cV" = ( +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/structure/window, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"fj" = ( +/obj/structure/cable, +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall" + }, +/area/ruin/space/has_grav/hellfactoryoffice) +"hv" = ( +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"lv" = ( +/obj/structure/cable, +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"lR" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"nT" = ( +/obj/structure/rack, +/obj/item/stack/wrapping_paper, +/obj/item/stack/packageWrap, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"oH" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"qB" = ( +/obj/item/pressure_plate/hologrid{ + reward = /obj/item/skub + }, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"ry" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"rC" = ( +/obj/structure/sign/poster/random, +/turf/closed/wall/rust, +/area/ruin/space/has_grav/hellfactory) +"uL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"wv" = ( +/obj/machinery/power/apc/highcap/ten_k{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"xK" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/holofloor/wood, +/area/ruin/space/has_grav/hellfactory) +"zI" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"BC" = ( +/obj/machinery/light/floor, +/obj/effect/turf_decal/bot_white/left, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"EP" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/ruin/space/has_grav/hellfactory) +"Fs" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"Gs" = ( +/obj/structure/cable, +/obj/structure/cable, +/turf/closed/wall/r_wall/rust, +/area/ruin/space/has_grav/hellfactory) +"GE" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plasteel/checker, +/area/ruin/space/has_grav/hellfactory) +"Mv" = ( +/obj/structure/sign/poster/random, +/turf/closed/wall, +/area/ruin/space/has_grav/hellfactory) +"MR" = ( +/obj/item/pressure_plate/hologrid, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"OJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer1, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer3, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plastic, +/area/ruin/space/has_grav/hellfactory) +"PO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"Sz" = ( +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) +"UK" = ( +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plasteel, +/area/ruin/space/has_grav/hellfactory) +"UN" = ( +/obj/structure/cable, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/has_grav/hellfactoryoffice) +"Wh" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/ruin/space/has_grav/hellfactory) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aW +ac +aW +aW +ac +ac +aW +ac +ac +ac +aW +ac +ac +ac +ac +aW +aW +ac +aW +aW +aW +aa +aa +"} +(4,1,1) = {" +aa +aa +aW +ad +au +aC +aM +aT +ba +bl +bl +bs +bB +bG +bN +bT +cd +ch +ck +ck +cs +cD +aW +aa +aa +"} +(5,1,1) = {" +aa +aa +ac +ae +av +ab +aN +hv +bb +aA +bL +bt +bb +bb +bb +bU +ce +aA +bL +aA +cn +cs +aW +aa +aa +"} +(6,1,1) = {" +aa +aa +aW +af +aw +aD +aN +aU +bb +bL +aA +bu +bb +bb +bb +bV +cf +aA +aA +UK +bL +cs +aW +aa +aa +"} +(7,1,1) = {" +aa +aa +aW +ag +ax +OJ +aO +aV +bc +bL +bL +bv +bC +bI +bO +bW +aA +aA +bL +aA +aA +cs +aW +cQ +aa +"} +(8,1,1) = {" +aa +aa +ah +ai +ah +ah +ah +ah +bd +aA +aA +aA +bD +bJ +bP +bX +aA +aA +bL +aA +ct +cE +aW +cR +cQ +"} +(9,1,1) = {" +aa +aa +ah +aj +az +aF +aQ +ah +be +bm +bw +bx +bE +by +by +bY +by +by +by +co +cu +cF +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +ah +ak +ao +ao +aF +ah +bf +aA +bp +cV +by +Wh +BC +by +Wh +ry +by +by +cv +cG +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +ah +al +ao +aG +ao +ah +bg +aA +bL +aA +Wh +Wh +by +by +by +by +Wh +by +cw +cH +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +ah +am +ao +aH +ao +ah +ac +ac +bq +by +by +by +lR +by +by +uL +by +Wh +cx +cI +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +ah +an +ao +aI +aR +cU +bh +qB +MR +by +bF +by +by +bZ +by +bZ +cl +cp +cy +cJ +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +ah +wv +UN +aJ +aX +fj +EP +zI +lv +by +by +bK +aL +ca +aL +ca +aL +by +cz +cE +ac +cR +cQ +"} +(15,1,1) = {" +aa +aa +ah +ap +ao +aK +ao +ah +aA +bn +zI +by +Wh +Fs +bQ +cb +bQ +ci +aL +cm +cq +cK +aW +cS +aa +"} +(16,1,1) = {" +aa +aa +ah +aq +ao +ao +ao +ah +aB +bL +br +by +by +nT +aL +cc +aL +xK +Gs +EP +aW +ac +aW +aa +aa +"} +(17,1,1) = {" +aa +aa +ah +ay +aE +aP +aP +ah +bi +aB +Gs +EP +EP +zI +EP +zI +EP +zI +lv +cr +cA +cC +ab +aa +aa +"} +(18,1,1) = {" +aa +aa +ah +ah +ah +ah +ah +ah +bj +bo +aL +bz +Mv +aB +bR +PO +ab +as +aL +cr +cB +cL +ab +aa +aa +"} +(19,1,1) = {" +aa +aa +ac +ar +aA +aB +aS +aL +bk +aB +ab +bA +aA +aB +ab +GE +cg +cj +by +Sz +by +cM +cN +aa +aa +"} +(20,1,1) = {" +aa +aa +aW +ab +bL +aB +aB +aY +aA +aB +ab +ab +ab +bM +ab +ab +rC +ab +Mv +Wh +Wh +by +ab +aa +aa +"} +(21,1,1) = {" +aa +aa +ac +as +aA +Mv +aB +aA +bL +aB +aB +aB +oH +aB +ab +aB +bL +aA +by +Wh +by +by +ab +aa +aa +"} +(22,1,1) = {" +aa +aa +ac +at +GE +aL +GE +aZ +aB +aB +aL +by +ab +aA +bS +aB +ab +as +aL +by +cl +cO +ab +aa +aa +"} +(23,1,1) = {" +aa +aa +aW +aW +aW +aW +aW +ac +aW +ac +ac +aW +aW +ac +ac +ac +ac +aW +aW +ab +ab +ab +ab +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 7fa61edd43b..7b0f7df9201 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -3139,7 +3139,7 @@ /area/awaymission/academy/academyengine) "mn" = ( /obj/structure/rack, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/plating, /area/awaymission/academy/academyengine) "mo" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index fca578cc30d..4941c3f50fa 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -6184,8 +6184,7 @@ pixel_y = 10 }, /obj/item/toy/cards/deck/cas/black{ - pixel_x = -7; - pixel_y = 0 + pixel_x = -7 }, /turf/open/floor/wood, /area/maintenance/port/aft) @@ -19621,7 +19620,6 @@ /area/maintenance/port) "aYb" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 8 }, /turf/open/floor/engine, @@ -25224,6 +25222,10 @@ pixel_x = 3; pixel_y = -3 }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, /turf/open/floor/plasteel/white, /area/medical/pharmacy) "bmG" = ( @@ -25376,7 +25378,7 @@ "bmX" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bmY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -26384,9 +26386,8 @@ /area/medical/pharmacy) "bpG" = ( /obj/machinery/power/apc{ - areastring = "/area/medical/genetics/cloning"; dir = 1; - name = "Cloning APC"; + name = "Ward APC"; pixel_y = 23 }, /obj/structure/cable, @@ -26394,21 +26395,14 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bpH" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"bpI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bpJ" = ( /obj/machinery/light{ dir = 1 @@ -26419,29 +26413,24 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/chair/office/light{ - dir = 8 - }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bpK" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/bed, -/obj/item/bedsheet/medical, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bpL" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/chair/office/light{ - dir = 8 - }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bpM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/smartfridge/chemistry, @@ -26921,20 +26910,22 @@ /area/medical/medbay/central) "bqZ" = ( /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "brb" = ( -/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue, +/obj/structure/table, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "brc" = ( /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "brd" = ( /obj/effect/turf_decal/tile/blue, -/obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "brg" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -26970,7 +26961,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "brm" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -27407,18 +27398,18 @@ "bsu" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ - id_tag = "GeneticsDoor"; - name = "Genetics"; - req_access_txt = "5; 68" + name = "Ward"; + req_access_txt = "5" }, -/obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bsv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bsw" = ( /obj/machinery/door/airlock/research{ name = "Robotics Lab"; @@ -27467,12 +27458,6 @@ "bsL" = ( /turf/open/floor/plasteel/white, /area/science/genetics) -"bsN" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) "bsO" = ( /obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel/dark, @@ -27584,17 +27569,10 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"btk" = ( -/obj/structure/closet/wardrobe/white, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) "btl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/chair/office/light{ - dir = 8 - }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "btm" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 2; @@ -27603,7 +27581,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "btn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -27624,7 +27602,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "btp" = ( /turf/open/floor/plating, /area/maintenance/starboard) @@ -27925,7 +27903,7 @@ /area/medical/medbay/central) "bua" = ( /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bub" = ( /obj/machinery/light, /obj/item/radio/intercom{ @@ -27999,19 +27977,21 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bum" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bun" = ( /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "buo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -28019,12 +27999,11 @@ /turf/open/floor/plasteel/white, /area/science/research) "buq" = ( -/obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bur" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28046,7 +28025,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "buu" = ( /obj/machinery/vending/wardrobe/gene_wardrobe, /obj/structure/disposalpipe/segment, @@ -28062,7 +28041,7 @@ /obj/structure/cable, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "buy" = ( /obj/structure/disposalpipe/sorting/mail{ sortType = 23 @@ -28070,7 +28049,7 @@ /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "buz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, @@ -28122,19 +28101,16 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/research{ - name = "Genetics Research Access"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, /obj/structure/cable, +/obj/machinery/door/airlock/medical{ + name = "Ward"; + req_access_txt = "5" + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "buH" = ( /obj/machinery/door/airlock/research{ - name = "Genetics Research Access"; + name = "Research Access"; req_access_txt = "47" }, /obj/structure/disposalpipe/segment{ @@ -28143,9 +28119,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/research) @@ -28172,7 +28145,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "buM" = ( /obj/machinery/keycard_auth{ pixel_x = -24 @@ -28393,25 +28366,18 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bvn" = ( -/obj/machinery/shower{ - pixel_y = 18 +/obj/item/twohanded/required/kirbyplants/random, +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/research/interior/clonestorage) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bvo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/chair, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -28423,44 +28389,29 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvs" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue, +/obj/structure/bedsheetbin, +/obj/structure/table, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"bvt" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Cloning Storage"; - req_access_txt = "5; 9" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvu" = ( /obj/effect/turf_decal/tile/blue, -/obj/structure/bed, -/obj/item/bedsheet/medical, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvx" = ( /turf/closed/wall/r_wall, /area/science/research) "bvy" = ( -/obj/machinery/camera{ - c_tag = "Genetics Research"; - dir = 1; - network = list("ss13","medbay") - }, /obj/machinery/firealarm{ dir = 1; pixel_y = -24 @@ -28469,8 +28420,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -28479,14 +28431,14 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "bvA" = ( /obj/structure/sign/warning/securearea, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bvB" = ( /obj/machinery/camera{ c_tag = "Genetics Access"; @@ -28498,7 +28450,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/science/research) "bvC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -28911,12 +28863,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bwL" = ( -/obj/machinery/door/window/eastleft{ - name = "Cloning Recovery" - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) "bwM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -29339,12 +29285,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) -"bxX" = ( -/obj/machinery/door/window/eastright{ - name = "Cloning Recovery" - }, -/turf/open/floor/plasteel/dark, -/area/awaymission/research/interior/clonestorage) "bxY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29403,9 +29343,10 @@ /turf/open/floor/plasteel, /area/quartermaster/qm) "bye" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/obj/structure/closet/wardrobe/white, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "byf" = ( /turf/closed/wall/r_wall, /area/science/server) @@ -29920,52 +29861,33 @@ /turf/open/floor/plating, /area/maintenance/aft) "bzl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/cloning{ - dir = 1 - }, /obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"bzm" = ( +/obj/effect/turf_decal/tile/blue, /obj/structure/table, -/obj/item/storage/box/rxglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/pen, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"bzm" = ( /obj/machinery/firealarm{ - pixel_y = -24 + dir = 1; + pixel_y = -26 }, +/obj/structure/closet/wardrobe/white, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) +"bzn" = ( /obj/machinery/camera{ - c_tag = "Genetics Cloning Lab"; + c_tag = "Ward Port"; dir = 1; network = list("ss13","medbay") }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"bzn" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bzo" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -29974,8 +29896,9 @@ /obj/machinery/light_switch{ pixel_y = -28 }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bzs" = ( /turf/closed/wall, /area/maintenance/aft) @@ -33681,7 +33604,6 @@ "bIO" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/machinery/computer/camera_advanced/xenobio{ - icon_state = "computer"; dir = 8 }, /obj/structure/window/reinforced{ @@ -34444,7 +34366,6 @@ /obj/effect/turf_decal/stripes/line, /obj/structure/cable, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/plasteel, @@ -36104,8 +36025,7 @@ dir = 1 }, /obj/structure/sign/warning/deathsposal{ - pixel_x = -31; - pixel_y = 0 + pixel_x = -31 }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -36140,11 +36060,11 @@ /obj/structure/table/glass, /obj/item/storage/box/monkeycubes, /obj/machinery/button/door{ + id = "xenobiomain"; name = "Containment Blast Doors"; pixel_x = 1; pixel_y = -26; - req_access_txt = "55"; - id = "xenobiomain" + req_access_txt = "55" }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -36201,7 +36121,6 @@ }, /obj/structure/reagent_dispensers/watertank, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 1 }, /turf/open/floor/plasteel, @@ -36932,7 +36851,6 @@ pressure_checks = 0 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 4 }, /turf/open/floor/plasteel/freezer, @@ -37347,10 +37265,9 @@ /area/science/xenobiology) "bTb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - name = "killroom vent"; - icon_state = "vent_map_siphon_on-2"; dir = 1; - external_pressure_bound = 120 + external_pressure_bound = 120; + name = "killroom vent" }, /obj/machinery/light, /turf/open/floor/plasteel/freezer, @@ -37705,7 +37622,6 @@ dir = 4 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 8 }, /turf/open/floor/engine, @@ -40623,8 +40539,7 @@ "ccQ" = ( /obj/structure/sink{ dir = 4; - pixel_x = -12; - pixel_y = 0 + pixel_x = -12 }, /turf/open/floor/plasteel/white, /area/science/xenobiology) @@ -42339,18 +42254,10 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cjd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/engine/engine_smes) "cjf" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engine_smes) "cjg" = ( @@ -42805,6 +42712,10 @@ /obj/structure/table, /obj/item/stack/sheet/metal/fifty, /obj/item/stack/sheet/glass/fifty, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 6; + pixel_y = -2 + }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "ckF" = ( @@ -43532,13 +43443,17 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/structure/cable, /obj/structure/table, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "cnB" = ( @@ -46637,9 +46552,8 @@ /turf/open/floor/engine, /area/engine/engineering) "cAu" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -47348,10 +47262,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, +/obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engine_smes) "cDg" = ( @@ -48248,9 +48162,8 @@ /turf/open/floor/plasteel/dark, /area/engine/engineering) "cHj" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 8 }, /obj/structure/cable, /turf/open/floor/plating, @@ -48851,7 +48764,6 @@ /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, -/obj/structure/cable, /obj/machinery/light{ dir = 1 }, @@ -49404,7 +49316,6 @@ dir = 8 }, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/engine, @@ -49612,6 +49523,12 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"fUn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "fXM" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -49735,7 +49652,6 @@ /area/vacant_room/commissary) "gGJ" = ( /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 5 }, /turf/open/floor/engine, @@ -49761,7 +49677,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "gLd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -49997,7 +49913,6 @@ dir = 4 }, /obj/machinery/computer/camera_advanced/xenobio{ - icon_state = "computer"; dir = 4 }, /obj/effect/turf_decal/tile/purple{ @@ -50316,8 +50231,7 @@ /area/science/xenobiology) "jUW" = ( /obj/machinery/camera/autoname{ - dir = 4; - icon_state = "camera" + dir = 4 }, /obj/structure/cable, /turf/open/floor/plasteel/white, @@ -50538,7 +50452,6 @@ }, /obj/machinery/light, /obj/machinery/camera/autoname{ - icon_state = "camera"; dir = 1 }, /obj/structure/cable, @@ -50678,7 +50591,7 @@ /area/medical/pharmacy) "ljx" = ( /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "lqJ" = ( /obj/structure/table/wood, /obj/item/flashlight/lantern, @@ -50984,11 +50897,11 @@ pixel_y = -2 }, /obj/machinery/button/door{ + id = "xenobiomain"; name = "Containment Blast Doors"; pixel_x = 1; pixel_y = -26; - req_access_txt = "55"; - id = "xenobiomain" + req_access_txt = "55" }, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -51011,6 +50924,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"mYY" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "ndR" = ( /obj/structure/cable, /obj/machinery/photocopier, @@ -51063,6 +50981,10 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"nsn" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) "nsK" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -51437,6 +51359,18 @@ }, /turf/open/space/basic, /area/space) +"oYY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "oZc" = ( /obj/machinery/camera{ c_tag = "Chapel South"; @@ -51451,6 +51385,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"pdB" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/table, +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "pfj" = ( /obj/machinery/power/apc{ areastring = "/area/storage/tools"; @@ -51615,10 +51555,9 @@ /area/security/detectives_office) "pvI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - name = "killroom vent"; - icon_state = "vent_map_siphon_on-2"; dir = 1; - external_pressure_bound = 120 + external_pressure_bound = 120; + name = "killroom vent" }, /turf/open/floor/plasteel/freezer, /area/science/xenobiology) @@ -51927,7 +51866,7 @@ dir = 4 }, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "quT" = ( /obj/structure/lattice, /obj/structure/grille/broken, @@ -52144,6 +52083,7 @@ /obj/item/storage/box/lights/mixed, /obj/item/stack/cable_coil, /obj/item/stack/cable_coil, +/obj/item/stock_parts/cell/emproof, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "sdX" = ( @@ -52396,7 +52336,7 @@ "tiO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "tjy" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -52476,6 +52416,11 @@ /obj/item/storage/toolbox/emergency, /turf/open/floor/plasteel, /area/hallway/primary/port) +"tsM" = ( +/obj/effect/turf_decal/tile/blue, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "tti" = ( /obj/structure/chair/stool{ pixel_y = 8 @@ -52799,13 +52744,15 @@ /turf/open/floor/plasteel, /area/vacant_room/commissary) "uTM" = ( -/obj/machinery/clonepod, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/obj/effect/turf_decal/tile/blue, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "uUy" = ( /turf/open/floor/plasteel, /area/science/mixing) @@ -52876,7 +52823,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "vjm" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, @@ -53180,6 +53127,15 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"wIs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/camera{ + c_tag = "Ward Starboard"; + dir = 8; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "wJU" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -53383,6 +53339,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/xenobiology) +"xzI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "xzN" = ( /obj/machinery/door/airlock/external{ name = "Common Mining Shuttle Bay" @@ -82002,7 +81963,7 @@ bZB caC cjJ cSM -cjd +cSN cSW ckI rdP @@ -82256,8 +82217,8 @@ bVf bGN bYE bCq -bHE -cjJ +bUt +nsn cij cjf cSX @@ -92502,10 +92463,10 @@ bfL boo bqQ bhg -bua +tiO bvn -bwL -bxX +fUn +fUn uTM bua bBJ @@ -92760,7 +92721,7 @@ bom bIq bri bsu -brc +fUn brc bvo bzl @@ -93017,7 +92978,7 @@ boq boq brj tiO -btk +bvn bum vhn bzn @@ -93274,7 +93235,7 @@ tiO tiO tiO tiO -brb +fUn bul vhn bzm @@ -93528,12 +93489,12 @@ bhm bla qsH bpH -bpH -bpH -tiO -tiO +fUn +fUn +brc +brc buq -bvt +vhn bye ljx bBN @@ -93788,7 +93749,7 @@ bpG bqZ brk bsv -bsv +xzI bun bvr bzo @@ -94043,12 +94004,12 @@ cTO qsH bpJ brc -bsN +brc brc btl but bvw -brc +pdB ljx bBP bCZ @@ -94298,11 +94259,11 @@ bkc bfS blo qsH -bpI -brb -bvs -brb -bvs +bpH +brc +brc +brc +brc gHL vhn bvs @@ -94556,11 +94517,11 @@ bfS cTO qsH bpL +mYY brc -bsN +mYY brc -bsN -gHL +oYY vhn brb ljx @@ -94815,8 +94776,8 @@ qsH bpK brd bvu -brd -bvu +wIs +tsM bux bvy ljx diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 712de9c3403..52282c3658a 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2139,7 +2139,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "aiE" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/starboard/fore) "aiF" = ( @@ -4303,7 +4303,7 @@ /area/vacant_room/office) "and" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/vacant_room/office) "ane" = ( @@ -5291,7 +5291,7 @@ /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "apa" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/grimy, /area/vacant_room/office) "apb" = ( @@ -6418,9 +6418,8 @@ /turf/open/space, /area/solar/port/fore) "ark" = ( -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 1 }, /obj/structure/cable, /turf/open/floor/circuit/green, @@ -6486,9 +6485,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 1 }, /obj/structure/cable, /turf/open/floor/circuit/green, @@ -9119,7 +9117,7 @@ }, /area/maintenance/port/fore) "awu" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/maintenance/port/fore) "awv" = ( @@ -9856,7 +9854,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/fore) "axU" = ( @@ -13278,7 +13276,7 @@ /obj/machinery/door/airlock{ id_tag = "AuxCabinA"; name = "Cabin A"; - req_access_txt = "25" + req_one_access_txt = "22;25;26;28;35;37;38;46" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -16315,7 +16313,8 @@ "aKq" = ( /obj/machinery/door/airlock{ id_tag = "AuxCabinB"; - name = "Cabin B" + name = "Cabin B"; + req_one_access_txt = "22;25;26;28;35;37;38;46" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20294,19 +20293,6 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) -"aRB" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/engine/atmos) "aRC" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -20370,7 +20356,7 @@ "aRK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood{ icon_state = "wood-broken5" }, @@ -24702,6 +24688,10 @@ pixel_x = 32 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 2 + }, /turf/open/floor/plasteel, /area/engine/atmos) "aYk" = ( @@ -27445,7 +27435,7 @@ /turf/open/floor/engine/o2, /area/engine/atmos) "bdo" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/fore) "bdp" = ( @@ -63182,7 +63172,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/starboard) "cnh" = ( @@ -63494,14 +63484,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/engineering) -"cnF" = ( -/obj/machinery/requests_console{ - department = "Chapel Office"; - name = "Chapel RC"; - pixel_y = -32 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) "cnG" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -63570,10 +63552,6 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood, /area/library) -"cnP" = ( -/obj/structure/bookcase/manuals/medical, -/turf/open/floor/wood, -/area/library) "cnQ" = ( /obj/structure/bookcase/manuals/engineering, /turf/open/floor/wood, @@ -69614,6 +69592,10 @@ pixel_x = 26 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -3; + pixel_y = 5 + }, /turf/open/floor/plasteel, /area/engine/storage) "czA" = ( @@ -73281,6 +73263,10 @@ pixel_x = 32 }, /obj/effect/turf_decal/bot, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 1; + pixel_y = 3 + }, /turf/open/floor/plasteel, /area/engine/storage) "cFZ" = ( @@ -76986,7 +76972,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port) "cMV" = ( @@ -80114,10 +80100,6 @@ /obj/machinery/light_switch{ pixel_x = 38 }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 26; - pixel_y = 32 - }, /obj/structure/closet/secure_closet/security/med, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -80126,6 +80108,10 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, +/obj/machinery/airalarm{ + pixel_x = 32; + pixel_y = 23 + }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cSP" = ( @@ -80138,11 +80124,19 @@ /obj/machinery/newscaster{ pixel_y = 32 }, +/obj/structure/table/glass, +/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/central) +/area/medical/sleeper) "cSQ" = ( /obj/structure/table, /obj/item/storage/box/gloves{ @@ -80150,31 +80144,35 @@ pixel_y = 3 }, /obj/item/storage/box/beakers, -/obj/item/radio/intercom{ - pixel_y = 26 +/obj/structure/table/glass, +/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/central) -"cSR" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/item/storage/pod{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/machinery/airalarm{ +/obj/machinery/power/apc/highcap/five_k{ + dir = 1; + name = "Medbay Treatment Center APC"; pixel_y = 23 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"cSR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/closet/secure_closet/personal/patient, +/obj/item/radio/intercom{ + pixel_y = 26 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "cSS" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -81244,11 +81242,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, +/obj/structure/table/glass, +/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/central) +/area/medical/sleeper) "cUM" = ( /obj/structure/table/glass, /obj/item/storage/firstaid/brute{ @@ -82221,25 +82227,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/checkpoint/medical) -"cWs" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Security Post - Medical"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/security/checkpoint/medical) -"cWt" = ( -/obj/machinery/newscaster, -/turf/closed/wall, -/area/medical/storage) "cWu" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers{ @@ -82279,13 +82266,18 @@ /area/medical/storage) "cWx" = ( /obj/machinery/light_switch{ - pixel_x = 26; - pixel_y = -38 + pixel_x = -8; + pixel_y = -24 }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = 32; + pixel_y = -24 + }, /turf/open/floor/plasteel/white, /area/medical/storage) "cWy" = ( @@ -82303,10 +82295,6 @@ /obj/machinery/status_display/evac{ pixel_x = 32 }, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -24 - }, /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 8 @@ -83048,27 +83036,37 @@ /turf/open/floor/plating, /area/security/checkpoint/medical) "cXW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "cXX" = ( /obj/structure/sign/departments/medbay/alt{ pixel_x = 32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/structure/table/glass, +/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 }, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "cXY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -83076,27 +83074,12 @@ req_access_txt = "5" }, /obj/effect/turf_decal/stripes/line, -/obj/structure/sign/poster/official/cleanliness{ - pixel_x = -32 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/structure/cable, /turf/open/floor/plasteel, /area/medical/storage) -"cXZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/medical/storage) "cYa" = ( /obj/structure/table/wood, /obj/machinery/microwave{ @@ -83984,28 +83967,23 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cZD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cZE" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/light{ - dir = 4 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -84013,57 +83991,48 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 26; + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "cZF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"cZG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - 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 - }, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel, -/area/medical/medbay/central) -"cZH" = ( -/obj/structure/table/glass, -/obj/machinery/camera{ - c_tag = "Medbay - Sleepers"; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/item/book/manual/wiki/medicine, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/mesh, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"cZI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/area/medical/sleeper) +"cZG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) +"cZH" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"cZI" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "cZJ" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -84074,15 +84043,18 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cZK" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/machinery/light{ dir = 4 }, +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "cZL" = ( /obj/machinery/newscaster{ pixel_x = -32 @@ -84973,18 +84945,22 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "dbq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/sign/poster/official/help_others{ pixel_x = -32 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/machinery/light{ + dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "dbr" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -85010,32 +84986,16 @@ /turf/open/floor/plasteel, /area/medical/medbay/central) "dbt" = ( -/obj/effect/landmark/start/medical_doctor, -/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/medbay/central) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "dbu" = ( -/obj/structure/mirror{ - pixel_x = 26 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "dbv" = ( /obj/structure/chair/stool, /obj/effect/turf_decal/tile/neutral{ @@ -86017,6 +85977,7 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "ddd" = ( @@ -86048,33 +86009,23 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/medical/medbay/central) -"ddf" = ( -/obj/machinery/holopad{ - pixel_y = 16 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/medical/medbay/central) "ddg" = ( -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, /obj/structure/extinguisher_cabinet{ pixel_x = 26 }, +/obj/machinery/stasis, +/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/central) +/area/medical/sleeper) "ddh" = ( /obj/structure/table/wood, /obj/item/folder/white, @@ -86775,6 +86726,7 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "deA" = ( @@ -86788,37 +86740,41 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/checkpoint/medical) -"deC" = ( -/obj/effect/turf_decal/stripes/end{ +"deD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/stasis, -/turf/open/floor/plasteel, -/area/medical/medbay/central) -"deD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "deE" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/sleeper) "deF" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, /obj/machinery/light{ dir = 4 }, -/obj/machinery/stasis, -/turf/open/floor/plasteel, -/area/medical/medbay/central) +/obj/structure/table/glass, +/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/sleeper) "deG" = ( /obj/structure/table/wood, /obj/item/storage/pill_bottle/dice, @@ -87358,6 +87314,7 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/checkpoint/medical) "dfF" = ( @@ -87378,10 +87335,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"dfH" = ( -/obj/structure/sign/departments/examroom, -/turf/closed/wall, -/area/medical/medbay/central) "dfI" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line, @@ -88271,22 +88224,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"dhl" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dhm" = ( @@ -88299,14 +88241,16 @@ network = list("ss13","medbay") }, /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dhn" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ - dir = 1 + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -88324,7 +88268,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, /area/medical/medbay/central) "dhp" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -88577,7 +88524,7 @@ dir = 8 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/dark, /area/crew_quarters/abandoned_gambling_den) "dhN" = ( @@ -90128,10 +90075,12 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dky" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dkz" = ( @@ -90758,18 +90707,18 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/maintenance/department/medical/central) +/area/medical/chemistry) "dlV" = ( /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dlW" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dlX" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dlY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -91218,62 +91167,52 @@ }, /area/maintenance/department/medical/central) "dnl" = ( -/obj/machinery/clonepod, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/status_display/evac{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dnm" = ( -/obj/machinery/computer/cloning, /obj/machinery/light{ dir = 1 }, /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dnn" = ( -/obj/machinery/dna_scannernew, /obj/machinery/airalarm{ pixel_y = 22 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/wardrobe/mixed, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dno" = ( /obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/blue{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dnp" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/blue{ - dir = 4 + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dnq" = ( /obj/structure/table/glass, /obj/item/storage/box/bodybags{ @@ -91282,27 +91221,25 @@ }, /obj/item/storage/box/bodybags, /obj/item/pen, -/obj/effect/turf_decal/tile/purple{ - dir = 4 +/obj/effect/turf_decal/tile/blue{ + dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dnr" = ( /obj/structure/table/glass, /obj/machinery/power/apc/highcap/five_k{ - areastring = "/area/medical/genetics/cloning"; dir = 1; - name = "Cloning Lab APC"; + name = "Ward APC"; pixel_y = 23 }, /obj/item/folder/white, -/obj/item/book/manual/wiki/medical_cloning, /obj/effect/turf_decal/tile/blue{ dir = 4 }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dns" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ @@ -91533,7 +91470,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel, /area/maintenance/starboard/aft) "dnN" = ( @@ -92285,32 +92222,14 @@ /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dpm" = ( -/obj/machinery/door/window/eastleft, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/machinery/shower{ - dir = 4; - name = "emergency shower" - }, -/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{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"dpn" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) +"dpn" = ( +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dpo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -92322,8 +92241,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dpp" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -92338,8 +92257,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dpq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -92354,28 +92273,24 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dpr" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dps" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ - id_tag = "cloningfoyer"; - name = "Cloning Lab"; + name = "Ward"; req_access_txt = "5" }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -92387,7 +92302,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dpt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -92597,7 +92512,7 @@ "dpQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/crew_quarters/abandoned_gambling_den) "dpR" = ( @@ -92818,6 +92733,7 @@ dir = 8; pixel_y = 1 }, +/obj/item/toy/figure/geneticist, /turf/open/floor/plasteel/dark, /area/science/genetics) "dqn" = ( @@ -93150,6 +93066,9 @@ /area/hallway/primary/aft) "dqU" = ( /obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -93202,31 +93121,22 @@ }, /area/maintenance/department/medical/central) "dqZ" = ( -/obj/machinery/door/window/eastright, /obj/machinery/status_display/ai{ pixel_x = -32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, /obj/machinery/light/small{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"dra" = ( -/obj/effect/turf_decal/tile/purple{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) +"dra" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "drb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -93241,8 +93151,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "drc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -93257,8 +93167,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "drd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -93274,8 +93186,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dre" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -93290,25 +93202,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "drf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "drg" = ( /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "cloningfoyer"; - name = "Cloning Lab"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -93318,8 +93226,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/door/airlock/medical/glass{ + name = "Ward"; + req_access_txt = "5" + }, /turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "drh" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -93865,96 +93777,57 @@ /area/maintenance/department/medical/central) "dsp" = ( /obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dsq" = ( -/obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) "dsr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/blue, -/obj/structure/cable, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dss" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue, -/obj/machinery/power/apc/auto_name/south, -/obj/structure/cable, +/obj/structure/girder, /turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dst" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/machinery/camera{ + c_tag = "Medbay - Ward"; + dir = 4; + name = "medbay camera"; + network = list("ss13","medbay") }, -/obj/item/radio/intercom{ - pixel_x = -26 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"dsu" = ( -/obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dsv" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dsw" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dsx" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dsy" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dsz" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = 7; - pixel_y = -26 +/obj/machinery/light{ + dir = 4 }, -/obj/machinery/light, -/obj/machinery/light_switch{ - pixel_x = 7; - pixel_y = -38 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/camera{ - c_tag = "Medbay - Cloning Lab"; - dir = 1; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/purple, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dsA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/purple{ @@ -94431,44 +94304,20 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "dtA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Genetics Desk Maintenance"; - req_access_txt = "9" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/structure/cable, -/turf/open/floor/plasteel, +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating, /area/maintenance/department/medical/central) "dtB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, /area/maintenance/department/medical/central) "dtC" = ( /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) -"dtD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"dtE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Cloning Storage"; - req_access_txt = "9, 5" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dtG" = ( /obj/machinery/power/apc{ areastring = "/area/medical/medbay/central"; @@ -95132,131 +94981,57 @@ "dvb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dvc" = ( -/turf/closed/wall, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/spawner/lootdrop/donkpockets, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) "dvd" = ( -/obj/item/twohanded/required/kirbyplants/random, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 }, -/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics) -"dve" = ( -/obj/structure/extinguisher_cabinet{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dvf" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, /obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dvg" = ( -/obj/machinery/newscaster{ - pixel_y = 32 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) "dvh" = ( -/obj/structure/table/glass, -/obj/item/storage/box/beakers{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/obj/item/storage/box/masks, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dvi" = ( /obj/machinery/status_display/evac, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) -"dvj" = ( -/obj/item/radio/intercom{ - pixel_y = 26 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/bed, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dvk" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dvm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/bed, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dvn" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dvo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dvp" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/bed, +/obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dvq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geneticslab"; - name = "Genetics Lab Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dvr" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -95919,34 +95694,20 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - name = "Genetics Junction"; - sortType = 23 +/obj/structure/disposalpipe/junction{ + dir = 1 }, -/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dwG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/research{ - name = "Cloning Desk"; - req_access_txt = "9, 5" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/medical/genetics) +/turf/closed/wall, +/area/maintenance/department/medical/central) "dwH" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -95954,9 +95715,11 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dwI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -95964,11 +95727,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dwJ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -95987,8 +95751,9 @@ dir = 8 }, /obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dwK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -96004,33 +95769,24 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dwL" = ( -/obj/structure/table/glass, -/obj/item/clipboard, -/obj/item/toy/figure/geneticist, -/obj/machinery/power/apc{ - areastring = "/area/medical/genetics"; - dir = 4; - name = "Genetics Lab APC"; - pixel_x = 24 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) "dwM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dwN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -96038,37 +95794,23 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dwO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dwP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dwQ" = ( -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dwR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dwS" = ( -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dwT" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dwV" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -96451,7 +96193,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plasteel/dark, /area/crew_quarters/abandoned_gambling_den) "dxH" = ( @@ -96637,31 +96379,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dyi" = ( -/obj/structure/table/glass, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -23 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/folder/white, -/obj/item/storage/box/disks, -/obj/machinery/camera{ - c_tag = "Medbay - Genetics Desk"; - dir = 4; - name = "medbay camera"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) "dyj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -96678,8 +96395,11 @@ dir = 8 }, /obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dyk" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -96697,9 +96417,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dyl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -96707,15 +96427,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) "dym" = ( -/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -96728,15 +96443,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, -/obj/machinery/door/airlock/research{ - name = "Cloning Storage"; - req_access_txt = "9, 5" +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Ward Maintenance"; + req_access_txt = "5" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dyn" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -96747,9 +96461,8 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dyo" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -96757,61 +96470,33 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dyp" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dyq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/bed, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dyr" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dys" = ( /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/closet/secure_closet/personal/patient{ - anchored = 1 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"dyv" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) +/area/medical/medbay/zone2) "dyw" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -97458,48 +97143,21 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) -"dzM" = ( -/obj/structure/sign/departments/science{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel, -/area/hallway/primary/aft) "dzN" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geneticsdesk"; - name = "Genetics Desk Shutters" - }, -/obj/machinery/door/window/westright{ - dir = 4; - name = "Cloning Desk"; - req_access_txt = "9" - }, -/obj/machinery/door/window/westright{ - name = "Cloning Desk" - }, -/obj/item/folder/white, -/obj/item/pen, -/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dzO" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dzP" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -97515,8 +97173,9 @@ dir = 8 }, /obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dzQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -97531,31 +97190,30 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/medical/genetics) -"dzR" = ( -/obj/item/twohanded/required/kirbyplants/random, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"dzS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geneticslab"; - name = "Genetics Lab Shutters" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/maintenance/department/medical/central) +"dzR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dzV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dzY" = ( /obj/structure/disposalpipe/segment, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dAa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/camera{ @@ -97969,65 +97627,39 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/robotics/lab) -"dAQ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geneticsdesk"; - name = "Genetics Desk Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/medical/genetics) "dAR" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/button/door{ - id = "geneticsdesk"; - name = "Genetics Desk Shutters"; - pixel_x = -26; - pixel_y = -26; - req_access_txt = "9" +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" }, -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/maintenance/department/medical/central) "dAS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, /obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) "dAT" = ( /obj/item/radio/intercom{ pixel_y = -26 }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dAU" = ( -/obj/machinery/vending/wardrobe/gene_wardrobe, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/medical/central) "dAV" = ( /obj/machinery/status_display/ai, /turf/closed/wall/r_wall, -/area/medical/genetics/cloning) -"dAW" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/bed, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dAX" = ( /obj/structure/sign/warning/nosmoking{ pixel_y = -32 @@ -98039,7 +97671,7 @@ anchored = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dAY" = ( /obj/structure/extinguisher_cabinet{ pixel_y = -32 @@ -98051,7 +97683,7 @@ anchored = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dBa" = ( /obj/structure/mirror{ pixel_y = -33 @@ -98061,7 +97693,7 @@ }, /obj/machinery/light, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dBb" = ( /obj/machinery/newscaster{ pixel_y = -32 @@ -98074,27 +97706,22 @@ }, /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dBc" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "dBd" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "geneticslab"; - name = "Genetics Lab Shutters" - }, /obj/structure/sign/warning/electricshock{ pixel_y = -32 }, -/obj/structure/cable, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "dBe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/sign/poster/official/do_not_question{ @@ -98231,6 +97858,8 @@ /obj/machinery/vending/wallmed{ pixel_y = 32 }, +/obj/structure/table/glass, +/obj/item/stack/medical/gauze, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) "dBp" = ( @@ -98744,7 +98373,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ name = "Morgue"; - req_access_txt = "9" + req_access_txt = "5;6" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line, @@ -99579,7 +99208,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/item/twohanded/required/kirbyplants/random, +/obj/machinery/stasis, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) "dEe" = ( @@ -102509,7 +102138,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/crew_quarters/theatre/abandoned) "dJu" = ( @@ -102592,7 +102221,7 @@ /turf/open/floor/wood, /area/security/detectives_office/private_investigators_office) "dJE" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/security/detectives_office/private_investigators_office) "dJF" = ( @@ -106883,7 +106512,7 @@ dir = 4 }, /obj/structure/cable, -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/plating, /area/maintenance/port/aft) "dRH" = ( @@ -107934,7 +107563,7 @@ /turf/open/floor/plasteel/dark, /area/medical/virology) "dUc" = ( -/mob/living/simple_animal/cockroach, +/mob/living/simple_animal/hostile/cockroach, /turf/open/floor/wood, /area/library/abandoned) "dUd" = ( @@ -113715,6 +113344,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"eCA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "eCM" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -113928,6 +113563,15 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/gravity_generator) +"gaK" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "gbV" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1 @@ -113948,6 +113592,16 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"gvO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "gCK" = ( /turf/closed/wall, /area/maintenance/department/science) @@ -113969,6 +113623,20 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"gIO" = ( +/obj/structure/table/glass, +/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/sleeper) "gJw" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -114041,6 +113709,16 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/research) +"gPx" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "gQS" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -114145,6 +113823,13 @@ }, /turf/open/floor/plasteel/dark, /area/security/nuke_storage) +"hue" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "huX" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -114159,6 +113844,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/port) +"hFL" = ( +/obj/machinery/stasis, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/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/sleeper) "hFX" = ( /obj/structure/table/reinforced, /obj/item/storage/box/monkeycubes, @@ -114290,6 +113990,13 @@ "inw" = ( /turf/closed/wall, /area/maintenance/department/medical/central) +"iqc" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/wardrobe/pjs, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "itc" = ( /obj/structure/lattice/catwalk, /obj/structure/disposalpipe/segment{ @@ -114316,6 +114023,10 @@ /obj/machinery/light{ dir = 4 }, +/obj/item/storage/pod{ + pixel_x = 8; + pixel_y = 32 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "iBH" = ( @@ -114354,6 +114065,31 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"iLj" = ( +/obj/structure/table/glass, +/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 + }, +/obj/item/reagent_containers/chem_pack{ + pixel_x = 10; + pixel_y = 10 + }, +/obj/item/storage/box/rxglasses{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/stack/medical/gauze{ + pixel_x = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "iQh" = ( /obj/structure/bodycontainer/morgue{ dir = 1 @@ -114370,6 +114106,13 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"iRl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/iv_drip, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "iTj" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 6 @@ -114402,6 +114145,14 @@ }, /turf/open/floor/plasteel, /area/medical/surgery/room_b) +"jac" = ( +/obj/machinery/power/apc/auto_name/east, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/department/medical/central) "jdO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -114553,6 +114304,10 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"jNU" = ( +/obj/structure/sign/departments/examroom, +/turf/closed/wall, +/area/medical/sleeper) "jRy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -114573,6 +114328,14 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) +"jZH" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "kam" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -114648,6 +114411,11 @@ }, /turf/closed/wall/r_wall, /area/crew_quarters/heads/hor) +"kxT" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "kyo" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -114662,6 +114430,14 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"kzm" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "kEN" = ( /obj/effect/decal/cleanable/dirt, /turf/closed/wall, @@ -114848,6 +114624,20 @@ }, /turf/open/floor/engine, /area/science/mixing/chamber) +"lzM" = ( +/obj/machinery/door/airlock/security{ + name = "Security Post - Medbay"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/checkpoint/medical) "lEl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -114977,19 +114767,19 @@ /turf/open/floor/plasteel, /area/science/misc_lab/range) "mbO" = ( -/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{ +/obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/plasteel, -/area/medical/medbay/central) +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -115238,6 +115028,21 @@ /obj/structure/lattice, /turf/closed/wall/r_wall, /area/engine/gravity_generator) +"nyX" = ( +/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/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/medical/medbay/central) "nBr" = ( /turf/closed/wall/r_wall, /area/engine/storage_shared) @@ -115268,10 +115073,39 @@ /obj/structure/cable, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"nMu" = ( +/obj/structure/table/glass, +/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 + }, +/obj/item/stack/medical/suture, +/obj/item/stack/medical/mesh, +/obj/machinery/camera{ + c_tag = "Medbay - Treatment Center"; + name = "medbay camera"; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "nOg" = ( /obj/structure/lattice, /turf/open/space, /area/space) +"nQW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/landmark/start/paramedic, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "nSh" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/closed/wall/r_wall, @@ -115338,6 +115172,13 @@ /obj/machinery/dna_scannernew, /turf/open/floor/plasteel/dark, /area/science/genetics) +"oGH" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/effect/turf_decal/trimline/blue/end, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "oHC" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -115378,6 +115219,12 @@ /obj/effect/mapping_helpers/airlock/locked, /turf/open/floor/engine, /area/science/mixing/chamber) +"oKQ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "oMw" = ( /obj/docking_port/stationary/public_mining_dock{ dir = 4 @@ -115592,6 +115439,12 @@ heat_capacity = 1e+006 }, /area/vacant_room/commissary) +"pBM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/closed/wall, +/area/medical/sleeper) "pCE" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -115637,6 +115490,10 @@ }, /turf/open/floor/plasteel, /area/engine/storage_shared) +"qdq" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/medical/sleeper) "qdJ" = ( /obj/machinery/nanite_programmer, /obj/effect/turf_decal/bot, @@ -115747,6 +115604,33 @@ }, /turf/open/space/basic, /area/space) +"qFL" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"qJK" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Treatment Center"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/medical/sleeper) "qKq" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -115984,6 +115868,10 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) +"rWh" = ( +/obj/structure/bed/roller, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "saw" = ( /turf/closed/wall/r_wall, /area/science/misc_lab/range) @@ -116190,10 +116078,6 @@ }, /turf/open/floor/plasteel, /area/engine/gravity_generator) -"tHN" = ( -/obj/machinery/firealarm, -/turf/closed/wall/r_wall, -/area/medical/genetics/cloning) "tMk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -116217,6 +116101,23 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/vacant_room/commissary) +"tWK" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall, +/area/medical/sleeper) +"ugX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "ukr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -116276,6 +116177,22 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/maintenance/port/fore) +"uqb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/girder, +/turf/open/floor/plasteel, +/area/maintenance/department/medical/central) +"uvc" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "uxC" = ( /obj/structure/cable, /turf/open/floor/plasteel/white, @@ -116290,6 +116207,37 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) +"uFG" = ( +/obj/structure/table/glass, +/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 + }, +/obj/machinery/light_switch{ + pixel_x = -8; + pixel_y = -24 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"uHV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "uMN" = ( /obj/structure/table, /obj/item/stack/packageWrap, @@ -116332,6 +116280,12 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/science/xenobiology) +"uTS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "uYa" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -116354,6 +116308,10 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"uZU" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "vko" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -116449,6 +116407,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/engine/storage_shared) +"vEx" = ( +/obj/machinery/firealarm, +/turf/closed/wall, +/area/medical/medbay/zone2) "vFc" = ( /turf/closed/wall, /area/medical/surgery/room_b) @@ -116494,6 +116456,9 @@ }, /turf/open/space/basic, /area/space/nearstation) +"vTA" = ( +/turf/closed/wall, +/area/medical/sleeper) "vVy" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/pinpointer_dispenser, @@ -116580,6 +116545,13 @@ }, /turf/closed/wall/r_wall, /area/science/nanite) +"wqd" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "wAA" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -116673,6 +116645,17 @@ }, /turf/open/floor/plasteel/dark, /area/science/nanite) +"wXT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 26 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) "wZq" = ( /obj/effect/landmark/start/medical_doctor, /obj/structure/cable, @@ -116739,6 +116722,17 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"xAi" = ( +/obj/machinery/stasis, +/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/sleeper) "xAW" = ( /obj/effect/turf_decal/delivery, /obj/machinery/computer/shuttle/mining/common, @@ -116762,6 +116756,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"xFp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "xHZ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -141665,7 +141665,7 @@ chx cjj cjn clZ -cnF +car car cqw car @@ -143164,7 +143164,7 @@ aLu aMG aOm aPR -aRB +aRw aTc aUV aWM @@ -148861,7 +148861,7 @@ chS cjt ckR cms -cnP +cqN cpu cqP cmt @@ -156098,7 +156098,7 @@ dtz dvb dwF dyh -dzM +dvb dvb dCx dDH @@ -156352,11 +156352,11 @@ dpg inw inw inw -dvc +inw dwG -dvc -din -dgR +inw +inw +inw dCy dCy dCy @@ -156603,17 +156603,17 @@ dcM dgU dip dba -inw +dcM dng dph dqU dso -inw +uqb dvd dwH dvc dzN -dAQ +dzR dCy dDI dER @@ -156860,15 +156860,15 @@ dfw dgV diq dkg -inw +dcM dnh dpi dqV dsp -inw -dve +dsp +dsp dwI -dyi +uqb dzO dAR dCy @@ -157117,7 +157117,7 @@ den dgW dir dkh -inw +dcM dni dpj dqW @@ -157631,12 +157631,12 @@ dfy dgY den dkj -inw +dcM dnk dpl dqY dss -inw +jac dvh dwL dyl @@ -157888,16 +157888,16 @@ dcS dgZ dcS dkk +dcM dlV dlV dlV -dlV -dlV +vEx dtC dvi dwM dym -dzS +dtC dAV dCB tGU @@ -158145,17 +158145,17 @@ dfz dha dit dkl -dlV +dcM dnl dpm dqZ dst -dtC -dvj +iqc +dpm dwN dyn dsw -dAW +dpm dCB dDN dEW @@ -158402,16 +158402,16 @@ dcM dhb diu dkm -dlV +dcM dnm dpn dra -dsu -dtC -dvk +dpn +dra +dpn dwO dyo -dwS +dra dAX dCB tGU @@ -158663,9 +158663,9 @@ dlV dnn dpo drb -dsv -tHN -dvo +dpn +dpn +dpn dwP dyp dzV @@ -158920,13 +158920,13 @@ dlW dno dpo drc -dsw -dtD -dvm -dwQ -dyq -dwS -dAW +dpn +dra +dpn +dra +dyo +dra +dpm dCB dDP dEX @@ -159178,11 +159178,11 @@ dnp dpp drd dsx -dtE -dvn -dwR +dsx +dsx +dsx dyr -dwS +dpn dBa dCB dDQ @@ -159434,10 +159434,10 @@ dlW dnq dpq dre -dsy -dtD -dvo -dwS +dpn +dra +dpn +dra dys dzY dBb @@ -159692,11 +159692,11 @@ dnr dpr drf dsz -dtC +xFp +dvp +dvp dvp -dwT dvp -dwT dBc dCC dDR @@ -159950,10 +159950,10 @@ dps drg dlW dtC -dvq -dvq -dvq -dvq +dlW +dlW +dlW +dlW dBd dCC dDS @@ -160209,7 +160209,7 @@ dsA dtG dsA dwV -dyv +dwV dsA dBe dCD @@ -161484,8 +161484,8 @@ ddc dez dfE dhk -diy -dkv +nyX +kxT cPy dnw dpw @@ -161740,7 +161740,7 @@ cUG ddd deA cUG -dhl +dhp diG dkw cNz @@ -161990,9 +161990,9 @@ cPC cRd cRc cUK -cWs +cUG cXV -cRc +lzM cRc cUG cUG @@ -162244,16 +162244,16 @@ cKL cMk cNI cHW -cPy +vTA cSP cUL -cWm +hFL cXW cZF dbq -cWm -cWm -dfF +xAi +gIO +vTA dhn diz dkp @@ -162501,16 +162501,16 @@ cKM cMh cNJ cHW -cPy +vTA cSQ -cQU -cQT -cSE +nQW +jZH +ugX cZG mbO -cQT -cQU -cNA +gPx +gIO +qdq dho diy dkx @@ -162758,18 +162758,18 @@ cKH cMg cHW cHW -cPy +vTA cSR -cPv -cPv +oKQ +dbu cXX -cUF -cWn -cWn -cWn -dfG -dhh -diH +iLj +gvO +gaK +iRl +qdq +dhj +dbs dky dfG dnz @@ -163018,13 +163018,13 @@ cNK cRe cSS cSS -cWt cRe -cNz -dbr -dbr -cNz -dfH +cRe +nMu +gvO +uTS +rWh +jNU dhj diy dkz @@ -163278,10 +163278,10 @@ cUM cWu cRe cZH -cPo -cXI -deC -cNz +qFL +dbt +uZU +qdq dhp diJ dkA @@ -163535,11 +163535,11 @@ cRg cWv cXY cZI -dbs -dde +uHV +uvc deD -dfI -dhk +qJK +kzm diy dkv dma @@ -163791,11 +163791,11 @@ cSU cRh cWw cSS -cZJ -dbt -ddf +oKQ +eCA +uZU deE -cNA +qdq dhj dbs dkv @@ -164047,12 +164047,12 @@ cRi cSV cUN cWx -cXZ -cPv -cQU -cQT -cXO -cNA +cRe +oGH +hue +wqd +uFG +vTA dhj diy dkv @@ -164306,10 +164306,10 @@ cUO cWy cRe cZK -dbu +wXT ddg deF -cNz +vTA dhj diz dkv @@ -164562,11 +164562,11 @@ cNK cNK cRe cRe -cPy -cPy -cPy -cPy -cND +vTA +vTA +vTA +pBM +tWK dhp diL dkB diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 0c1fa9799ca..079cbc7b9d7 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -2493,13 +2493,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"agb" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "aishuttersexternal"; - name = "AI privacy shutters" - }, -/turf/open/space/basic, -/area/space) "agc" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate{ @@ -2795,7 +2788,6 @@ /turf/open/floor/plasteel/white, /area/science/lab) "agI" = ( -/obj/structure/filingcabinet/chestdrawer, /obj/machinery/requests_console{ announcementConsole = 1; department = "Research Director's Desk"; @@ -2805,6 +2797,7 @@ pixel_y = 30; receive_ore_updates = 1 }, +/obj/machinery/computer/aifixer, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "agJ" = ( @@ -4189,13 +4182,13 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "akI" = ( -/obj/item/twohanded/required/kirbyplants/dead, /obj/machinery/button/door{ id = "rdprivacy"; name = "Privacy Shutters Control"; pixel_x = 26; pixel_y = -26 }, +/obj/item/twohanded/required/kirbyplants/dead, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "akK" = ( @@ -11787,14 +11780,14 @@ /area/medical/storage) "aFN" = ( /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aFO" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aFR" = ( /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aFT" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -11888,21 +11881,25 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "aGf" = ( -/obj/machinery/dna_scannernew, /obj/machinery/airalarm{ dir = 4; pixel_x = -23 }, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGg" = ( -/obj/machinery/computer/cloning, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGh" = ( -/obj/machinery/clonepod, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGk" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/bot, @@ -11973,7 +11970,7 @@ /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGx" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -11991,7 +11988,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGB" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -12013,7 +12010,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGE" = ( /turf/closed/wall/r_wall, /area/medical/virology) @@ -12046,14 +12043,14 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGK" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGL" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -12065,26 +12062,18 @@ /area/medical/medbay/central) "aGM" = ( /obj/structure/table, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, /obj/machinery/firealarm{ dir = 4; pixel_x = -24 }, -/obj/machinery/requests_console{ - department = "Genetics"; - name = "Genetics Requests Console"; - pixel_y = -30 - }, /obj/machinery/camera{ - c_tag = "Medical - Cloning Bay"; + c_tag = "Medical - Corpse Disposal"; dir = 1; network = list("ss13","Medical") }, -/obj/item/toy/figure/geneticist, +/obj/item/storage/box/bodybags, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aGN" = ( /obj/structure/table, /obj/item/storage/box/donkpockets{ @@ -12443,8 +12432,9 @@ /area/medical/genetics) "aIa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aIc" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -15354,12 +15344,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/starboard) -"aQD" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) "aQE" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -17817,7 +17801,7 @@ "aXy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "aXz" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -18051,8 +18035,8 @@ }, /area/medical/genetics) "aYg" = ( -/mob/living/carbon/monkey, /obj/effect/landmark/start/geneticist, +/mob/living/carbon/monkey, /turf/open/floor/plasteel, /area/medical/genetics) "aYh" = ( @@ -19704,9 +19688,6 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "bcm" = ( -/obj/machinery/light{ - dir = 1 - }, /obj/effect/landmark/event_spawn, /turf/open/floor/engine, /area/science/explab) @@ -20381,6 +20362,9 @@ /area/medical/virology) "bef" = ( /obj/effect/landmark/blobstart, +/obj/machinery/light{ + dir = 1 + }, /turf/open/floor/engine, /area/science/explab) "beg" = ( @@ -20531,7 +20515,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "bey" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -20544,12 +20528,8 @@ /area/medical/virology) "beA" = ( /obj/machinery/door/airlock/medical/glass{ - id_tag = "GeneticsDoor"; - name = "Genetics"; - req_access_txt = "5; 68" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 + name = "Corpse Disposal"; + req_access_txt = "5" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20559,7 +20539,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "beB" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -21986,6 +21966,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/item/toy/figure/geneticist{ + pixel_x = -6; + pixel_y = 3 + }, /turf/open/floor/plasteel/white, /area/medical/genetics) "bhV" = ( @@ -37105,12 +37089,6 @@ /obj/structure/closet/crate{ name = "Surplus Genetics Supplies" }, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, /obj/item/storage/box/rxglasses, /obj/item/storage/box/rxglasses, /turf/open/floor/plating, @@ -38819,7 +38797,7 @@ dir = 8 }, /obj/item/toy/figure/mime, -/obj/item/gun/magic/wand, +/obj/item/gun/magic/wand/nothing, /turf/open/floor/carpet, /area/crew_quarters/theatre) "cad" = ( @@ -39363,7 +39341,7 @@ dir = 4 }, /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ dir = 4 @@ -39372,7 +39350,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -39382,7 +39360,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbL" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -39392,7 +39370,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -39460,7 +39438,7 @@ pixel_y = -32 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbS" = ( /obj/structure/closet/wardrobe/white, /obj/structure/disposalpipe/segment{ @@ -39470,7 +39448,7 @@ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "cbT" = ( /obj/machinery/door/airlock/maintenance{ req_one_access_txt = "12;22;25;26;28;35;37;38;46" @@ -41884,13 +41862,11 @@ /obj/item/radio/intercom{ pixel_y = 29 }, -/obj/machinery/computer/aifixer{ - dir = 4 - }, /obj/machinery/camera{ c_tag = "Research - Research Director's Office"; network = list("ss13","Research") }, +/obj/structure/filingcabinet/chestdrawer, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/hor) "eRe" = ( @@ -44638,9 +44614,8 @@ /turf/open/floor/plating, /area/crew_quarters/heads/chief) "kAU" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 8 }, /obj/machinery/camera{ c_tag = "Engine -Emitters Right"; @@ -45460,9 +45435,8 @@ /turf/open/floor/plasteel, /area/engine/engineering) "mHo" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 8 }, /obj/structure/cable, /turf/open/floor/plating, @@ -46601,6 +46575,10 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/processing) +"oLR" = ( +/obj/effect/landmark/start/geneticist, +/turf/open/floor/plasteel/white, +/area/medical/genetics) "oMf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/components/binary/pump{ @@ -47067,9 +47045,8 @@ /turf/open/floor/plating, /area/maintenance/port) "pLI" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -47233,8 +47210,7 @@ "pYp" = ( /obj/structure/table, /obj/machinery/power/apc{ - areastring = "/area/medical/genetics/cloning"; - name = "Cloning Bay APC"; + name = "Corpse Disposal APC"; pixel_y = -23 }, /obj/structure/window/reinforced{ @@ -47246,7 +47222,7 @@ name = "Why can't I hold all these corpses? - Proper Corpse Disposal 101" }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/medbay/zone2) "pZA" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -49625,9 +49601,8 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "vbr" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/machinery/camera{ c_tag = "Engine - Emitters Left"; @@ -74466,12 +74441,12 @@ aBe aJE bLU aKp -aBU +oLR aGn bhT aFO aGg -aQD +aFR cbK pYp aGR @@ -90228,7 +90203,7 @@ aaa aaa aaa avP -agb +aaa bMO aug bMO diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 56902361956..54e40168596 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -6097,7 +6097,7 @@ dir = 8 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "ajZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -6297,7 +6297,7 @@ /obj/structure/flora/junglebush/b, /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "akr" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -8124,7 +8124,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "ane" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -9930,7 +9930,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "apX" = ( /turf/closed/wall/rust, /area/maintenance/central) @@ -10146,7 +10146,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aqp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, @@ -10469,7 +10469,7 @@ /obj/structure/cable, /obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aqQ" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -11531,7 +11531,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "ast" = ( /obj/structure/chair/pew/left{ dir = 8 @@ -12428,7 +12428,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "atN" = ( /obj/structure/flora/tree/jungle/small, /obj/structure/disposalpipe/segment{ @@ -12436,7 +12436,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "atO" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -12465,7 +12465,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "atR" = ( /obj/structure/flora/grass/jungle, /obj/structure/flora/ausbushes/fernybush, @@ -12475,11 +12475,11 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "atS" = ( /obj/structure/cable, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "atT" = ( /turf/closed/wall/r_wall, /area/bridge) @@ -12905,7 +12905,7 @@ /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "auB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -13482,7 +13482,7 @@ }, /obj/structure/cable, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "avy" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -13516,7 +13516,7 @@ /obj/effect/turf_decal/delivery, /obj/structure/cable, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "avC" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -13542,7 +13542,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "avD" = ( /obj/effect/turf_decal/tile/red{ dir = 4 @@ -13604,7 +13604,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "avH" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -13637,7 +13637,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "avJ" = ( /obj/machinery/door/firedoor, /obj/machinery/light/small{ @@ -13674,7 +13674,7 @@ dir = 4 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "avM" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -14333,6 +14333,14 @@ /obj/machinery/light_switch{ pixel_x = 24 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 5 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "awD" = ( @@ -14554,7 +14562,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/structure/cable, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "awZ" = ( /turf/closed/wall/rust, /area/security/checkpoint/engineering) @@ -14586,7 +14594,6 @@ /obj/structure/disposalpipe/junction/yjunction{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/medical/morgue) "axe" = ( @@ -15094,6 +15101,10 @@ /obj/item/grenade/chem_grenade/smart_metal_foam{ pixel_x = -2 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 6; + pixel_y = -6 + }, /turf/open/floor/plasteel/dark, /area/engine/engineering) "axQ" = ( @@ -15887,12 +15898,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, /obj/machinery/door/airlock/medical/glass{ - name = "Cloning Storage"; - req_access_txt = "5; 9; 68" + name = "Ward"; + req_access_txt = "5" }, /obj/structure/cable, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "azg" = ( /obj/structure/table, /obj/item/hand_labeler, @@ -15913,7 +15924,6 @@ pixel_y = 2 }, /obj/structure/disposalpipe/segment, -/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/medical/morgue) "azi" = ( @@ -16461,7 +16471,6 @@ req_access_txt = "5" }, /obj/structure/disposalpipe/segment, -/obj/structure/cable, /turf/open/floor/plasteel/dark, /area/medical/morgue) "aAa" = ( @@ -16970,9 +16979,8 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aAL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -17012,20 +17020,14 @@ dir = 1 }, /obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/power/apc/unlocked{ - areastring = "/area/medical/genetics/cloning"; - dir = 4; - name = "Cloning Lab APC"; - pixel_x = 24 - }, /obj/machinery/camera{ - c_tag = "Cloning Lab"; + c_tag = "Medbay Aux Storage"; name = "medical camera"; network = list("ss13","medical") }, -/obj/structure/cable, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aAP" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -17209,7 +17211,7 @@ "aBi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aBj" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -17451,12 +17453,12 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/machinery/computer/cloning, /obj/item/radio/intercom{ pixel_y = 22 }, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aBB" = ( /obj/structure/flora/grass/jungle, /obj/structure/beebox, @@ -18194,15 +18196,11 @@ dir = 8 }, /obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Cloning Lab"; - req_access_txt = "5;68" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 + name = "Storage"; + req_access_txt = "5" }, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aCJ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/blood/old, @@ -19575,7 +19573,7 @@ pixel_x = -23 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aFc" = ( /turf/open/floor/engine/co2, /area/engine/atmos) @@ -19786,7 +19784,7 @@ dir = 4 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aFu" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -19824,7 +19822,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aFy" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -22636,7 +22634,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aJV" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -23331,7 +23329,7 @@ "aKV" = ( /obj/structure/flora/junglebush/c, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aKW" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -24033,7 +24031,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aMe" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -24405,16 +24403,13 @@ /area/engine/atmos) "aME" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, /obj/machinery/door/airlock/medical{ - name = "Cloning Lab"; - req_access_txt = "5;68" + name = "Storage"; + req_access_txt = "5" }, /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aMF" = ( /obj/machinery/button/ignition{ id = "Incinerator"; @@ -24964,9 +24959,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aNt" = ( -/turf/closed/wall/r_wall/rust, -/area/medical/genetics/cloning) "aNu" = ( /turf/closed/wall, /area/medical/morgue) @@ -24975,10 +24967,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/delivery, -/obj/machinery/clonepod, +/obj/effect/turf_decal/bot, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aNw" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -25087,9 +25079,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aNH" = ( -/turf/closed/wall/r_wall, -/area/medical/genetics/cloning) "aNI" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -25102,17 +25091,12 @@ pixel_x = -4; pixel_y = 4 }, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_x = 4; - pixel_y = 6 - }, /obj/item/crowbar, -/obj/item/paper/guides/jobs/medical/cloning, /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aNK" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -25133,9 +25117,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aNL" = ( -/turf/closed/wall, -/area/medical/genetics/cloning) "aNM" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -25152,17 +25133,10 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aNN" = ( /turf/closed/wall/r_wall/rust, /area/medical/morgue) -"aNO" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"aNP" = ( -/turf/closed/wall/rust, -/area/medical/genetics/cloning) "aNQ" = ( /turf/closed/wall, /area/medical/cryo) @@ -25179,7 +25153,7 @@ /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aNT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 @@ -25236,7 +25210,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aNW" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -25294,11 +25268,11 @@ "aOa" = ( /obj/structure/flora/junglebush/b, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOb" = ( /obj/structure/flora/junglebush/large, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOc" = ( /obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/grassybush, @@ -25307,7 +25281,7 @@ dir = 9 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOd" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -25434,7 +25408,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOm" = ( /obj/item/toy/beach_ball{ pixel_y = 6 @@ -25443,7 +25417,7 @@ dir = 4 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOn" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -25501,7 +25475,7 @@ dir = 4 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOr" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -25621,7 +25595,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOy" = ( /obj/machinery/door/airlock/maintenance{ name = "bar maintenance"; @@ -25698,12 +25672,12 @@ dir = 10 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOC" = ( /obj/structure/flora/grass/jungle, /obj/structure/flora/ausbushes/lavendergrass, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/box/corners{ @@ -25724,7 +25698,7 @@ pixel_y = 5 }, /turf/open/floor/grass, -/area/medical/genetics/cloning) +/area/medical/storage) "aOF" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/caution/stand_clear, @@ -25750,7 +25724,7 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOH" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -25773,7 +25747,7 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOI" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -25786,7 +25760,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOJ" = ( /obj/effect/turf_decal/tile/purple, /obj/effect/turf_decal/tile/purple{ @@ -25812,7 +25786,7 @@ dir = 1 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aOM" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -26095,7 +26069,7 @@ dir = 6 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPe" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -26112,7 +26086,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPf" = ( /turf/closed/wall/rust, /area/medical/virology) @@ -26226,7 +26200,7 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -26275,8 +26249,9 @@ pixel_y = -26 }, /obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aPs" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral, @@ -26322,7 +26297,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPv" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -26489,7 +26464,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPH" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -26612,7 +26587,7 @@ dir = 8 }, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aPP" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -26779,11 +26754,11 @@ /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/delivery, /obj/machinery/door/window/northleft{ - name = "Cloning Delivery Access"; + name = "Medbay Storage Access"; req_access_txt = "50" }, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aPY" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -30843,10 +30818,6 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/engine/n2o, /area/engine/atmos) -"aVH" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall, -/area/medical/genetics/cloning) "aVI" = ( /obj/effect/turf_decal/delivery, /obj/machinery/suit_storage_unit/cmo, @@ -30873,12 +30844,12 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/obj/machinery/dna_scannernew, /obj/machinery/airalarm{ pixel_y = 24 }, +/obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aVL" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -31008,11 +30979,11 @@ dir = 8 }, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aVU" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, -/area/medical/genetics/cloning) +/area/medical/storage) "aVV" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -31194,7 +31165,7 @@ /obj/structure/bed, /obj/item/bedsheet/medical, /turf/open/floor/plasteel/showroomfloor, -/area/medical/genetics/cloning) +/area/medical/storage) "aWg" = ( /obj/structure/bodycontainer/morgue{ dir = 8 @@ -31286,7 +31257,7 @@ pixel_y = 32 }, /turf/open/floor/plating, -/area/medical/genetics/cloning) +/area/medical/storage) "aWn" = ( /obj/structure/chair/sofa/right{ color = "#c45c57"; @@ -31312,8 +31283,9 @@ dir = 1 }, /obj/machinery/vending/clothing, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/area/medical/storage) "aWp" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -33265,8 +33237,8 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1, -/mob/living/simple_animal/bot/secbot/pingsky, /obj/structure/cable, +/mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/engine, /area/ai_monitored/turret_protected/aisat_interior) "aZi" = ( @@ -89422,9 +89394,8 @@ }, /area/engine/engineering) "cGO" = ( -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -89433,9 +89404,8 @@ }, /area/engine/engineering) "cGP" = ( -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -89547,9 +89517,8 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -111676,11 +111645,11 @@ cxf cxw aar apY -aNL -aNL +aOZ +aOZ atL -aNP -aNL +aPy +aOZ aPA azU aAE @@ -111933,7 +111902,7 @@ cxf cxw cxN apZ -aNL +aOZ ajY atM aFb @@ -112190,7 +112159,7 @@ cwp cxx cxG aqa -aNP +aPy aOa atN aOC @@ -112447,7 +112416,7 @@ cwp cwq cwy aqb -aNL +aOZ aOb atQ aOE @@ -112704,7 +112673,7 @@ cwq cwp anP aqe -aNL +aOZ akq atR avx @@ -112961,11 +112930,11 @@ bgN cwp anQ ail -aNt +aPa aWm -aNO +aPx avB -aNO +aPx aPA abl agH @@ -113217,13 +113186,13 @@ ajI alb cwq anR -aNH -aNH +aPc +aPc aOl aPe avC aNM -aNO +aPx aNR aOj aOp @@ -113474,13 +113443,13 @@ cvv cvJ amh anV -aNH +aPc and apW aBi avG aNS -aNL +aOZ aOe aJW aOh @@ -113731,13 +113700,13 @@ cvk czM cwy anW -aNt +aPa and aqo aMd avI auA -aNP +aPy aOd aNT aPh @@ -113988,7 +113957,7 @@ arT cxA czL anX -aNt +aPa aqP ass atS @@ -114245,13 +114214,13 @@ cvI cxB cwp ajv -aNH -aNH +aPc +aPc aOx aPu aWf aNV -aNO +aPx aFr aNY aOv @@ -114508,12 +114477,12 @@ aNN asi aVj asi -aNH -aVH -aNO +aPc +aOW +aPx aCI -aNL -aNL +aOZ +aOZ aQd aQC aNn @@ -114765,12 +114734,12 @@ aVY aWe aIB aWu -aNL +aOZ aNv aOH aOB aJU -aNO +aPx aQh aQX aQb @@ -115022,12 +114991,12 @@ asv atU avT aWv -aNL +aOZ aBA aOI aOG aWo -aNP +aPy cJJ pSI aNn @@ -115279,12 +115248,12 @@ aVZ aWg avW aWw -aNP +aPy aVK aOK aFt aPr -aNL +aOZ aYB aYB aNn @@ -115536,8 +115505,8 @@ aWb aWh avX aWz -aNL -aNL +aOZ +aOZ aPd aFx aPG @@ -116309,10 +116278,10 @@ arM avK aWF aNu -aNL -aNP -aNL -aNL +aOZ +aPy +aOZ +aOZ aSx aQt aQr diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index bb40cd4f88e..26397ce2117 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -928,11 +928,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/bodycontainer/morgue{ - dir = 8 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "acm" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -6552,7 +6553,7 @@ "ank" = ( /obj/structure/lattice, /obj/machinery/camera/motion{ - c_tag = "E.V.A. Storage"; + c_tag = "Armory External"; dir = 8 }, /turf/open/space/basic, @@ -10136,10 +10137,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"avr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "avs" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -14593,17 +14590,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aGp" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/extinguisher_cabinet{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "aGq" = ( /obj/machinery/door/firedoor, /obj/machinery/flasher{ @@ -14859,6 +14845,14 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 6 + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -14883,6 +14877,10 @@ /obj/effect/turf_decal/bot{ dir = 1 }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, /turf/open/floor/plasteel{ dir = 1 }, @@ -24449,21 +24447,21 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bcc" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair, -/obj/structure/sign/poster/official/build{ - pixel_y = 32 +/obj/machinery/power/apc{ + areastring = "/area/medical/morgue"; + dir = 4; + name = "Morgue APC"; + pixel_y = 24 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "bcd" = ( /turf/closed/wall, /area/janitor) @@ -45640,6 +45638,11 @@ dir = 4 }, /obj/structure/closet/crate/freezer/surplus_limbs, +/obj/machinery/camera{ + c_tag = "Medbay Storage"; + dir = 8; + network = list("ss13","medbay") + }, /turf/open/floor/plasteel/white, /area/medical/storage) "bYY" = ( @@ -46086,11 +46089,6 @@ /turf/open/floor/plasteel/white, /area/medical/storage) "cad" = ( -/obj/machinery/camera{ - c_tag = "Medbay Storage"; - dir = 8; - network = list("ss13","medbay") - }, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -46803,13 +46801,6 @@ }, /turf/open/floor/plasteel/cafeteria, /area/engine/atmos) -"cbp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/port/aft) "cbq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -47039,7 +47030,7 @@ pixel_y = 28 }, /obj/machinery/camera{ - c_tag = "Medbay Hallway Central"; + c_tag = "Medbay Clinic"; dir = 4; network = list("ss13","medbay") }, @@ -49939,8 +49930,8 @@ /area/medical/medbay/central) "cit" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -49949,8 +49940,8 @@ dir = 4 }, /obj/effect/turf_decal/tile/yellow, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) @@ -50549,6 +50540,9 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cjS" = ( @@ -51934,14 +51928,14 @@ /turf/open/floor/wood, /area/maintenance/port/aft) "cnl" = ( -/obj/machinery/door/airlock/wood{ - doorClose = 'sound/effects/doorcreaky.ogg'; - doorOpen = 'sound/effects/doorcreaky.ogg'; - name = "The Gobetting Barmaid" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/door/airlock/maintenance{ + name = "Medical Surplus Storeroom"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/maintenance/port/aft) "cnm" = ( @@ -52242,24 +52236,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/medical/pharmacy) -"cnJ" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cnK" = ( /obj/machinery/chem_dispenser{ layer = 2.7 @@ -53504,17 +53480,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/pharmacy) -"cqt" = ( -/obj/machinery/chem_heater{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cqu" = ( /obj/machinery/chem_master, /obj/structure/noticeboard{ @@ -54308,7 +54273,6 @@ }, /obj/effect/turf_decal/tile/purple, /obj/machinery/computer/scan_consolenew{ - icon_state = "computer"; dir = 1 }, /turf/open/floor/plasteel/white, @@ -54645,13 +54609,13 @@ /turf/open/floor/plating, /area/maintenance/department/medical/central) "csD" = ( +/obj/machinery/power/apc/auto_name/north, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/power/apc/auto_name/north, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -54668,6 +54632,9 @@ }, /area/maintenance/department/medical/central) "csF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/structure/disposalpipe/sorting/mail{ dir = 8; sortType = 11 @@ -54675,10 +54642,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/structure/cable, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/department/medical/central) "csH" = ( @@ -54686,7 +54651,6 @@ dir = 8; sortType = 23 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -55102,23 +55066,10 @@ }, /turf/open/floor/plasteel/cafeteria, /area/crew_quarters/heads/cmo) -"ctA" = ( -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"ctC" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" - }, -/turf/open/floor/plating, -/area/maintenance/department/medical/central) "ctD" = ( /obj/structure/sign/directions/evac, -/turf/closed/wall, -/area/medical/morgue) +/turf/closed/wall/r_wall, +/area/medical/chemistry) "ctE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/firedoor, @@ -55319,9 +55270,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/secondary) "cud" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, @@ -55458,11 +55406,14 @@ /turf/open/floor/grass, /area/science/genetics) "cus" = ( -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cut" = ( /obj/structure/flora/ausbushes/fernybush, /obj/effect/turf_decal/stripes/line{ @@ -55471,6 +55422,22 @@ /mob/living/carbon/monkey, /turf/open/floor/grass, /area/science/genetics) +"cuu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera/autoname, +/obj/machinery/firealarm{ + pixel_y = 24 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cuv" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -55482,11 +55449,17 @@ /turf/open/floor/plasteel/white, /area/science/genetics) "cuw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /obj/machinery/airalarm{ pixel_y = 32 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cux" = ( /obj/structure/table/glass, /obj/effect/turf_decal/tile/purple{ @@ -55746,79 +55719,43 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "cvs" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/sign/warning/nosmoking{ + pixel_x = 28 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"cvt" = ( -/turf/closed/wall, -/area/medical/genetics/cloning) "cvu" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/machinery/door/window/southleft{ - name = "Cloning Shower" - }, -/obj/structure/mirror{ - pixel_x = -28 - }, -/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{ +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cvv" = ( -/obj/machinery/door/window/southleft{ - base_state = "right"; - icon_state = "right"; - name = "Cloning Shower" - }, -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "sink"; - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/sign/poster/random{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"cvw" = ( -/obj/machinery/clonepod{ - pixel_y = 2 - }, -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cvx" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, @@ -55836,31 +55773,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/genetics) -"cvB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cvE" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"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 - }, -/turf/closed/wall, -/area/medical/morgue) "cvG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -56136,7 +56048,6 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cwu" = ( -/obj/structure/disposalpipe/segment, /obj/structure/sink{ dir = 8; pixel_x = 11 @@ -56144,70 +56055,36 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/junction/flip, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cwv" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/light_switch{ - pixel_x = -23 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cww" = ( -/obj/effect/landmark/start/geneticist, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 +/obj/structure/disposalpipe/segment{ + dir = 9 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/chemistry) "cwx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, -/obj/machinery/computer/cloning{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/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/white, -/area/medical/genetics/cloning) +/area/medical/chemistry) "cwF" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/light{ + dir = 8 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cwG" = ( @@ -56474,87 +56351,59 @@ dir = 8 }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxl" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cxm" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cxn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/chemistry) "cxo" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/tile/blue, -/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/cloning) +/area/medical/chemistry) "cxp" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall, /area/medical/morgue) -"cxq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cxr" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cxs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cxv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cxw" = ( /obj/effect/landmark/xeno_spawn, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cxz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; location = "10-Aft-To-Central" @@ -56562,6 +56411,8 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/aft) "cxA" = ( @@ -56690,7 +56541,6 @@ /turf/closed/wall, /area/medical/medbay/aft) "cxV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, @@ -56700,108 +56550,48 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cxX" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cxY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "CloningDoor"; - name = "Cloning Lab"; - req_access_txt = "5; 68" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/unres{ - 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 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) "cxZ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/camera/autoname{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) +/area/medical/chemistry) "cya" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cyb" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cyc" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/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/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5" - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cyh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/medical/chemistry) "cyi" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cym" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/turf/open/floor/plasteel, -/area/medical/morgue) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cyn" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -57063,74 +56853,32 @@ /area/medical/medbay/aft) "cyU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 28 - }, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cyV" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cyW" = ( -/obj/effect/landmark/start/geneticist, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cyX" = ( -/obj/machinery/power/apc/unlocked{ - areastring = "/area/medical/genetics/cloning"; - dir = 4; - name = "Cloning Lab APC"; - pixel_x = 24 - }, -/obj/machinery/camera{ - c_tag = "Genetics Cloning Lab"; - dir = 8; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics/cloning) -"cyY" = ( -/obj/structure/bodycontainer/morgue, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/area/medical/chemistry) "czf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/item/radio/intercom{ pixel_x = -26 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "czg" = ( @@ -57436,80 +57184,25 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "czW" = ( -/obj/machinery/power/apc{ - areastring = "/area/medical/medbay/aft"; - dir = 4; - name = "Medbay Aft APC"; - pixel_x = 24 - }, -/obj/structure/disposalpipe/junction, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/obj/structure/disposalpipe/junction, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "czX" = ( -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/item/paper, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/table/glass, -/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{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"czY" = ( -/obj/item/storage/box/rxglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) -"czZ" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/genetics/cloning) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cAh" = ( /obj/machinery/airalarm{ dir = 4; @@ -57519,10 +57212,10 @@ c_tag = "Aft Primary Hallway - Middle"; dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, @@ -57884,15 +57577,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cBb" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/medical/genetics/cloning) -"cBd" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall, -/area/hallway/primary/aft) "cBe" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -57970,7 +57654,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "cBs" = ( /turf/open/floor/plasteel/white, /area/science/mixing) @@ -58276,36 +57960,23 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/medical/medbay/aft) -"cCb" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/corner, -/area/medical/medbay/aft) -"cCc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/side, -/area/medical/medbay/aft) -"cCd" = ( -/obj/structure/closet/secure_closet/personal/patient, -/turf/open/floor/plasteel/white/corner{ - dir = 8 - }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCe" = ( /turf/closed/wall, /area/medical/morgue) "cCf" = ( -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cCg" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plasteel/dark, @@ -58592,97 +58263,47 @@ /turf/open/floor/plasteel/freezer, /area/medical/virology) "cCN" = ( -/obj/machinery/camera{ - c_tag = "Medbay Hallway Aft"; +/obj/machinery/firealarm{ dir = 4; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white/side{ - dir = 5 + pixel_x = -24 }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCO" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cCP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/disposalpipe/sorting/mail{ sortType = 27 }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) -"cCQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plasteel, -/area/medical/medbay/aft) -"cCR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/medbay/aft) -"cCS" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) -"cCT" = ( /obj/machinery/light{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cCU" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cCV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cCX" = ( /obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/dark, /area/medical/morgue) "cCY" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, /obj/item/radio/intercom{ pixel_x = 29 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cCZ" = ( /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, @@ -59063,11 +58684,9 @@ }, /area/medical/medbay/aft) "cDR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cDS" = ( @@ -59075,77 +58694,65 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white/side{ - dir = 8 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cDT" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/medical/medbay/aft) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Chemistry"; + req_access_txt = "33" + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cDU" = ( -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/medical/medbay/aft) -"cDV" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/start/medical_doctor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/medbay/aft) +/area/medical/chemistry) "cDW" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cDX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5" - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cDY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cDZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEb" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -59153,29 +58760,8 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEc" = ( -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEd" = ( -/obj/structure/table, -/obj/machinery/power/apc{ - areastring = "/area/medical/morgue"; - dir = 4; - name = "Morgue APC"; - pixel_x = 24 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/clothing/gloves/color/latex, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEf" = ( /turf/closed/wall, /area/hallway/primary/aft) @@ -59533,82 +59119,34 @@ /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cEQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, -/turf/open/floor/plasteel/white/side{ - dir = 10 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cER" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/medical/medbay/aft) -"cES" = ( -/obj/item/healthanalyzer{ - pixel_x = 1; - pixel_y = 4 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = -30 - }, -/obj/structure/table/glass, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/medical/medbay/aft) -"cET" = ( -/obj/machinery/vending/medical, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/medical/medbay/aft) -"cEU" = ( -/obj/machinery/light_switch{ - pixel_x = -23 - }, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cEV" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEX" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/obj/machinery/navbeacon/wayfinding, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) -"cEZ" = ( -/turf/open/floor/plasteel/dark, -/area/hallway/primary/aft) +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFa" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -60037,17 +59575,6 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cFQ" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "cFR" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/aft) @@ -60061,17 +59588,8 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, +/turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cFU" = ( -/obj/machinery/light/small, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "cFV" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -60079,8 +59597,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFW" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -60088,18 +59610,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFX" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light_switch{ - pixel_x = 23 +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cFY" = ( /obj/structure/closet, /turf/open/floor/plasteel/dark, @@ -60617,68 +60143,47 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/landmark/start/medical_doctor, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) "cGN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cGO" = ( -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/medbay/aft) -"cGP" = ( -/obj/machinery/door/airlock{ - name = "Medical Surplus Storeroom"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/aft) -"cGQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cGR" = ( -/obj/structure/table, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/item/storage/backpack/duffelbag/med, -/obj/item/flashlight/pen{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) "cGS" = ( -/obj/structure/table, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/eyepatch, -/obj/item/reagent_containers/food/drinks/bottle/vodka{ - pixel_x = 3; +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/item/reagent_containers/glass/bottle/multiver{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; pixel_y = 2 }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/obj/item/reagent_containers/dropper, +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cGT" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" + name = "Chemistry Maintenance"; + req_access_txt = "5; 69" }, /turf/open/floor/plating, /area/maintenance/aft) @@ -61065,18 +60570,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/aft) -"cHC" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = -30 - }, -/obj/item/storage/box/beakers{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/bodybags, -/obj/structure/table/glass, -/turf/open/floor/plasteel/white, -/area/medical/medbay/aft) "cHD" = ( /obj/machinery/firealarm{ dir = 1; @@ -61103,40 +60596,49 @@ pixel_y = 8 }, /obj/structure/table/glass, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/medical/medbay/aft"; + dir = 4; + name = "Medbay Aft APC"; + pixel_x = 24 + }, /turf/open/floor/plasteel/white/side{ dir = 10 }, /area/medical/medbay/aft) "cHF" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cHG" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cHH" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table/glass, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/book/manual/wiki/plumbing{ + pixel_x = 4; + pixel_y = -4 }, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/syringe, /obj/item/reagent_containers/dropper, -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cHI" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -61577,28 +61079,17 @@ /turf/open/floor/plating, /area/maintenance/aft) "cIA" = ( -/obj/structure/bed/roller, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plasteel, -/area/maintenance/aft) -"cIB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plating, -/area/maintenance/aft) -"cIC" = ( -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/structure/rack, -/obj/item/clothing/suit/toggle/labcoat, -/obj/item/clothing/suit/apron/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/mask/breath/medical, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/area/maintenance/aft) +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/head/welding, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "cID" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -61942,50 +61433,64 @@ /turf/open/floor/plating, /area/maintenance/aft) "cJt" = ( -/obj/structure/rack, -/obj/item/storage/pill_bottle, -/obj/effect/spawner/lootdrop/maintenance/three, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/effect/turf_decal/tile/yellow{ + dir = 1 }, -/obj/item/cigbutt, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/aft) -"cJv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Medical Surplus Storeroom"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/maintenance/aft) -"cJx" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/table, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/plunger, +/obj/item/plunger, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJu" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 10 + }, +/obj/machinery/light, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJv" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/metal/fifty, +/obj/item/construction/plumbing, +/obj/item/construction/plumbing, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"cJx" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/aft) "cJy" = ( @@ -62615,10 +62120,10 @@ /turf/closed/wall/r_wall, /area/science/research) "cKJ" = ( +/obj/effect/spawner/lootdrop/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/spawner/lootdrop/maintenance, /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/department/medical/central) @@ -65176,6 +64681,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/item/radio/intercom{ + pixel_x = -28 + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "cQo" = ( @@ -65508,25 +65016,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/science/xenobiology) -"cRf" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"cRg" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) "cRh" = ( /obj/structure/sink{ dir = 4; @@ -67049,15 +66538,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"cZs" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "cZv" = ( /turf/open/floor/circuit/telecomms, /area/science/xenobiology) @@ -67344,16 +66824,6 @@ icon_state = "wood-broken6" }, /area/maintenance/port/aft) -"dbr" = ( -/obj/machinery/camera{ - c_tag = "Morgue"; - network = list("ss13","medbay") - }, -/obj/structure/bodycontainer/morgue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "dbs" = ( /obj/machinery/light/small{ dir = 8 @@ -68430,6 +67900,12 @@ }, /turf/closed/wall/r_wall, /area/engine/engineering) +"deh" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "dei" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -68567,9 +68043,7 @@ /turf/open/floor/engine, /area/engine/engineering) "deK" = ( -/obj/machinery/power/emitter/anchored{ - state = 2 - }, +/obj/machinery/power/emitter/welded, /obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) @@ -68779,17 +68253,15 @@ /turf/open/floor/engine, /area/engine/engineering) "dfB" = ( -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 1 }, /obj/structure/cable, /turf/open/floor/plating, /area/engine/engineering) "dfC" = ( -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 1 }, /obj/machinery/light{ dir = 4 @@ -69895,23 +69367,13 @@ }, /area/science/research) "diF" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "diH" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -70188,20 +69650,6 @@ }, /turf/open/floor/plating, /area/chapel/main) -"djY" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dlI" = ( /turf/closed/wall/r_wall, /area/engine/supermatter) @@ -70283,26 +69731,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/fore) -"dnp" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/pen{ - pixel_y = 3 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing Lobby"; - dir = 1; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dnr" = ( /obj/machinery/power/apc{ areastring = "/area/maintenance/port/fore"; @@ -70748,11 +70176,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"dBe" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/aft) "dBu" = ( /turf/closed/wall, /area/engine/gravity_generator) @@ -71050,16 +70473,6 @@ icon_state = "panelscorched" }, /area/maintenance/port/fore) -"dCy" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dCz" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel/dark, @@ -71308,6 +70721,10 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, /turf/open/floor/plasteel, /area/hallway/primary/aft) "dDw" = ( @@ -71335,28 +70752,16 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"dDB" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/plating, -/area/maintenance/port/aft) "dDC" = ( +/obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "dDE" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, @@ -71455,7 +70860,6 @@ dir = 4 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) "dLK" = ( @@ -71474,16 +70878,6 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/space/nearstation) -"dVT" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -71493,12 +70887,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"dZG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ece" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -71571,6 +70959,14 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/security/warden) +"ejE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "enV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/neutral{ @@ -71613,37 +71009,27 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/security/warden) -"eqt" = ( -/obj/structure/girder, -/obj/structure/grille, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/port/aft) "eqG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/engine, /area/science/misc_lab/range) +"exA" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "eyv" = ( /obj/structure/grille/broken, /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"eAa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eCT" = ( /obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -71662,21 +71048,6 @@ icon_state = "wood-broken4" }, /area/maintenance/port/aft) -"eEi" = ( -/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/structure/table, -/obj/item/plunger, -/obj/item/plunger, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eEu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -71690,12 +71061,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port) -"eEV" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eFN" = ( /obj/structure/bodycontainer/crematorium{ dir = 1; @@ -71713,34 +71078,22 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/break_room) +"eNA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "eOp" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck, /turf/open/floor/wood, /area/maintenance/port/aft) -"eRo" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "eSm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "eSY" = ( /obj/structure/chair/stool, /turf/open/floor/wood{ @@ -71821,18 +71174,11 @@ /turf/closed/wall, /area/maintenance/department/science/central) "fkj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, /obj/structure/table, -/obj/item/construction/plumbing, -/obj/item/construction/plumbing, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "flJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -71844,6 +71190,37 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/plasteel, /area/security/prison) +"fqC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"frA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"frX" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_y = -30 + }, +/obj/item/storage/box/beakers{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/bodybags, +/obj/structure/table/glass, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "ftu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -71885,11 +71262,16 @@ /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, /area/crew_quarters/kitchen/coldroom) "fwL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"fxT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "fCe" = ( /obj/machinery/door/airlock/security{ name = "Court Cell"; @@ -71898,6 +71280,14 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/brig) +"fCG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "fDD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -71994,7 +71384,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "fMA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -72005,6 +71395,27 @@ }, /turf/open/floor/plating, /area/security/checkpoint/engineering) +"fRZ" = ( +/obj/machinery/power/apc{ + acted_explosions = 2; + areastring = "/area/medical/chemistry"; + name = "Chemistry APC"; + pixel_x = -26 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"fSV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "fUt" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -72013,6 +71424,9 @@ /turf/open/floor/plasteel, /area/engine/engineering) "fUC" = ( +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/circuit, /area/science/misc_lab/range) "fWc" = ( @@ -72038,12 +71452,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/maintenance/department/science) -"gcu" = ( +"gcr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"gfS" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/medical/medbay/aft) "gjC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/disposalpipe/segment, @@ -72067,24 +71485,38 @@ }, /turf/open/floor/plasteel/dark, /area/engine/break_room) +"gjP" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/obj/machinery/door/window/eastright{ + name = "Chemistry Desk"; + req_access_txt = "33" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/medical/chemistry) "gka" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/solar/port/aft) -"glz" = ( -/obj/structure/sign/poster/contraband/random{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken4" - }, -/area/maintenance/port/aft) +"gkW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "gnd" = ( /turf/closed/wall, /area/maintenance/department/science/central) +"gnT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -72147,22 +71579,33 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gAj" = ( -/obj/structure/closet/secure_closet/chemical{ - pixel_x = -3 - }, +"gxB" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing Lab"; - network = list("ss13","medbay") + dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"gyL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"gDK" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/item/storage/backpack/duffelbag/med, +/obj/item/flashlight/pen{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gGf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -72184,19 +71627,6 @@ /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, /area/maintenance/department/science) -"gNe" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/aft/secondary) -"gOM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "gPT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -72204,12 +71634,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"gUb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "gXY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -72237,23 +71661,22 @@ /turf/open/floor/plating, /area/maintenance/port) "hdX" = ( -/obj/structure/closet/emcloset, /obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/port/aft) "hev" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 +/obj/item/radio/intercom{ + pixel_x = 29 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "hfn" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -72299,6 +71722,24 @@ dir = 1 }, /area/engine/storage_shared) +"hkT" = ( +/obj/structure/rack, +/obj/item/storage/pill_bottle, +/obj/effect/spawner/lootdrop/maintenance/three, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"hox" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "hql" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/westleft{ @@ -72335,32 +71776,11 @@ }, /turf/open/floor/plasteel/white, /area/science/genetics) -"hvf" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hvt" = ( /obj/structure/kitchenspike_frame, /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating, /area/maintenance/port/aft) -"hwW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing South"; - dir = 1; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hxX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -72377,6 +71797,14 @@ }, /turf/open/floor/plating, /area/security/prison) +"hAu" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/medbay/aft) "hBB" = ( /obj/structure/table, /obj/item/reagent_containers/food/snacks/mint, @@ -72395,26 +71823,9 @@ icon_state = "panelscorched" }, /area/maintenance/port/aft) -"hFj" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/storage/box/matches, -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/folder/yellow{ - pixel_x = -5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "hFV" = ( /obj/machinery/door/window/westleft{ name = "safety door"; - req_access_txt = "0"; req_one_access_txt = "47" }, /turf/open/floor/plasteel/white, @@ -72443,9 +71854,11 @@ /turf/open/floor/plasteel, /area/engine/break_room) "hLm" = ( -/obj/structure/sign/poster/random, -/turf/closed/wall, -/area/medical/chemistry) +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "hMx" = ( /obj/structure/table, /obj/effect/turf_decal/tile/purple{ @@ -72519,15 +71932,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"ibr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ibz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -72605,6 +72009,16 @@ }, /turf/open/floor/plasteel, /area/science/misc_lab/range) +"irZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "ixj" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/tile/blue{ @@ -72661,21 +72075,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/janitor) -"iGO" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/eastright{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Chemistry Hall"; - req_access_txt = "33" - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "iKA" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -72708,6 +72107,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"iUh" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "jah" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -72733,7 +72137,7 @@ dir = 4 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "jnI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -72823,34 +72227,21 @@ /obj/structure/chair, /turf/open/floor/plating, /area/maintenance/port/aft) -"jOR" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28; - pixel_y = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"jPu" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "jQh" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/engine, /area/engine/engineering) +"jTg" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = 20 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "jUe" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -72859,12 +72250,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"jUk" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "jUn" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -72879,6 +72264,12 @@ /obj/item/storage/belt/utility, /turf/open/floor/plasteel, /area/engine/break_room) +"jVH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "jYJ" = ( /obj/item/reagent_containers/food/drinks/bottle/tequila, /obj/structure/table/wood, @@ -72923,13 +72314,16 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"khy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"khX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plating, +/area/maintenance/port/aft) "kjh" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/ridden/janicart, @@ -72937,21 +72331,30 @@ /turf/open/floor/plasteel, /area/janitor) "klh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair, -/obj/machinery/light{ - dir = 1 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"klB" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/blood, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/warning/biohazard{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "kqz" = ( /obj/structure/sign/warning/docking, /turf/closed/wall, @@ -72993,19 +72396,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"kyW" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Chemistry Plumbing North"; - network = list("ss13","medbay") - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "kzn" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -73063,6 +72453,17 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"kJl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "kKo" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -73082,6 +72483,13 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port) +"kNI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "kOt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -73102,12 +72510,18 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, /area/maintenance/port) +"kQx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "kRO" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/northleft{ dir = 4; name = "Engineering Desk"; - req_access_txt = "10;24" + req_one_access_txt = "24;32" }, /obj/item/folder/yellow, /obj/item/folder/yellow, @@ -73144,6 +72558,12 @@ }, /turf/open/floor/plasteel, /area/janitor) +"kWn" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "kWu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -73161,10 +72581,12 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"laN" = ( -/obj/structure/cable, +"lbB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) "lce" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, @@ -73175,7 +72597,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "lci" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile/yellow, @@ -73201,6 +72623,16 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/aft) +"lfv" = ( +/obj/effect/mob_spawn/human/corpse/assistant{ + belt = null; + husk = TRUE; + id = null; + l_pocket = /obj/item/pen + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/maintenance/port/aft) "lfx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -73214,24 +72646,19 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"liQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"ljF" = ( -/obj/machinery/light{ +"lfR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/turf/open/floor/plating, +/area/medical/chemistry) +"ljG" = ( +/obj/machinery/vending/medical, +/turf/open/floor/plasteel/white/corner{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) "lkf" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -73251,14 +72678,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"luh" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "lwx" = ( /obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -73350,6 +72769,14 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"lMT" = ( +/obj/structure/bed/roller, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/machinery/iv_drip, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "lNZ" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -73417,7 +72844,7 @@ }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "lVD" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -73459,6 +72886,23 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"mci" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"meP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/structure/sign/poster/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "mjJ" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -73497,17 +72941,24 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"mrv" = ( -/obj/machinery/vending/wardrobe/chem_wardrobe, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ +"moz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/space_heater, +/obj/machinery/light/small{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"mrv" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "msD" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -73518,25 +72969,6 @@ /obj/machinery/photocopier, /turf/open/floor/plasteel, /area/engine/break_room) -"mtp" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28; - pixel_y = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -73546,17 +72978,12 @@ }, /turf/closed/wall, /area/hallway/secondary/service) -"mxt" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +"mvB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plating, /area/medical/chemistry) "mzh" = ( /obj/machinery/firealarm{ @@ -73630,6 +73057,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/checker, /area/engine/storage_shared) +"mKb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "mKO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/tank/toxins{ @@ -73661,6 +73093,11 @@ icon_state = "wood-broken3" }, /area/maintenance/port/aft) +"mUz" = ( +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/medbay/aft) "mWg" = ( /obj/structure/girder, /obj/structure/grille, @@ -73669,37 +73106,21 @@ }, /area/maintenance/port/aft) "mZA" = ( -/obj/machinery/light{ - dir = 1 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/table, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nap" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 5 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nbv" = ( /turf/open/floor/plating, /area/maintenance/starboard/secondary) @@ -73708,13 +73129,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/engine/break_room) -"ndC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "neo" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -73726,6 +73140,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) +"niB" = ( +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel/white/corner, +/area/medical/medbay/aft) "njJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -73738,22 +73156,30 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) -"nnV" = ( +"nnI" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/machinery/camera/autoname{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair, -/obj/structure/sign/poster/official/here_for_your_safety{ - pixel_y = 32 - }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"nnV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/machinery/airalarm{ + pixel_y = 32 + }, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "noe" = ( /obj/structure/table/reinforced, /obj/machinery/microwave{ @@ -73764,18 +73190,6 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"npl" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "npx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -73783,6 +73197,14 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"nry" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/hallway/primary/aft) "ntG" = ( /obj/structure/cable, /obj/effect/turf_decal/stripes/line{ @@ -73807,12 +73229,19 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"nDf" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/closed/wall, +"nBI" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, /area/medical/chemistry) +"nDf" = ( +/obj/machinery/light_switch{ + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "nEv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/brig{ @@ -73888,6 +73317,20 @@ "nMe" = ( /turf/closed/wall, /area/medical/surgery/room_b) +"nMs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"nOl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/maintenance/port/aft) "nPC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -73900,17 +73343,6 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"nWX" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "nXA" = ( /obj/structure/rack{ icon = 'icons/obj/stationobjs.dmi'; @@ -74013,16 +73445,6 @@ "ojg" = ( /turf/closed/wall, /area/science/misc_lab/range) -"omB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ong" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -74043,6 +73465,14 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"ooS" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/medical/medbay/aft) "ooY" = ( /obj/machinery/computer/warrant{ dir = 8 @@ -74050,6 +73480,12 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"oqv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "otq" = ( /obj/structure/closet/emcloset, /obj/structure/sign/warning/vacuum/external{ @@ -74080,7 +73516,7 @@ /obj/effect/decal/cleanable/cobweb, /obj/machinery/vending/cola/random, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "owR" = ( /turf/closed/wall, /area/engine/storage_shared) @@ -74126,6 +73562,17 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"oBk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "oBU" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -74143,21 +73590,6 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/storage_shared) -"oFI" = ( -/obj/machinery/door/window/eastright{ - dir = 8; - name = "Chemistry Hall"; - req_access_txt = "33" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "oJL" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -74208,6 +73640,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/maintenance/port/aft) +"oLd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) +"oOy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "oRL" = ( /obj/docking_port/stationary{ dir = 2; @@ -74231,7 +73676,13 @@ }, /obj/machinery/vending/snack/random, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) +"oTW" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/medical/medbay/aft) "oVO" = ( /obj/machinery/airalarm{ dir = 4; @@ -74271,16 +73722,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port/aft) -"oZs" = ( -/obj/structure/cable, -/obj/structure/sign/poster/contraband/random{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) "pai" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -74305,15 +73746,10 @@ "pcn" = ( /turf/open/floor/engine, /area/science/misc_lab/range) -"pcL" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "pej" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/chem_heater{ + pixel_x = 4 + }, /turf/open/floor/plasteel/white, /area/medical/chemistry) "peH" = ( @@ -74333,16 +73769,6 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"pjP" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "plI" = ( /obj/machinery/door/airlock/external{ req_access_txt = "13" @@ -74380,6 +73806,18 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"pvt" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_x = -28 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "pvK" = ( /obj/machinery/computer/security{ dir = 4 @@ -74400,6 +73838,22 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"pwn" = ( +/obj/structure/sign/poster/contraband/random{ + pixel_y = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/aft) +"pyi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "pzj" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -74587,7 +74041,7 @@ "qit" = ( /obj/structure/sign/poster/ripped, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/morgue) "qkD" = ( /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ @@ -74596,27 +74050,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) -"qnE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qom" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/research) -"qpg" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -74644,6 +74082,15 @@ }, /turf/open/floor/plasteel/white, /area/science/genetics) +"quD" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/medical/medbay/aft) "qxe" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -74658,6 +74105,10 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/maintenance/port/aft) +"qzx" = ( +/obj/structure/closet/secure_closet/personal/patient, +/turf/open/floor/plasteel/white/side, +/area/medical/medbay/aft) "qAO" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -74722,18 +74173,6 @@ "qJB" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/port/aft) -"qJK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "qLf" = ( /obj/structure/table/wood, /obj/item/storage/photo_album/library, @@ -74794,14 +74233,11 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "qUR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "qVp" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -74811,23 +74247,23 @@ dir = 5 }, /area/crew_quarters/kitchen) +"qVW" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "qZf" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, /obj/machinery/firealarm{ dir = 8; pixel_x = 28; pixel_y = 5 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "qZU" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -74858,23 +74294,34 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/security/prison) +"rdB" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "reI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/maintenance/port/aft) -"rfi" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ +"rhZ" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/turf/open/floor/plasteel/white/side{ + dir = 4 }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/medical/medbay/aft) +"rig" = ( +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"riD" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/aft) "riP" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -74884,12 +74331,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lobby"; - req_access_txt = null +/obj/machinery/door/airlock/grunge{ + name = "Morgue"; + req_access_txt = "6" }, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "roZ" = ( /obj/machinery/computer/secure_data{ dir = 4 @@ -74944,6 +74391,10 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) +"ryw" = ( +/obj/structure/cable, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -75009,11 +74460,28 @@ /area/hallway/primary/starboard) "rLL" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/plasteel/dark, +/area/medical/morgue) +"rMb" = ( +/obj/item/cigbutt, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/aft) +"rMg" = ( +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/structure/rack, +/obj/item/clothing/suit/toggle/labcoat, +/obj/item/clothing/suit/apron/surgical, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/mask/breath/medical, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/port/aft) "rOP" = ( /obj/structure/sign/poster/official/random, /turf/closed/wall, @@ -75145,6 +74613,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"sfI" = ( +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/medical/medbay/aft) "sfQ" = ( /obj/structure/closet, /obj/item/extinguisher, @@ -75188,10 +74661,46 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/space/nearstation) +"sjZ" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall, +/area/maintenance/aft/secondary) +"slf" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"smJ" = ( +/obj/structure/table, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/eyepatch, +/obj/item/reagent_containers/food/drinks/bottle/vodka{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"snq" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/autoname{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "snr" = ( /obj/structure/sign/warning/biohazard, /turf/closed/wall, -/area/medical/chemistry) +/area/medical/morgue) "snF" = ( /obj/structure/chair, /obj/effect/decal/cleanable/dirt, @@ -75199,11 +74708,36 @@ /area/security/brig) "sof" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /turf/open/floor/plating, /area/maintenance/port/aft) +"spa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"sqe" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"sqL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "svg" = ( /obj/structure/lattice, /obj/structure/girder/reinforced, @@ -75221,28 +74755,13 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"sAd" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"sDj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/power/apc{ - areastring = "/area/medical/chemistry"; - name = "Chemistry APC"; - pixel_y = -23 - }, +"sEG" = ( /obj/structure/cable, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/head/welding, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "sFv" = ( /turf/closed/wall/r_wall, /area/science/explab) @@ -75280,6 +74799,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"sMV" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance/two, +/turf/open/floor/plating, +/area/maintenance/port) "sPc" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -75291,6 +74815,16 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/engine/engineering) +"sQR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "sRB" = ( /mob/living/carbon/monkey, /turf/open/floor/grass, @@ -75306,6 +74840,13 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) +"sWX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chemistry Maintenance"; + req_access_txt = "5; 69" + }, +/turf/open/floor/plating, +/area/maintenance/department/medical/central) "tay" = ( /turf/closed/wall, /area/medical/medbay/central) @@ -75414,6 +74955,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/starboard) +"tsU" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "twp" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -75431,12 +74983,14 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"tBC" = ( -/obj/effect/turf_decal/tile/yellow{ +"tCe" = ( +/obj/machinery/light/small{ dir = 8 }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/chemistry) +/area/science/xenobiology) "tCB" = ( /obj/structure/closet/secure_closet/bar{ pixel_x = -3; @@ -75472,6 +75026,19 @@ /obj/structure/cable, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"tNc" = ( +/obj/structure/table/glass, +/obj/item/healthanalyzer{ + pixel_x = 1; + pixel_y = 4 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/medical/medbay/aft) "tOc" = ( /obj/structure/table/wood, /turf/open/floor/wood, @@ -75496,17 +75063,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hydroponics) -"tQS" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) -"tRO" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plasteel/white, +"tRK" = ( +/obj/structure/sign/warning/biohazard, +/turf/closed/wall, /area/medical/chemistry) "tSO" = ( /obj/structure/sign/poster/contraband/random{ @@ -75516,22 +75075,17 @@ icon_state = "platingdmg1" }, /area/maintenance/port/aft) +"tTj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/medical/chemistry) "tTw" = ( /obj/structure/chair/stool, /obj/effect/decal/cleanable/vomit/old, /turf/open/floor/wood, /area/maintenance/port/aft) -"tTR" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "tVY" = ( /obj/structure/table, /obj/item/storage/bag/money, @@ -75556,12 +75110,23 @@ /obj/structure/cable, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"ubF" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 +"uet" = ( +/obj/item/bot_assembly/floorbot{ + created_name = "FloorDiffBot"; + desc = "Why won't it work?"; + name = "FloorDiffBot" }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) +/turf/open/floor/wood, +/area/maintenance/port/aft) +"ulz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_one_access_txt = "12;47" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/aft/secondary) "uow" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/bot, @@ -75612,15 +75177,16 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/engine/break_room) +"uzf" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/medical/medbay/aft) "uEH" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/engine/storage_shared) -"uFC" = ( -/obj/machinery/airalarm, -/turf/closed/wall, -/area/medical/chemistry) "uGa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -75642,6 +75208,11 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/science) +"uHM" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/aft/secondary) "uLY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ @@ -75727,6 +75298,17 @@ /obj/structure/cable, /turf/open/floor/plasteel/kitchen_coldroom/freezerfloor, /area/crew_quarters/kitchen/coldroom) +"vej" = ( +/obj/machinery/camera{ + c_tag = "Morgue"; + dir = 4; + network = list("ss13","medbay") + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/medical/morgue) "vgd" = ( /obj/item/taperecorder, /obj/item/camera, @@ -75780,22 +75362,17 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"vrW" = ( -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"vub" = ( +"vqw" = ( +/obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light{ dir = 8 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) +"vrW" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "vuY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -75812,6 +75389,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/starboard/secondary) +"vxU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/turf/open/floor/plating, +/area/medical/chemistry) "vyS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -75844,6 +75426,12 @@ dir = 5 }, /area/crew_quarters/kitchen) +"vBx" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/aft/secondary) "vDb" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/wood, @@ -75923,23 +75511,9 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) -"vQt" = ( -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/radio/intercom{ - dir = 1; - pixel_y = -29 - }, -/turf/open/floor/plasteel/white, +"vQD" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, /area/medical/chemistry) "vQP" = ( /obj/structure/table, @@ -75950,12 +75524,6 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) -"vRF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/medical/chemistry) "vTD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -75986,9 +75554,23 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/starboard/secondary) -"vZx" = ( +"vXt" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 + dir = 6 + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"waj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 20 }, /turf/open/floor/plasteel/white, /area/medical/chemistry) @@ -76050,6 +75632,13 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"wgZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wij" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -76072,13 +75661,21 @@ /obj/effect/decal/cleanable/dirt, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, -/obj/effect/spawner/lootdrop/maintenance/two, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "wmt" = ( /obj/effect/decal/cleanable/food/flour, /turf/open/floor/plating, /area/maintenance/port/aft) +"woz" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/port/aft) "woI" = ( /obj/structure/chair/stool/bar, /obj/effect/turf_decal/tile/bar, @@ -76091,13 +75688,6 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) -"wpK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "wtq" = ( /turf/closed/wall, /area/maintenance/aft/secondary) @@ -76123,6 +75713,15 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/hallway/primary/port) +"wyn" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "wyV" = ( /obj/machinery/holopad, /turf/open/floor/plasteel/cafeteria{ @@ -76158,7 +75757,7 @@ }, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel/dark, -/area/medical/chemistry) +/area/medical/morgue) "wBp" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -76167,6 +75766,29 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"wDc" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) +"wDN" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/medical/medbay/aft) "wFH" = ( /obj/effect/landmark/blobstart, /obj/structure/cable, @@ -76240,17 +75862,6 @@ "wQA" = ( /turf/closed/wall/r_wall, /area/science/mixing/chamber) -"wQV" = ( -/obj/machinery/door/airlock/medical{ - name = "Chemistry"; - req_access_txt = "33" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "wQZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76301,6 +75912,17 @@ /obj/machinery/computer/rdconsole/experiment, /turf/open/floor/plasteel/white, /area/science/misc_lab/range) +"xgL" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "xgQ" = ( /obj/machinery/chem_heater{ pixel_x = 4 @@ -76391,6 +76013,11 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/engine/break_room) +"xyV" = ( +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/medical/medbay/aft) "xzi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76423,11 +76050,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"xHr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "xIf" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -76435,15 +76057,27 @@ }, /turf/open/floor/plasteel, /area/engine/break_room) -"xTm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +"xKe" = ( +/obj/machinery/door/airlock/wood{ + doorClose = 'sound/effects/doorcreaky.ogg'; + doorOpen = 'sound/effects/doorcreaky.ogg'; + name = "The Gobetting Barmaid" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"xLF" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/aft/secondary) +"xNX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/metal/fifty, -/obj/item/hand_labeler, /turf/open/floor/plasteel/white, /area/medical/chemistry) "xVl" = ( @@ -76486,33 +76120,6 @@ }, /turf/closed/wall, /area/medical/storage) -"xZy" = ( -/obj/structure/table/glass, -/obj/machinery/light{ - dir = 8 - }, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/item/book/manual/wiki/plumbing{ - pixel_x = 4; - pixel_y = -4 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "ybh" = ( /obj/structure/light_construct{ dir = 4 @@ -76581,16 +76188,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab/range) -"yih" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Chemistry Lab"; - req_access_txt = "33" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) (1,1,1) = {" aaa @@ -87029,13 +86626,13 @@ aaa aaa aaa aaa -lMJ -lMJ aaa aaa -lMJ -lMJ -lMJ +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87285,19 +86882,19 @@ aaa aaa aaa aaa -lMJ -dux -ckN -ckN -dux -dux -dux -ckN -ckN -ckN -ckN -ckN -lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87541,21 +87138,21 @@ aaa aaa aaa aaa -lMJ -dux -ppz -cpQ -cnh -mTs -fht -kfZ -ckN -dwr -oKP -cjt -ckN -ckN -lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -87799,20 +87396,20 @@ aaa aaa aaa aaa -ckN -tCB -wOn -wOn -wfq -wOn -ckP -ckP -auR -cjt -crh -vDb -ckN -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -88056,20 +87653,20 @@ aaa aaa aaa aaa -ckN -eew -wfq -wOn -wOn -wOn -jYJ -cjt -dbq -ckQ -wYq -ckP -qNO -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -88312,21 +87909,21 @@ aaa aaa aaa aaa -lMJ -dux -cjs -tOc -tOc -ckR -cmh -cnj -tTw -ckP -ckP -ckP -ckP -eOp -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ aaa aaa @@ -88569,21 +88166,21 @@ aaa aaa aaa aaa -lMJ -dux -wGG -ckP -tTw -cjt -eSY -diJ -ckP -ckS -ckP -ckP -wYq -eSY -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ aaa aaf @@ -88827,20 +88424,20 @@ eyv gJK lMJ lMJ -ckN -eDt -eSY -ckP -ckP -dvt -csf -bXE -ckP -ckP -ckS -ckP -ckN -ckN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ lMJ aaf @@ -89083,21 +88680,21 @@ aaa lMJ aaa aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -ckN -cxQ -cjt -ckS -ckP -ckP -cdg -ptP -ckP -ckP -ybh -ckP -wOA -dux aaa cej cej @@ -89341,20 +88938,20 @@ vrW vrW aaa nYJ -ckN -nZb -qNO -ckP -obv -ckP -glz -dux -qyH -vHP -dux -mnS -dux -dux +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa lMJ cej aaa @@ -89586,33 +89183,33 @@ alK otq qAO vAs -cga -rAF -odU -odU -odU -rAF -cga -lMJ -aaf -lMJ -lMJ -fwb -dux -ctn -tSO -diI -dux -uYL -jnW -dux -dux -dux -dux -dux -dux +dux +dux +ckN +ckN +dux +dux +dux +ckN +ckN +ckN +ckN +ckN lMJ aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa gka aaa cue @@ -89843,31 +89440,31 @@ alK alK lZn alK -cga -npl -cZs -cZs -cZs -dVT -snr -cga -odU -odU -odU -cga -cga -cga -cga -cga -cga -cga -cnl dux -aaf -aaf -aai -anT -nYJ +ppz +cpQ +cnh +mTs +fht +kfZ +ckN +dwr +oKP +cjt +ckN +ckN +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa gka @@ -90100,25 +89697,25 @@ alK kPN wVo alC -cga -ibr -cmB -cmB -cmB -tBC -vub -qJK -cZs -cZs -cZs -eRo -cZs -cZs -cZs -cZs -dVT -cga -eqt +dux +tCB +wOn +wOn +wfq +wOn +ckP +ckP +auR +cjt +crh +vDb +ckN +ckN +aaf +aaa +aaa +aaf +nOl dux bTn bTn @@ -90357,25 +89954,25 @@ nfn bbL bbL auF -cga -mxt -cmB -cmB -gcu -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -gcu -cmB -tQS -cga -nPC +dux +eew +wfq +wOn +wOn +wOn +jYJ +cjt +dbq +ckQ +wYq +ckP +qNO +ckN +aaf +aaf +aaf +dux +dux wkM bTn bUN @@ -90613,26 +90210,26 @@ ycH alC eEU aob -bXy -cga -ibr -cmB -cmB -fwL -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -fwL -cmB -wij -cga -nPC +sMV +dux +cjs +tOc +tOc +ckR +cmh +cnj +tTw +ckP +ckP +ckP +ckP +eOp +ckN +aaa +aaa +aaa +dux +bXE reI bTn bUO @@ -90871,25 +90468,25 @@ alK alK alK alK -hLm -ibr -cmB -cmB -fwL -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -cmB -fwL -cmB -wij -cga -nPC +dux +wGG +ckP +tTw +cjt +eSY +diJ +ckP +ckS +ckP +ckP +wYq +eSY +ckN +aaa +aaa +aaa +dux +bXE uqB bTp vhx @@ -91128,25 +90725,25 @@ alK hdh aob dix -cga -kyW -cmB -cmB -vZx -pej -pej -pej -pej -sAd -pej -pej -pej -pej -gUb -cmB -wij -snr -nPC +dux +eDt +eSY +ckP +ckP +dvt +csf +bXE +ckP +ckP +ckS +ckP +ckN +ckN +aaa +aaa +aaa +dux +bXE dux bTn bTn @@ -91385,25 +90982,25 @@ bTr bUQ bVT aob -cga -mxt -cmB -cmB -qnE -liQ -liQ -liQ -ubF -khy -liQ -liQ -liQ -liQ -qhK -cmB -hwW -cga -luh +dux +cxQ +cjt +ckS +ckP +ckP +cdg +ckP +ckP +ckP +ckP +ckP +wOA +dux +aaf +aaf +aaf +dux +bXE sof fvT uOc @@ -91642,24 +91239,24 @@ alK bJs bVU bXx -cga -ibr -cmB -cmB -dZG -cmB -cmB -cmB -flJ -fwL -cmB -cmB -cmB -cmB -dZG -cmB -jPu -cga +dux +nZb +qNO +ckP +obv +ckP +woz +ptP +ckP +ckP +ybh +uet +dux +dux +aaa +aaa +aaa +dux cxR nPC ceu @@ -91899,24 +91496,24 @@ alK bUR alK alK -cga -dCy -cjV -hOP -pjP -cjV -cjV -jOR -eAa -fwL -mRT -ljF -kBT -eEV -mRT -kBT -omB -cga +dux +ctn +tSO +diI +dux +uYL +jnW +dux +qyH +vHP +dux +mnS +dux +lMJ +aaa +aaa +aaa +dux ceu nPC dux @@ -92156,24 +91753,24 @@ alK alK alK bXy -cga -cga -cga -cga -cga -cga -cga -cga -pcL -wQV -avr -cga -tRO -oFI -iGO -tRO -cga -cga +dux +dux +dux +dux +dux +dux +xKe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +cCe +dux cLI nPC dux @@ -92181,6 +91778,11 @@ anT aaf aaf aaf +aaf +aaf +aaf +aaf +aaf aai anT anT @@ -92263,11 +91865,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (62,1,1) = {" aaa @@ -92419,17 +92016,17 @@ pai eEu uOc mSk -cbp -cga -rfi +jdp +cCe +cCk qUR -hFj -snr -eEi -kKo -tBC +cCj +cCj +cCj +vej +cCj fkj -cga +cCe sfQ bXE nPC @@ -92438,6 +92035,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa aaf aaa aaf @@ -92520,11 +92122,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (63,1,1) = {" aaa @@ -92677,24 +92274,29 @@ dux dux dux nPC -cga +cCe nnV fwL -dnp +cCj hLm mZA -clu -cmB -xTm -cga -ceu -dvt +aae +cCj +hLm +cCe +dux +pwn nPC ckN aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cBR cBR @@ -92777,11 +92379,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (64,1,1) = {" aaa @@ -92936,22 +92533,27 @@ wen jdp qit klh -jUk -qpg -uFC -djY -gcu -cmB -sDj -cga -cga -dux -oZs +cCj +cCj +hLm +mZA +cCj +cCg +hLm +cCe +slf +bXE +nPC ckN aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCK cDA @@ -93034,11 +92636,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (65,1,1) = {" aaa @@ -93191,17 +92788,17 @@ dux cen dux cbq -cga +cCe bcc rLL -hvf -yih -tTR -gOM -laN -ndC -xZy -cga +cCj +hLm +mZA +cCj +cxw +hLm +cCe +cCe hdX nPC ckN @@ -93209,6 +92806,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCL cDB @@ -93291,11 +92893,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (66,1,1) = {" aaa @@ -93448,17 +93045,17 @@ cdb ceo dux cdc -cga +cCe diF nap qZf nDf -nWX -xHr -xHr -wpK +cCj +cCj +cCj +cCj eSm -cga +cCe ceu nPC ckN @@ -93466,6 +93063,11 @@ aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa dBN dBO cDC @@ -93548,11 +93150,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (67,1,1) = {" aaa @@ -93705,17 +93302,17 @@ oZg dux dux csT -cga -vRF +cCe +cxp riP -cga -cga -gAj -cmB -cnJ -cmB -cqt -cga +cCe +cCe +cCX +cCj +cCj +cCj +cCj +cCe jNy nPC dux @@ -93723,6 +93320,11 @@ aaf aaf aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cCM cDD @@ -93805,11 +93407,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (68,1,1) = {" aaa @@ -93966,13 +93563,13 @@ snr ovU jkQ fJl -snr +cCe mrv -aGp +tFJ hev -mtp -vQt -cga +tFJ +tFJ +cCe oXP jUe dux @@ -93980,6 +93577,11 @@ dux dux aaf aaf +aaf +aaf +aaf +aaf +aaf cBR cCK cDA @@ -94062,11 +93664,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (69,1,1) = {" aaa @@ -94219,17 +93816,17 @@ cde dux dux cdc -cga +cCe oSw jkQ lVu -cga -cga -cga -cga -cga -cga -cga +cCe +cCe +cCe +cCe +cCe +cCe +cCe ceu jUe bXE @@ -94237,6 +93834,11 @@ dvq dux aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cBR cBS @@ -94267,11 +93869,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa aac aaa aaa @@ -94495,6 +94092,11 @@ dux aaf aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDF cEI @@ -94576,11 +94178,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (71,1,1) = {" aaa @@ -94752,6 +94349,11 @@ dux aaf aaf aaf +aaf +aaf +aaf +aaf +aaf dBN cDG cEJ @@ -94833,11 +94435,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (72,1,1) = {" aaa @@ -95009,6 +94606,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDH cEK @@ -95090,11 +94692,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (73,1,1) = {" aaa @@ -95266,6 +94863,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa dBN cDI cEL @@ -95347,11 +94949,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (74,1,1) = {" aaa @@ -95523,6 +95120,11 @@ dux aaa aaa aaa +aaa +aaa +aaa +aaa +aaa cBR cDJ cEM @@ -95604,11 +95206,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (75,1,1) = {" aaa @@ -95780,7 +95377,12 @@ dux aaf aaf aaf -cBR +aaf +dux +dux +dux +dux +cEE cBR cBR cFJ @@ -95861,11 +95463,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (76,1,1) = {" aaa @@ -96037,12 +95634,22 @@ dux aaa aaa aaa -aaf aaa +dux +rMg +wyn +lMT +hkT +dux aaa cFK cGC cBS +aaa +aaf +aaa +aaa +aaa cIy aaf aaa @@ -96057,16 +95664,6 @@ aaa aaa aaa aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -96294,8 +95891,13 @@ dux aaf aaa aaa -aaf aaa +dux +gDK +mci +bXE +rMb +dux aaa cFK cGD @@ -96375,11 +95977,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (78,1,1) = {" aaa @@ -96553,6 +96150,11 @@ dux dux dux dux +smJ +rig +bXE +sqe +dux aaa cFK cGE @@ -96632,11 +96234,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (79,1,1) = {" aaa @@ -96810,6 +96407,11 @@ ceu cBT cfF dux +dux +vXt +frA +dux +dux dzK cFJ cGF @@ -96889,11 +96491,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (80,1,1) = {" aaa @@ -97067,6 +96664,11 @@ cse cdj cdj cvl +dux +wgZ +klB +dux +lfv dzK cFL cGG @@ -97146,11 +96748,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (81,1,1) = {" aaa @@ -97323,7 +96920,12 @@ csr cxU cxU cxU -dyg +dyj +dux +cnl +nOl +dux +dux dzK cFM cGs @@ -97403,11 +97005,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (82,1,1) = {" aaa @@ -97580,7 +97177,12 @@ czO cAS cBU cxU -dDB +cNm +gnT +fqC +cdj +cdj +cvl dzK cFN cGH @@ -97660,11 +97262,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (83,1,1) = {" aaa @@ -97837,6 +97434,11 @@ czP cAT cBV cxU +cxU +cxU +khX +cxU +cxU dyj dzK cBR @@ -97917,11 +97519,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (84,1,1) = {" aaa @@ -98094,6 +97691,11 @@ czQ cAU diN cxU +niB +ooS +rhZ +ljG +cxU dyg dux cFO @@ -98174,11 +97776,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (85,1,1) = {" aaa @@ -98351,6 +97948,11 @@ czR cAV cBW cxU +qzx +cFR +lbB +tNc +cxU cDN cEN cFP @@ -98431,11 +98033,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (86,1,1) = {" aaa @@ -98608,6 +98205,11 @@ czS cAW cBX cxU +wDN +xyV +hAu +quD +cxU cDO cxU cxU @@ -98638,11 +98240,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa aac aaa aaa @@ -98865,9 +98462,14 @@ czT cAX cxU cxU +cxU +gfS +gfS +cxU +cxU cDP cxU -cFQ +jTg cGJ cHB cxU @@ -98945,11 +98547,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (88,1,1) = {" aaa @@ -99122,11 +98719,16 @@ czU cAY cBY cCN -cDQ +sfI +mUz +mUz cEO +sfI +cDQ +oTW cFR cGM -cHC +frX cxU cJq cKs @@ -99202,11 +98804,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (89,1,1) = {" aaa @@ -99373,11 +98970,16 @@ cup cvr cwt cxj -cxj +kNI cyT czV cAZ cBZ +uzf +uzf +uzf +uzf +uzf cCO cDR cEP @@ -99459,11 +99061,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (90,1,1) = {" aaa @@ -99635,11 +99232,16 @@ cyU czW cBa cCa +cyU +cyU +cyU +pyi +cyU cCP cDS cEQ cFT -cGO +cxj cHE cxU cJs @@ -99716,11 +99318,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (91,1,1) = {" aaa @@ -99884,23 +99481,28 @@ cmu csw cmu cmu -cvt -cvt +cga +nBI cxl -cxY -cvt -cvt -cvt -cxU -cCQ +mvB +gjP +cga +cga +tRK +cga +cga +cga +cga +cga +lfR cDT -cxU -bTs -cGP -bTs -bTs -bTs -bTs +odU +cga +cga +cga +rAF +rAF +rAF cgJ cLa cML @@ -99973,11 +99575,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (92,1,1) = {" aaa @@ -100146,18 +99743,23 @@ cwv cxm cxZ cyV +irZ +spa czX -cvt -cCb -cCR +czX +czX +pvt +spa +nnI +hox cDU cER -bTs -cGQ +fRZ +czX cHF cIA cJt -bTs +rAF cLg cMb cMM @@ -100230,11 +99832,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (93,1,1) = {" aaa @@ -100399,22 +99996,27 @@ csy cty cmu cvv -cww -cxn -cya -cyW -czY -cBb -cCc -cCS -cDV -cES -bTs -cGR -cHG -cIB +cmB +flJ +gcr +cmB +pej +cmB +cmB +cmB +cmB +cmB +cmB +cmB +oqv +cDW +cmB +clu +cmB +cmB +clu cJu -bTs +rAF ctK cLa cMN @@ -100487,11 +100089,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (94,1,1) = {" aaa @@ -100655,23 +100252,28 @@ crA csz ctz cmu -cvw -cwx +cus +cmB cxo -cyb -cyX -czZ -cvt -cCd -cCT -cDW -cET -bTs +xNX +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cya +eNA +cmB +mRT cGS cHH -cIC +kBT cJv -bTs +rAF cgJ cLa cMO @@ -100744,11 +100346,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (95,1,1) = {" aaa @@ -100910,25 +100507,30 @@ coR cqo crB csA -cCe -cCe -cCe -cCe -cxp -cyc -cCe -cCe -cCe -cCe -cCe +cga +cga +cus +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cDX -cCe -cCe -cCe -bTs -bTs -cJw -bTs +cmB +vqw +rAF +rAF +rAF +rAF +rAF cLi cLa cMP @@ -101001,11 +100603,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (96,1,1) = {" aaa @@ -101167,21 +100764,26 @@ coS cqn crC csB -cCe +cga cCf -cCj -cCf -cxq -cCj -cyY -cCf -cCj -cCf -cCU -cDY -cEU -cCf -cCe +kKo +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDX +cmB +wij +rAF cHI cID cJx @@ -101258,11 +100860,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (97,1,1) = {" aaa @@ -101424,21 +101021,26 @@ cmu cqp cmu cmu -cCe +rAF cus -cCj -cCj +cmB +cmB cxr -cCj -cCj -cCj -cCj -cCg -cCV -cDZ -cCj -cCj -cCe +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +vqw +rAF cgJ bTs bTs @@ -101515,11 +101117,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (98,1,1) = {" aaa @@ -101681,21 +101278,26 @@ cbu cqq crD csC -cCe -cCj -cCj -cCj -cxs -cCj -cCj -cCj -cCj -cCj -cCj -cDY -aae -cCj -cCe +rAF +waj +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +vqw +rAF cHJ bTs cJy @@ -101772,11 +101374,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (99,1,1) = {" aaa @@ -101938,21 +101535,26 @@ uGS uGS uGS csD -cCe -dbr -cCj -tFJ -acl -cCj -tFJ -tFJ -cCj -dbr -tFJ +rAF +cuu +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB dDC -tFJ -cFU -cCe +cmB +vqw +rAF ctK bTs cJz @@ -102029,11 +101631,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (100,1,1) = {" aaa @@ -102195,21 +101792,26 @@ coT cqr uGS csE -cCe -cCf -cCj -cCf -cxq -cyh -cCf -cCf -cCj -cCf -cCf -cDY -cCf -cCf -cCe +rAF +meP +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cDW +cmB +gxB +rAF diC bTs cJA @@ -102286,11 +101888,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (101,1,1) = {" aaa @@ -102452,21 +102049,26 @@ coU cqs crE csF -cCe -ctA -cCj -cCj -cxv +sWX +cus +cmB +cmB +cwx cyi -cvB -cCj -cCj -cCj -cCj +qhK +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cEb cEV cFV -cCe +rAF cHK bTs cPb @@ -102543,11 +102145,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (102,1,1) = {" aaa @@ -102709,19 +102306,24 @@ coV xgQ uGS cKJ -cCe +rAF cuw -cCj -cCj -cxw -cCg -cxs -cCj -cCj -cCj -cCX -cEc -cEW +cmB +cmB +cmB +cmB +flJ +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB +cmB cFW cGT cHL @@ -102800,11 +102402,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (103,1,1) = {" aaa @@ -102966,21 +102563,26 @@ coW cqu uGS csH -ctC -cCj -cCj -cCj -cCj -cCj -cxs -cCj -cvE -cCk +rAF +cus +cmB +cmB +cmB +cmB +flJ +mRT +kBT +nMs cCY -cEd -cEX +sQR +kBT +cjV +cjV +oOy +cmB +mRT cFX -cCe +rAF cxL bTs cJC @@ -103057,11 +102659,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (104,1,1) = {" aaa @@ -103223,21 +102820,26 @@ coX cnL uGS cbC -cCe -tFJ -cvE -tFJ -tFJ -cCj +rAF +exA +hOP +cjV +cjV +cjV acl -tFJ -cCe -cCe -cCe -cCe -cEY -cCe -cCe +wDc +rAF +rAF +rAF +rAF +rAF +rAF +rAF +rdB +cjV +snq +rAF +rAF cgN bTs cJD @@ -103314,11 +102916,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (105,1,1) = {" aaa @@ -103481,19 +103078,24 @@ coY uGS csI ctD -cCe -cvF -cCe -cCe -cym -cxp -cCe -cBd +rAF +rAF +vQD +vxU +rAF +tTj +rAF +cIH cCl cCZ cEf -cEZ cFY +cFY +riD +vQD +vxU +rAF +rAF bTs cHM ctH @@ -103571,11 +103173,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (106,1,1) = {" aaa @@ -103751,6 +103348,11 @@ chg cEg cFa cFZ +chg +ejE +nry +chg +kJl cGU cHN cIE @@ -103828,11 +103430,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (107,1,1) = {" aaa @@ -104009,6 +103606,11 @@ car cFb car car +iUh +car +car +car +car car cIF cJF @@ -104085,11 +103687,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (108,1,1) = {" aaa @@ -104266,6 +103863,11 @@ cEh cFc chh chh +kQx +chh +fCG +chh +chh cvG cIG cJG @@ -104342,11 +103944,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (109,1,1) = {" aaa @@ -104524,9 +104121,14 @@ cCq cCq cCq cCq -cIH cCq cCq +cCq +wtq +wtq +sjZ +wtq +wtq cLv cPb cMZ @@ -104599,11 +104201,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (110,1,1) = {" aaa @@ -104784,6 +104381,11 @@ cHP cII cJH cCq +qVW +kWn +wOE +vBx +wtq cLw cPb cNa @@ -104856,11 +104458,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (111,1,1) = {" aaa @@ -105041,6 +104638,11 @@ cHQ cIJ cYc cCq +deh +uHM +wOE +gyL +wtq cLx cPb cNb @@ -105113,11 +104715,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (112,1,1) = {" aaa @@ -105298,6 +104895,11 @@ cHR cIK cJJ cCq +wtq +wtq +wtq +tsU +wtq cgM cPb cNc @@ -105370,11 +104972,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (113,1,1) = {" aaa @@ -105555,7 +105152,12 @@ cHR cIL cJK cCq -cgM +oBk +mKb +mKb +sqL +mKb +fSV cPb cNd cNS @@ -105627,11 +105229,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (114,1,1) = {" aaa @@ -105813,6 +105410,11 @@ cIM cJL cKG cLy +wtq +wtq +wtq +wtq +sEG cPb cPb cPb @@ -105884,11 +105486,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (115,1,1) = {" aaa @@ -106070,7 +105667,12 @@ cIN cJM cCq cgM -gNe +wtq +jVH +fxT +ulz +oLd +kWn cwc cNe cNT @@ -106141,11 +105743,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (116,1,1) = {" aaa @@ -106327,6 +105924,11 @@ cFh cFh cKH cLy +wtq +moz +wOE +wtq +ryw wFH cMk wtq @@ -106398,11 +106000,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (117,1,1) = {" aaa @@ -106584,6 +106181,11 @@ cIO cJN cCq pYC +wtq +gkW +xLF +wtq +wOE cMl wOE wtq @@ -106655,11 +106257,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (118,1,1) = {" aaa @@ -106844,11 +106441,11 @@ cLA wtq wtq wtq -aaf -aaa -aaa -aaa -aaa +wtq +wtq +wtq +wtq +wtq aaa aaa aaa @@ -107100,7 +106697,7 @@ cKI cQr cQR cRa -cSd +cRe cRe cRe cRe @@ -107357,9 +106954,9 @@ cPX cQt cQZ cRc -cRf +xgL cYT -cRg +tCe cYT cYT djg @@ -110442,7 +110039,7 @@ dvY dvY diW cNX -dBe +ciL cPj dvY aaa diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index cffdfbd732d..095f6cb8872 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -88,98 +88,88 @@ /turf/closed/wall, /area/mine/laborcamp) "ar" = ( -/obj/structure/table, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "as" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, -/turf/open/floor/plasteel/white, +/obj/machinery/shower{ + pixel_y = 22 + }, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "at" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/machinery/camera{ - c_tag = "Labor Camp Medical"; - dir = 8; - network = list("labor") +/obj/machinery/shower{ + pixel_y = 22 }, -/turf/open/floor/plasteel/white, +/obj/item/soap/nanotrasen, +/obj/item/bikehorn/rubberducky/plasticducky, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "au" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "av" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/flashlight, -/obj/item/pickaxe, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, /turf/open/floor/plasteel, /area/mine/laborcamp) "aw" = ( /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"ax" = ( -/turf/open/floor/plasteel/white, -/area/mine/laborcamp) "ay" = ( -/obj/machinery/light/small{ - dir = 4 +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 8; + name = "old sink"; + pixel_x = 12 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "az" = ( /turf/open/floor/plasteel, /area/mine/laborcamp) "aA" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light/small{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Library"; + dir = 8; + network = list("labor") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 8 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aB" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Infirmary" +/obj/machinery/door/airlock/public/glass{ + name = "Showers" }, -/turf/open/floor/plasteel/white, -/area/mine/laborcamp) -"aC" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/freezer, /area/mine/laborcamp) "aD" = ( /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) "aE" = ( -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom (General)"; - pixel_y = 24; - prison_radio = 1 +/obj/machinery/vending/sustenance, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aF" = ( /obj/machinery/door/airlock{ - name = "Labor Camp Storage" + name = "Labor Camp Library" }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp) "aG" = ( @@ -189,93 +179,63 @@ /turf/open/floor/plasteel, /area/mine/laborcamp) "aH" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 5 }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aI" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Labor Camp External Access" +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aJ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aK" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aL" = ( /obj/machinery/door/airlock{ - name = "Vending" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aM" = ( -/obj/machinery/light/small, -/obj/effect/turf_decal/loading_area{ - dir = 4 + name = "Unisex Restroom" }, /turf/open/floor/plasteel, /area/mine/laborcamp) "aN" = ( -/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/mine/laborcamp) "aO" = ( -/obj/machinery/camera{ - c_tag = "Labor Camp External"; - dir = 4; - network = list("labor") +/obj/structure/sign/poster/official/do_not_question{ + pixel_y = 32 }, -/turf/open/floor/plating/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"aP" = ( -/obj/machinery/vending/sustenance, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"aQ" = ( -/obj/machinery/light/small{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/mine/laborcamp) -"aR" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/white, +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light, +/turf/open/floor/plasteel, /area/mine/laborcamp) "aS" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/turf/open/floor/plating, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/item/seeds/wheat, +/obj/item/seeds/wheat, +/obj/item/seeds/tomato, +/obj/item/seeds/onion, +/obj/item/seeds/garlic, +/obj/item/seeds/carrot, +/obj/item/seeds/ambrosia, +/obj/item/seeds/apple, +/turf/open/floor/plasteel, /area/mine/laborcamp) "aT" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/explored) -"aU" = ( -/obj/machinery/flasher{ - id = "labor" - }, -/turf/closed/wall, -/area/mine/laborcamp) "aV" = ( /obj/effect/turf_decal/tile/purple{ dir = 4 @@ -286,10 +246,18 @@ /turf/open/floor/plasteel, /area/mine/eva) "aW" = ( -/obj/machinery/conveyor{ - id = "gulag" +/obj/machinery/biogenerator, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "aX" = ( /obj/structure/closet/crate, @@ -315,6 +283,7 @@ pixel_y = 28; req_access_txt = "2" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "ba" = ( @@ -322,33 +291,36 @@ id = "labor"; name = "labor camp blast door" }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) -"bb" = ( -/obj/machinery/camera{ - c_tag = "Labor Camp Central"; - network = list("labor") - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 6 - }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bc" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/carrot, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bd" = ( /obj/machinery/mineral/processing_unit_console, /turf/closed/wall, /area/mine/laborcamp) "be" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green, +/obj/item/seeds/soya, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bf" = ( /turf/closed/wall, @@ -368,27 +340,44 @@ /obj/machinery/status_display/evac{ pixel_y = 32 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bk" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "bl" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/plant_analyzer, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bm" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "gulag" +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 8 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/onion, +/turf/open/floor/plasteel/dark, /area/mine/laborcamp) "bn" = ( /obj/structure/table, @@ -2328,6 +2317,16 @@ /obj/structure/stone_tile/block, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"gp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "gr" = ( /obj/structure/stone_tile{ dir = 1 @@ -2486,11 +2485,27 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) -"hN" = ( +"hL" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"hN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) "ia" = ( @@ -2606,6 +2621,12 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "jg" = ( /obj/structure/stone_tile, /obj/structure/stone_tile/cracked{ @@ -2666,6 +2687,13 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "ju" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -2682,6 +2710,19 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"jz" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "jF" = ( /obj/structure/stone_tile/surrounding_tile, /obj/structure/stone_tile/surrounding_tile{ @@ -2770,6 +2811,27 @@ /obj/structure/fluff/drake_statue/falling, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"km" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 1; + name = "old sink"; + pixel_y = -5 + }, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"kn" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "gulag"; + name = "labor camp conveyor" + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "ko" = ( /obj/structure/stone_tile/block/cracked{ dir = 8 @@ -3040,6 +3102,15 @@ }, /turf/open/lava/smooth/lava_land_surface, /area/lavaland/surface/outdoors) +"lK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Operations"; + dir = 8; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "lO" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -3486,11 +3557,88 @@ }, /turf/open/indestructible/boss, /area/lavaland/surface/outdoors) +"nj" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 1"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nm" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + name = "old sink"; + pixel_y = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"nn" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nt" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"nF" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Infirmary" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"nH" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External South"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) "nI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /turf/open/floor/plating, /area/mine/living_quarters) +"nU" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "gulag" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/plasticflaps, +/turf/open/floor/plating, +/area/mine/laborcamp) +"ob" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "oL" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -3506,6 +3654,14 @@ /obj/item/gps/mining, /turf/open/floor/plasteel, /area/mine/living_quarters) +"oS" = ( +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "oU" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -3533,6 +3689,21 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/production) +"pr" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"pR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "pV" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -3540,15 +3711,97 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"qk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + id_tag = "cellblock1"; + name = "Labor Camp Cellblock" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "qt" = ( /obj/structure/table, /obj/item/cigbutt, /turf/open/floor/plasteel, /area/mine/living_quarters) +"qI" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"qP" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"ri" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "rj" = ( /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/living_quarters) +"rG" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag1"; + name = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"rH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-05" + }, +/obj/machinery/camera{ + c_tag = "Labor Camp Cellblock"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "sa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -3562,6 +3815,14 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/mine/production) +"sq" = ( +/obj/machinery/door/airlock/external{ + glass = 1; + name = "Labor Camp External Airlock"; + opacity = 0 + }, +/turf/open/floor/plating, +/area/mine/laborcamp) "ss" = ( /obj/machinery/button/door{ id = "miningbathroom"; @@ -3593,11 +3854,29 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plasteel, /area/mine/production) +"sK" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "sM" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/laborcamp/security) +"tw" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "tI" = ( /obj/machinery/light/small{ dir = 4 @@ -3607,11 +3886,40 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) -"tY" = ( -/turf/closed/mineral/random/labormineral/volcanic, -/area/lavaland/surface/outdoors/explored) -"tZ" = ( +"tL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"tP" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"tZ" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"ut" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"uB" = ( +/obj/structure/chair/stool, +/obj/structure/sign/poster/official/report_crimes{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "uG" = ( @@ -3637,16 +3945,55 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"vg" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "vh" = ( /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/sign/poster/official/twelve_gauge{ + pixel_y = 32 + }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"vj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "vq" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"vs" = ( +/obj/structure/sign/warning/docking{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"vH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"vM" = ( +/obj/machinery/mineral/processing_unit{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) "vW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -3660,10 +4007,60 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"wE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"wQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "xi" = ( /obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/mine/living_quarters) +"xW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"xX" = ( +/obj/structure/sign/departments/medbay/alt{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"yh" = ( +/obj/structure/sign/poster/official/safety_report{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Central"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"yi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "yk" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -3674,6 +4071,21 @@ "yr" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp) +"yw" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 3"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "za" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -3733,12 +4145,25 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"AH" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "AW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"Bd" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External West"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) "Be" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, @@ -3751,6 +4176,51 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Bj" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag2"; + name = "Cell 2" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Bt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"BA" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"BL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Co" = ( /obj/machinery/computer/shuttle/mining/common{ dir = 4 @@ -3774,6 +4244,54 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Di" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Dr" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) +"Dv" = ( +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Dw" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 1"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Ef" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"En" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Es" = ( /obj/machinery/door/window/southright, /obj/machinery/shower{ @@ -3791,6 +4309,18 @@ /obj/structure/cable, /turf/open/floor/plasteel, /area/mine/living_quarters) +"EK" = ( +/obj/machinery/conveyor{ + id = "gulag" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) +"EY" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Fd" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red, @@ -3819,10 +4349,35 @@ /obj/structure/cable, /turf/open/floor/plating, /area/mine/laborcamp/security) +"FO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/public/glass{ + id_tag = "cellblock1"; + name = "Labor Camp Operations" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Gf" = ( +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Gn" = ( /obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Gz" = ( +/obj/machinery/door/airlock/public/glass{ + id_tag = "gulag3"; + name = "Cell 3" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "GI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3852,6 +4407,24 @@ "Hd" = ( /turf/closed/wall/r_wall, /area/mine/laborcamp/security) +"Hi" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) +"Hj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Ho" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -3890,12 +4463,57 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/laborcamp) +"IJ" = ( +/obj/structure/fence{ + dir = 4 + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) "IK" = ( /obj/structure/toilet{ dir = 8 }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) +"Jd" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"Je" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Jf" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Jh" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/cultivator, +/obj/item/seeds/potato, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) +"Jx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Kb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3905,9 +4523,33 @@ /turf/open/floor/plasteel, /area/mine/living_quarters) "Kv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/mine/laborcamp) +"Kz" = ( +/obj/machinery/camera{ + c_tag = "Labor Camp External North"; + dir = 1; + network = list("labor") + }, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/mine/laborcamp) +"KD" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "Lg" = ( /obj/item/twohanded/required/kirbyplants/random, /obj/effect/turf_decal/tile/brown{ @@ -3931,6 +4573,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/eva) +"Na" = ( +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors/explored) "Nj" = ( /obj/machinery/door/airlock{ name = "Restroom" @@ -3960,6 +4605,60 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Om" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/mineral/labor_points_checker{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Oz" = ( +/obj/structure/table, +/obj/item/paper, +/obj/item/pen, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera{ + c_tag = "Labor Camp Cell 2"; + dir = 4; + network = list("labor") + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"OI" = ( +/obj/structure/table, +/obj/item/toy/cards/deck, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"OQ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"OX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Pa" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red, @@ -3975,6 +4674,30 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Pp" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Labor Camp Infirmary"; + dir = 8; + network = list("labor") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"Pr" = ( +/obj/structure/chair/stool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Pt" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -3985,10 +4708,48 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Px" = ( +/obj/effect/turf_decal/bot, +/obj/structure/ore_box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"PE" = ( +/obj/structure/closet/crate/internals, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "PL" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3, /turf/open/floor/plasteel, /area/mine/eva) +"Qg" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/flashlight, +/obj/item/pickaxe, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Qo" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "QN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -3998,6 +4759,13 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"QO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "QQ" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, @@ -4016,6 +4784,21 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"QX" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 3"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/obey{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Rx" = ( /obj/structure/cable, /turf/open/floor/plasteel, @@ -4040,6 +4823,34 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3, /turf/open/floor/plasteel, /area/mine/living_quarters) +"RY" = ( +/obj/structure/chair/stool, +/obj/machinery/flasher{ + id = "GulagCell 2"; + pixel_x = -28 + }, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer3{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Sd" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/decal/cleanable/dirt, +/obj/item/seeds/redbeet, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "SJ" = ( /obj/structure/statue{ desc = "A lifelike statue of a horrifying monster."; @@ -4050,6 +4861,16 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Tb" = ( +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom (General)"; + pixel_y = 24; + prison_radio = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Tn" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -4065,6 +4886,19 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/mine/living_quarters) +"TJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer3{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "TP" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -4091,6 +4925,21 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) +"Ur" = ( +/obj/structure/bookcase, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Uv" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/mine/laborcamp) "UA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ dir = 4 @@ -4117,6 +4966,16 @@ }, /turf/open/floor/plasteel, /area/mine/laborcamp/security) +"UO" = ( +/obj/machinery/mineral/unloading_machine{ + dir = 1; + icon_state = "unloader-corner"; + input_dir = 1; + output_dir = 2 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) "UQ" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -4140,6 +4999,65 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"UV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"UX" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"Vb" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"VA" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/mine/laborcamp) "VP" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -4157,6 +5075,13 @@ /obj/structure/lattice/catwalk, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/mine/living_quarters) +"We" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Wp" = ( /obj/docking_port/stationary{ dir = 8; @@ -4168,15 +5093,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"WA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock{ - name = "Labor Camp External Access" - }, -/turf/open/floor/plasteel, -/area/mine/laborcamp) "WB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -4185,6 +5101,7 @@ name = "Labor Camp Shuttle Security Airlock"; req_access_txt = "2" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "WC" = ( @@ -4194,6 +5111,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Labor Camp Shuttle Prisoner Airlock" }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) "WD" = ( @@ -4219,6 +5137,17 @@ }, /turf/open/floor/plasteel, /area/mine/production) +"Xb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "Xx" = ( /obj/structure/sign/poster/official/random{ pixel_y = 32 @@ -4241,6 +5170,33 @@ }, /turf/open/floor/plasteel, /area/mine/living_quarters) +"YG" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/sign/mining, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors/explored) +"YJ" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/mine/laborcamp) +"YV" = ( +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/flashlight, +/obj/item/clothing/glasses/meson, +/obj/item/mining_scanner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/mine/laborcamp) "YY" = ( /obj/machinery/camera{ c_tag = "Crew Area Hallway West"; @@ -4262,10 +5218,38 @@ }, /turf/open/floor/plasteel/freezer, /area/mine/living_quarters) -"Zn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{ - dir = 9 +"Zk" = ( +/obj/machinery/conveyor{ + dir = 10; + id = "gulag" }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/mine/laborcamp) +"Zn" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/donkpockets, +/turf/open/floor/plasteel, +/area/mine/laborcamp) +"Zs" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating, +/area/mine/laborcamp) +"ZD" = ( +/obj/machinery/light/small, +/obj/machinery/camera{ + c_tag = "Labor Camp Showers"; + dir = 1; + network = list("labor") + }, +/turf/open/floor/plasteel/freezer, +/area/mine/laborcamp) +"ZO" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/mine/laborcamp) @@ -8837,7 +9821,7 @@ aj aj aj aj -ab +aD aj aj aj @@ -8846,18 +9830,18 @@ aj aj aj aj -aj -aq -aq -aq -aq -aq +yr +ap +ap +ap +ap +yr aY -aq -aq -aq +yr +yr +yr bx -aq +yr aw aw aj @@ -9092,29 +10076,29 @@ an an an an -an -an -ab -ab -an -ab +aD +aD +aD +aD +aD +aD aj aj aj aj aj -ab -aq -aG -aK -aP +yr +vj +Pr +Pr +vj aq aZ aq ao aq -aJ -aq +Je +yr aD bZ aj @@ -9349,21 +10333,21 @@ an an an an -an -an -an -an -an -an -ab +aD +aD +aD +aD +aD +aD +aD aj aj aj -ab -ab -aq +aD +yr +Dv aH -az +ZO aQ aq WB @@ -9371,7 +10355,7 @@ aq bi aq WC -aq +yr bZ bZ bZ @@ -9606,28 +10590,28 @@ an an an an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD ap ap ap -aq -aq -aq -aL -aq +yr +vj +OI +aG +vj aq ba aq bj -az -az +vs +vj yr Hd Hd @@ -9863,28 +10847,28 @@ an an an an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD ap ar -ar +ZD aq +vj +vj +tP +vj +yh az -az -az -az -az -az -az +vj su -az -az +vj +aQ yr cb UJ @@ -10120,28 +11104,28 @@ an an an an -an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +aD +aD +Kz +yr as -ax +ar aB -az -az -az -az -aU -bb -tZ +vj +vj +ut +En +En +En +Di hN Iv -Iv +tL bL cc bw @@ -10378,27 +11362,27 @@ an an an an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +aD +aX +yr at ay aq aE -az +vj Kv -tZ +vj tZ Zn -aQ +Qo bk -az -az +EY +EY yr vh bh @@ -10635,24 +11619,24 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +ap +ap +yr aq aq aq aq -aq -az -az -aR -az +oS +BL +vj +VA bc -aq +Jh bl yr yr @@ -10892,25 +11876,25 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +Vb +YJ aq au -au -au +uB +Xb aq -az -aM -aq -aq -bd -aq -bl +Tb +Kv +vj +sK +Jd +wE +km yr by pV @@ -11149,24 +12133,24 @@ an an an an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +Bt +OQ aq av -az -az +xW +yi aF -az +Iv aN aS aW be -aW +Sd bm yr bB @@ -11405,22 +12389,22 @@ an an an an -an -an -an -an -an -an -an -an -aq +aD +aD +aD +aD +aD +ap +BA +Pp aq +Ur aA -aC aq -aI aq aq +qk +aq aq aq aq @@ -11662,27 +12646,27 @@ an an an an -an -an -an -an -an -an -an -an -an -aq -aq -aq -aq -az -aq -aT -aX -aX aD aD aD +aD +aD +yr +UX +aq +aq +aq +aq +aq +pr +aq +UV +rH +aq +nj +Dw +ap +nH aw FF zo @@ -11919,26 +12903,26 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -aq -aJ -aq +aD +aD +aD +aD aT -aD -aD -aD -aD +yr +UX +aq +YV +YV +YV +aq +nm +aJ +gp +En +rG +Jx +qP +ap aD aw FF @@ -12175,27 +13159,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an aD -aq -WA -aq +aD +aD +aD +aD aT -aD -aD -aD -aD +yr +nF +aq +Qg +vj +vj +aq +aq +aq +OX +jt +aq +aq +aq +yr aD aj aj @@ -12432,27 +13416,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an aD aD +aD +Dr +yr +yr +yr +jz +xX +jc +vj +vj +vj +PE +aq aO -aD -aD -aD -aD -aD +vj +aq +RY +Oz +ap aj aj aj @@ -12689,27 +13673,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD -aD -aD aD aD aD aD +sq +Zs +sq +vH +nt +tw +Jf +Px +vj +vj +aq +TJ +En +Bj +Hj +qP +ap aD aj aj @@ -12946,27 +13930,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD -aD aD aD aD +Dr +yr +yr +yr +hL +nn +Ef +qI +pR +En +En +FO +aN +vj +aq +aq +aq +yr aD aj aj @@ -13203,27 +14187,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD -aD aD aD aD aD +aX +ap +AH +vj +az +vj +We +vj +vj +vj +aq +Om +ri +aq +QX +yw +ap aD aj aj @@ -13460,27 +14444,27 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aD aD aD aD aD aD +ap +vj +vj +lK +vj +kn +wQ +az +QO +aq +qm +En +Gz +Jx +qP +ap aD aD aj @@ -13718,28 +14702,28 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an aD aD -aT -an aD -tY +aD +ap +Gf +ob +aq +aq +bd +aq +aq +nU +yr +qs +KD +yr +yr +yr +yr +aD +aD aj aj aj @@ -13975,29 +14959,29 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -tY -tY -tY +aD +aD +aD +aD +ap +Gf +vg +UO +EK +vM +EK +EK +Zk +yr +Uv +Hi +ap +aD +aD +aD +aD +aD +aD aj aj ai @@ -14232,29 +15216,29 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +ap +ap +ap +yr +yr +yr +yr +yr +yr +yr +ap +ap +ap +aD +aD +aD +aD +aD +aD aj aj ai @@ -14489,30 +15473,30 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +Bd +aD +aD +IJ +aD +aD +aD +aD +aD +aD +aD +aD +aD +aj aj -aw aj aj cM @@ -14745,31 +15729,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +YG +aD +aD +aD +aD +aD +aD +aD +aj +aj aj aj -aw -aw aj aj cM @@ -15002,31 +15986,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -ab +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +IJ +aD +aD +aD +aD +aD +aD +aj +aj aj aj aj -aw -aw aj aj cM @@ -15259,31 +16243,31 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +IJ +aD +aD +aD +aD +aD +aj +aj +aj +aj +ab ab -aj -aj -aj -aj -aD -aD aj ab cM @@ -15516,30 +16500,30 @@ an an an an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +Na +aD +aD +aD +aD aj aj aj ab -aD -aD +ab +ab ab ab ab @@ -15772,30 +16756,30 @@ aj aj ab an -an -an -an -an -an -an -an -an -an -an -an -an +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aD +aj +aj +aD +aD +aD +aj +aj +aj +ab +ab ab -aj -aj -an -an -an -aj -aj -aw -aD -aD -aD ab ab ab @@ -16035,22 +17019,22 @@ aj aj aj aj -an -an -an -an -an +aD +aD +aD +aD +aD aj aj aj aj aj +aD +aD +aj +aj ab ab -aw -aw -aD -aD ab ab ab diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index d6aac364302..e046ddae727 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2820,9 +2820,8 @@ /turf/open/floor/plasteel/white, /area/security/execution/transfer) "aiw" = ( -/obj/machinery/power/emitter/anchored{ - dir = 1; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 1 }, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -18932,8 +18931,8 @@ /area/hydroponics) "aWT" = ( /obj/machinery/light_switch{ - pixel_x = -4; - pixel_y = 30 + pixel_x = -6; + pixel_y = 38 }, /obj/structure/sink/kitchen{ name = "utility sink"; @@ -24469,7 +24468,7 @@ dir = 1 }, /obj/machinery/camera{ - c_tag = "Genetics Cloning Foyer"; + c_tag = "Ward Access"; network = list("ss13","medbay") }, /obj/machinery/atmospherics/components/unary/vent_pump/on, @@ -25334,12 +25333,12 @@ /area/maintenance/department/engine) "bnv" = ( /turf/closed/wall, -/area/medical/genetics) +/area/medical/medbay/zone2) "bnw" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ - name = "Cloning"; - req_one_access_txt = "5;9" + name = "Ward"; + req_one_access_txt = "5" }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -25691,20 +25690,20 @@ /obj/structure/flora/ausbushes/brflowers, /obj/structure/flora/ausbushes/ywflowers, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bos" = ( /obj/structure/flora/junglebush/large, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bot" = ( /obj/structure/flora/junglebush, /obj/structure/flora/ausbushes/brflowers, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bou" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/medical/genetics) +/area/medical/medbay/zone2) "bov" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/tile/blue{ @@ -25713,8 +25712,11 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bow" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -25726,7 +25728,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "box" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -25740,7 +25742,7 @@ }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "boy" = ( /obj/structure/closet/wardrobe/mixed, /obj/effect/turf_decal/tile/blue{ @@ -25750,7 +25752,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "boz" = ( /obj/machinery/vending/clothing, /obj/machinery/firealarm{ @@ -25763,8 +25765,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "boA" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/chair{ @@ -26141,11 +26144,11 @@ /obj/structure/flora/junglebush, /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpw" = ( /obj/structure/flora/grass/jungle, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpx" = ( /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -26156,9 +26159,8 @@ /obj/structure/flora/junglebush, /obj/structure/flora/junglebush/large, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpy" = ( -/obj/machinery/clonepod, /obj/item/radio/intercom{ frequency = 1485; name = "Station Intercom (Medbay)"; @@ -26167,42 +26169,39 @@ /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) -"bpz" = ( -/obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) +"bpz" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bpA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/medical/genetics) +/area/medical/medbay/zone2) "bpD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -26828,37 +26827,30 @@ dir = 8 }, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bqU" = ( /obj/structure/sink/puddle, /obj/structure/flora/ausbushes/reedbush{ pixel_y = 6 }, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bqV" = ( /obj/structure/flora/grass/jungle/b, /obj/machinery/light/small{ dir = 4 }, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bqW" = ( -/obj/machinery/computer/cloning{ - 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) +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bqX" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -26867,38 +26859,33 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bqY" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 23 - }, /obj/structure/cable, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bqZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) +"bqZ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bra" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ - id_tag = "GeneticsDoor"; - name = "Cloning"; - req_one_access_txt = "5;9" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 + name = "Ward"; + req_one_access_txt = "5" }, /obj/structure/disposalpipe/segment{ dir = 4 }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "brb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -27477,7 +27464,7 @@ /obj/structure/flora/grass/jungle/b, /mob/living/simple_animal/butterfly, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsp" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -27496,11 +27483,10 @@ /obj/structure/flora/ausbushes/ppflowers, /mob/living/simple_animal/pet/dog/corgi/puppy, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsr" = ( -/obj/machinery/dna_scannernew, /obj/machinery/camera{ - c_tag = "Cloning Lab"; + c_tag = "Ward Fore"; dir = 4; network = list("ss13","medbay") }, @@ -27511,53 +27497,55 @@ /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) +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bss" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bst" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsu" = ( -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /obj/effect/spawner/structure/window, /turf/open/floor/plating, -/area/medical/genetics) +/area/medical/medbay/zone2) "bsx" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -27990,7 +27978,7 @@ }, /obj/machinery/door/airlock/research{ name = "Xenobiology Lab"; - req_one_access_txt = "55, 9" + req_one_access_txt = "9;55" }, /obj/structure/cable, /turf/open/floor/plasteel/dark, @@ -28137,71 +28125,41 @@ "btR" = ( /obj/structure/flora/ausbushes/brflowers, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "btS" = ( /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "btT" = ( /obj/structure/flora/junglebush, /obj/structure/flora/ausbushes/sunnybush, /turf/open/floor/grass, -/area/medical/genetics) -"btU" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "btV" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "btW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "btX" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/medical_cloning{ - pixel_y = 6 - }, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "btY" = ( /obj/structure/table, -/obj/item/storage/box/rxglasses{ - pixel_x = 3; - pixel_y = 3 - }, /obj/item/storage/box/bodybags, /obj/item/pen, +/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ - dir = 8 + dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "btZ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ @@ -28583,34 +28541,26 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "bvc" = ( -/turf/closed/wall/r_wall, -/area/medical/genetics) -"bvd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/structure/table, +/obj/item/storage/box/rxglasses{ + pixel_x = 3; + pixel_y = 3 }, +/obj/item/clothing/gloves/color/latex, +/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "GeneticsDoor"; - name = "Cloning"; - req_one_access_txt = "5;9" - }, /turf/open/floor/plasteel/white, -/area/medical/genetics) -"bve" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/medical/genetics) +/area/medical/medbay/zone2) +"bvd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "bvf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/camera{ @@ -29151,7 +29101,7 @@ "bwu" = ( /mob/living/simple_animal/pet/dog/corgi, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bwv" = ( /obj/machinery/airalarm{ pixel_y = 22 @@ -29168,56 +29118,25 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bwx" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/genetics) -"bwy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) -"bwz" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bwA" = ( /obj/structure/table, /obj/item/storage/box/bodybags, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bwB" = ( /obj/machinery/requests_console{ department = "Medbay"; @@ -29888,7 +29807,7 @@ "byd" = ( /obj/structure/flora/junglebush/c, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bye" = ( /obj/structure/window/reinforced{ dir = 4; @@ -29898,7 +29817,7 @@ dir = 4 }, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "byf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -29909,8 +29828,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "byg" = ( /turf/closed/wall/r_wall, /area/science/genetics) @@ -29918,22 +29838,20 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "byi" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) -"byj" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "byk" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, /obj/machinery/light{ dir = 4 }, @@ -29945,8 +29863,12 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "byl" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -30590,15 +30512,15 @@ dir = 8 }, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzF" = ( /obj/machinery/door/window/eastleft{ - name = "Monkey Pen"; - req_one_access_txt = "9" + name = "Petting Garden"; + req_one_access_txt = null }, /mob/living/simple_animal/pet/dog/corgi/puppy, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzG" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -30607,33 +30529,26 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) -"bzH" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzI" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/structure/bed, -/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzL" = ( /obj/structure/sink{ dir = 8; @@ -30647,7 +30562,7 @@ }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bzM" = ( /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" @@ -31100,14 +31015,14 @@ "bAN" = ( /obj/structure/flora/ausbushes/sparsegrass, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, /obj/machinery/light/small, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAP" = ( /obj/structure/window/reinforced{ dir = 4; @@ -31118,7 +31033,7 @@ }, /obj/structure/flora/ausbushes/palebush, /turf/open/floor/grass, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -31129,8 +31044,9 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAR" = ( /obj/effect/turf_decal/tile/purple{ dir = 8 @@ -31150,20 +31066,16 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 }, /obj/structure/cable, +/obj/structure/bed, +/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) -"bAU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAV" = ( /obj/machinery/shower{ dir = 8 @@ -31178,7 +31090,7 @@ }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bAW" = ( /turf/closed/wall, /area/medical/virology) @@ -31682,46 +31594,43 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/closet/wardrobe/pjs, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCa" = ( -/obj/structure/bed, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /obj/effect/turf_decal/tile/blue, -/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCb" = ( /obj/machinery/camera{ - c_tag = "Genetics"; + c_tag = "Ward Aft"; dir = 1; network = list("ss13","medbay") }, -/obj/structure/bed, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /obj/effect/turf_decal/tile/blue, -/obj/item/bedsheet/medical, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCc" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCd" = ( /obj/structure/cable, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCe" = ( /obj/machinery/power/apc{ dir = 4; - name = "Genetics APC"; + name = "Ward APC"; pixel_x = 24 }, /obj/structure/cable, @@ -31730,7 +31639,7 @@ }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bCf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -32304,7 +32213,7 @@ dir = 1 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bDm" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/machinery/light, @@ -32317,7 +32226,7 @@ }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bDn" = ( /obj/structure/closet/secure_closet/personal/patient, /obj/effect/turf_decal/tile/blue{ @@ -32328,7 +32237,7 @@ dir = 4 }, /turf/open/floor/plasteel/white, -/area/medical/genetics) +/area/medical/medbay/zone2) "bDo" = ( /obj/machinery/shower{ dir = 4 @@ -40948,6 +40857,14 @@ dir = 4 }, /obj/structure/cable, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 6 + }, /turf/open/floor/plasteel/dark, /area/engine/engine_smes) "bWA" = ( @@ -42812,9 +42729,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -43583,9 +43499,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 4 }, /obj/structure/cable, /turf/open/floor/plating, @@ -52159,9 +52074,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 +/obj/machinery/power/emitter/welded{ + dir = 8 }, /obj/structure/cable, /turf/open/floor/plating, @@ -52704,6 +52618,9 @@ /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/open/floor/plating, /area/maintenance/department/cargo) +"lku" = ( +/turf/closed/wall/r_wall, +/area/medical/medbay/zone2) "lms" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -53951,6 +53868,16 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) +"ofo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/wardrobe/mixed, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "ofN" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/blue, @@ -55719,6 +55646,17 @@ }, /turf/open/floor/engine, /area/engine/supermatter) +"spo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "spz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable, @@ -55981,15 +55919,6 @@ /obj/machinery/meter, /turf/open/floor/engine, /area/engine/engineering) -"sXb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/genetics) "sXi" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -56663,6 +56592,14 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"urO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/bed, +/obj/item/bedsheet/medical, +/turf/open/floor/plasteel/white, +/area/medical/medbay/zone2) "urP" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -82065,13 +82002,13 @@ bnv bou bnv bou -bvc +bnv bwv byf bzG bAQ bBZ -bvc +bnv bDi bEn bDi @@ -82321,14 +82258,14 @@ bov bpy bqW bsr -btU -bou +bqW +ofo bwx bpB -bzH +bjQ bAS bCa -bvc +bnv bEr bFH bEr @@ -82576,17 +82513,17 @@ bmi bjN bow bpz -sXb +bjQ bss btV -bou -bwx +bpz +bjQ byh bzI -bAS +urO bCb -bvc -bvc +bnv +lku bFI bGO bHU @@ -82837,13 +82774,13 @@ bqX bst btW bvd -bwy +btW byi bzJ bAT bCc bDl -bvc +lku bFJ bGP bHV @@ -83093,14 +83030,14 @@ bpB bqY bsu btX -bve -bwz -byj +btX +btX +btX bzK -bAU +btV bCd bDm -bvc +lku bFK bGQ bHX @@ -83346,7 +83283,7 @@ kSO bjL bjL boz -bpB +spo bqZ bsv btY @@ -83357,7 +83294,7 @@ bzL bAV bCe bDn -bvc +lku bFL bGR bHX @@ -83607,16 +83544,16 @@ bpC bra bsw bnv -bvc -bvc -bvc -bvc -bvc -bvc -bvc -bvc -bAW -bAW +bnv +bnv +bnv +bnv +bnv +bnv +bnv +lku +bEr +bEr bHY bGW bKn @@ -84651,7 +84588,7 @@ bKt qar bGW bNR -bAW +bEr bva bva pwj diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index eb8d233d0e8..63e7a22d273 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -1090,7 +1090,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/service) "eQ" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, @@ -1168,7 +1168,7 @@ /turf/open/floor/plating, /area/engine/storage) "hY" = ( -/obj/structure/fluff/railing/corner, +/obj/structure/railing/corner, /turf/open/floor/plating, /area/hallway/secondary/service) "ij" = ( @@ -1192,7 +1192,7 @@ /area/hallway/secondary/service) "iH" = ( /obj/effect/turf_decal/stripes/white/line, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 4 }, @@ -1216,8 +1216,7 @@ /turf/open/floor/plating, /area/engine/storage) "jD" = ( -/obj/structure/fluff/railing/corner{ - icon_state = "railing_corner"; +/obj/structure/railing/corner{ dir = 4 }, /turf/open/floor/plating, @@ -1312,12 +1311,18 @@ "qo" = ( /turf/open/openspace, /area/engine/storage) +"qx" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/construction) "qR" = ( /obj/effect/turf_decal/stripes/white/line{ icon_state = "warningline_white"; dir = 9 }, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 1 }, @@ -1346,7 +1351,7 @@ /turf/open/floor/plating, /area/construction) "su" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1357,7 +1362,7 @@ icon_state = "warningline_white"; dir = 4 }, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1447,11 +1452,11 @@ /turf/open/floor/plasteel, /area/construction) "zd" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 8 }, @@ -1475,7 +1480,7 @@ /turf/open/floor/plating, /area/engine/storage) "Ai" = ( -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 8 }, @@ -1531,8 +1536,7 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "CP" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 8 }, /turf/open/floor/plating, @@ -1555,7 +1559,7 @@ /area/engine/storage) "Eb" = ( /obj/effect/turf_decal/stripes/white/line, -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 1 }, @@ -1608,8 +1612,7 @@ /turf/open/floor/plasteel, /area/storage/primary) "In" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 4 }, /turf/open/floor/plating, @@ -1619,8 +1622,8 @@ /turf/open/floor/plating, /area/hallway/secondary/service) "IL" = ( -/obj/structure/fluff/railing/corner, -/obj/structure/fluff/railing/corner{ +/obj/structure/railing/corner, +/obj/structure/railing/corner{ icon_state = "railing_corner"; dir = 8 }, @@ -1668,7 +1671,7 @@ /turf/open/floor/plating, /area/maintenance/department/bridge) "Lu" = ( -/obj/structure/fluff/railing{ +/obj/structure/railing{ icon_state = "railing"; dir = 4 }, @@ -1699,8 +1702,7 @@ /turf/open/floor/plating, /area/engine/storage) "Pm" = ( -/obj/structure/fluff/railing/corner{ - icon_state = "railing_corner"; +/obj/structure/railing/corner{ dir = 1 }, /turf/open/floor/plating, @@ -1744,8 +1746,7 @@ /turf/open/floor/plasteel, /area/construction) "Tf" = ( -/obj/structure/fluff/railing{ - icon_state = "railing"; +/obj/structure/railing{ dir = 1 }, /turf/open/floor/plating, @@ -1795,7 +1796,7 @@ /turf/open/floor/plasteel, /area/hallway/secondary/service) "XN" = ( -/obj/structure/fluff/railing, +/obj/structure/railing, /turf/open/floor/plating, /area/hallway/secondary/service) "XQ" = ( @@ -1809,6 +1810,10 @@ }, /turf/open/floor/plating, /area/hallway/secondary/service) +"Zv" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating, +/area/construction) "ZH" = ( /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, @@ -2884,7 +2889,7 @@ dn dn dn dn -dn +Zv In jD dL @@ -2992,7 +2997,7 @@ dn dn dn dn -dn +qx CP Pm ij diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index af4fd9c60f9..b2b404f7289 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -826,7 +826,6 @@ /turf/open/floor/plasteel/cafeteria, /area/medical/medbay) "cK" = ( -/obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -1278,7 +1277,6 @@ /area/hallway/secondary/entry) "es" = ( /obj/machinery/light, -/obj/machinery/clonepod, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -1934,9 +1932,7 @@ pixel_x = 32 }, /obj/structure/cable, -/obj/machinery/computer/shuttle/mining{ - dir = 2 - }, +/obj/machinery/computer/shuttle/mining, /turf/open/floor/plasteel, /area/quartermaster/miningoffice) "gk" = ( @@ -2356,15 +2352,6 @@ }, /turf/open/floor/plasteel, /area/science) -"BB" = ( -/obj/machinery/computer/cloning{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white/corner, -/area/medical/medbay) "BD" = ( /obj/structure/closet/secure_closet/CMO{ locked = 0 @@ -2471,8 +2458,8 @@ height = 5; id = "mining_home"; name = "mining shuttle bay"; - width = 7; - roundstart_template = /datum/map_template/shuttle/mining/box + roundstart_template = /datum/map_template/shuttle/mining/box; + width = 7 }, /turf/open/floor/engine, /area/quartermaster/miningoffice) @@ -8404,7 +8391,7 @@ by Qt by cm -BB +cK by cS cS diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index 6e31e510179..e8a474161e7 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -2,5 +2,5 @@ "map_name": "MultiZ Debug", "map_path": "map_files/debug", "map_file": "multiz.dmm", - "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + "traits": [{"Up" : 1, "Linkage" : "Cross"}, {"Up" : 1, "Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}, {"Down" : -1, "Baseturf" : "/turf/open/openspace", "Linkage" : "Cross"}] } diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index f2fa6efcda3..99c046d21f2 100644 --- a/_maps/shuttles/emergency_zeta.dmm +++ b/_maps/shuttles/emergency_zeta.dmm @@ -67,7 +67,7 @@ "n" = ( /obj/structure/table/abductor, /obj/machinery/recharger, -/obj/item/abductor/baton{ +/obj/item/melee/baton/abductor{ desc = "Even aliens can see the use of a good old fashioned beating stick." }, /turf/open/floor/plating/abductor, @@ -221,18 +221,6 @@ /obj/machinery/sleeper/survival_pod, /turf/open/floor/plating/abductor, /area/shuttle/escape) -"K" = ( -/obj/machinery/dna_scannernew, -/turf/open/floor/plating/abductor, -/area/shuttle/escape) -"L" = ( -/obj/machinery/computer/prototype_cloning, -/turf/open/floor/plating/abductor, -/area/shuttle/escape) -"M" = ( -/obj/machinery/clonepod/experimental, -/turf/open/floor/plating/abductor, -/area/shuttle/escape) "N" = ( /obj/machinery/abductor/pad{ desc = "A funky looking disc, built into the floor." @@ -591,7 +579,7 @@ l l l c -K +l l l Y @@ -614,7 +602,7 @@ l l l c -L +l l l l @@ -637,7 +625,7 @@ l q s b -M +l O S Z diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 228d9e9fa22..3719ec84df2 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -103,10 +103,6 @@ #define TR_KEEPSTUNS (1<<9) #define TR_KEEPREAGENTS (1<<10) - -#define CLONER_FRESH_CLONE "fresh" -#define CLONER_MATURE_CLONE "mature" - //species traits for mutantraces #define MUTCOLORS 1 #define HAIR 2 diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index f84bee5a5af..4d73369a318 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -26,7 +26,7 @@ #define ACCESS_AI_UPLOAD 16 #define ACCESS_TELEPORTER 17 #define ACCESS_EVA 18 -/// Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, clone record deletion, comms console +/// Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, comms console #define ACCESS_HEADS 19 #define ACCESS_CAPTAIN 20 #define ACCESS_ALL_PERSONAL_LOCKERS 21 @@ -77,8 +77,6 @@ #define ACCESS_WEAPONS 66 /// NTnet diagnostics/monitoring software #define ACCESS_NETWORK 67 -/// Cloning room and clone pod ejection -#define ACCESS_CLONING 68 /// Pharmacy access (Chemistry room in Medbay) #define ACCESS_PHARMACY 69 ///Nice. diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 1a2ed41c69e..c922a86887e 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -146,6 +146,8 @@ #define SPACE_HELM_MAX_TEMP_PROTECT 1500 /// what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0. #define SPACE_SUIT_MIN_TEMP_PROTECT 2.0 +/// The min cold protection of a space suit without the heater active +#define SPACE_SUIT_MIN_TEMP_PROTECT_OFF 72 #define SPACE_SUIT_MAX_TEMP_PROTECT 1500 /// Cold protection for firesuits diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm new file mode 100644 index 00000000000..128c9f19387 --- /dev/null +++ b/code/__DEFINES/dcs/flags.dm @@ -0,0 +1,41 @@ +/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// `parent` must not be modified if this is to be returned. +/// This will be noted in the runtime logs +#define COMPONENT_INCOMPATIBLE 1 +/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` +#define COMPONENT_NOTRANSFER 2 + +/// Return value to cancel attaching +#define ELEMENT_INCOMPATIBLE 1 + +// /datum/element flags +/// Causes the detach proc to be called when the host object is being deleted +#define ELEMENT_DETACH (1 << 0) +/** + * Only elements created with the same arguments given after `id_arg_index` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) + +// How multiple components of the exact same type are handled in the same datum +/// old component is deleted (default) +#define COMPONENT_DUPE_HIGHLANDER 0 +/// duplicates allowed +#define COMPONENT_DUPE_ALLOWED 1 +/// new component is deleted +#define COMPONENT_DUPE_UNIQUE 2 +/// old component is given the initialization args of the new +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +/// each component of the same type is consulted as to whether the duplicate should be allowed +#define COMPONENT_DUPE_SELECTIVE 5 + +//Redirection component init flags +#define REDIRECT_TRANSFER_WITH_TURF 1 + +//Arch +#define ARCH_PROB "probability" //Probability for each item +#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount + +//Ouch my toes! +#define CALTROP_BYPASS_SHOES 1 +#define CALTROP_IGNORE_WALKERS 2 diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm new file mode 100644 index 00000000000..144e94f1fe0 --- /dev/null +++ b/code/__DEFINES/dcs/helpers.dm @@ -0,0 +1,15 @@ +/// Used to trigger signals and call procs registered for that signal +/// The datum hosting the signal is automaticaly added as the first argument +/// Returns a bitfield gathered from all registered procs +/// Arguments given here are packaged in a list and given to _SendSignal +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) + +#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) + +/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments +#define AddElement(arguments...) _AddElement(list(##arguments)) +/// A wrapper for _RemoveElement that allows us to pretend we're using normal named arguments +#define RemoveElement(arguments...) _RemoveElement(list(##arguments)) + +/// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments +#define AddComponent(arguments...) _AddComponent(list(##arguments)) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/dcs/signals.dm similarity index 91% rename from code/__DEFINES/components.dm rename to code/__DEFINES/dcs/signals.dm index 943e9c005e5..99637bb28c9 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -1,435 +1,391 @@ -/// Used to trigger signals and call procs registered for that signal -/// The datum hosting the signal is automaticaly added as the first argument -/// Returns a bitfield gathered from all registered procs -/// Arguments given here are packaged in a list and given to _SendSignal -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) - -#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) - -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. -/// `parent` must not be modified if this is to be returned. -/// This will be noted in the runtime logs -#define COMPONENT_INCOMPATIBLE 1 -/// Returned in PostTransfer to prevent transfer, similar to `COMPONENT_INCOMPATIBLE` -#define COMPONENT_NOTRANSFER 2 - -/// Return value to cancel attaching -#define ELEMENT_INCOMPATIBLE 1 - -// /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted -#define ELEMENT_DETACH (1 << 0) -/** - * Only elements created with the same arguments given after `id_arg_index` share an element instance - * The arguments are the same when the text and number values are the same and all other values have the same ref - */ -#define ELEMENT_BESPOKE (1 << 1) - -// How multiple components of the exact same type are handled in the same datum -/// old component is deleted (default) -#define COMPONENT_DUPE_HIGHLANDER 0 -/// duplicates allowed -#define COMPONENT_DUPE_ALLOWED 1 -/// new component is deleted -#define COMPONENT_DUPE_UNIQUE 2 -/// old component is given the initialization args of the new -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 -/// each component of the same type is consulted as to whether the duplicate should be allowed -#define COMPONENT_DUPE_SELECTIVE 5 - -// All signals. Format: -// When the signal is called: (signal arguments) -// All signals send the source datum of the signal as the first argument - -// global signals -// These are signals which can be listened to by any component on any parent -// start global signals with "!", this used to be necessary but now it's just a formatting choice -/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) -#define COMSIG_GLOB_NEW_Z "!new_z" -/// called after a successful var edit somewhere in the world: (list/args) -#define COMSIG_GLOB_VAR_EDIT "!var_edit" -/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) -#define COMSIG_GLOB_EXPLOSION "!explosion" -/// mob was created somewhere : (mob) -#define COMSIG_GLOB_MOB_CREATED "!mob_created" -/// mob died somewhere : (mob , gibbed) -#define COMSIG_GLOB_MOB_DEATH "!mob_death" -/// global living say plug - use sparingly: (mob/speaker , message) -#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" -/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) -#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" - #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 -/// ingame button pressed (/obj/machinery/button/button) -#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" - -// signals from globally accessible objects -/// from SSsun when the sun changes position : (azimuth) -#define COMSIG_SUN_MOVED "sun_moved" - -////////////////////////////////////////////////////////////////// - -// /datum signals -/// when a component is added to a datum: (/datum/component) -#define COMSIG_COMPONENT_ADDED "component_added" -/// before a component is removed from a datum because of RemoveComponent: (/datum/component) -#define COMSIG_COMPONENT_REMOVING "component_removing" -/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation -#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" -/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called -#define COMSIG_PARENT_QDELETING "parent_qdeleting" -/// generic topic handler (usr, href_list) -#define COMSIG_TOPIC "handle_topic" - -// /atom signals -#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) - #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called -#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) -#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) - //Positions for overrides list - #define EXAMINE_POSITION_ARTICLE 1 - #define EXAMINE_POSITION_BEFORE 2 - //End positions - #define COMPONENT_EXNAME_CHANGED 1 -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 - #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) -#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) -#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) - #define COMPONENT_ATOM_BLOCK_EXIT 1 -#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) -#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) -#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) -#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) -#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) -#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) -#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) -#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) -#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) -#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) -#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () -#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) -#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) -#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () - #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 -#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) -#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) -#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) -#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) -#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () - #define COMPONENT_BLOCK_RADIATION 1 -#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) - #define COMPONENT_BLOCK_CONTAMINATION 1 -#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) - #define COMPONENT_RAD_WAVE_HANDLED 1 -#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) - #define COMPONENT_BLOCK_REACH 1 -#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) -#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) - #define COMPONENT_BLOCK_TOOL_ATTACK 1 -#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) - #define COMPONENT_BLOCK_TELEPORT 1 -#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) -#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) -#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) -///////////////// -#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) -#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) -#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) - #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. -//This signal return value bitflags can be found in __DEFINES/misc.dm -#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) -#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) -#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) - -///////////////// - -#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) -#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) - -#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) - #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. -#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) - -// /area signals -#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) -#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) - -// /turf signals -#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) -#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) -#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) - -// /atom/movable signals -#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) - #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 -#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) -#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) -#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) - #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 -#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) -#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) -#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) -#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) -#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) -#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) -#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) - #define COMPONENT_CANCEL_THROW 1 -#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) -#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) -#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () -#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) - #define HEARING_MESSAGE 1 - #define HEARING_SPEAKER 2 -// #define HEARING_LANGUAGE 3 - #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 - #define HEARING_SPANS 6 - #define HEARING_MESSAGE_MODE 7 */ -#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) - -// /mob signals -#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) -#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) -#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) -#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) -#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) - #define COMSIG_MOB_CANCEL_CLICKON 1 - -#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj -#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) - #define COMPONENT_BLOCK_MAGIC 1 -#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () -#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of -#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) - #define COMPONENT_ITEM_NO_ATTACK 1 -#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) -#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) -#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) -#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) -#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) -#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) -#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () -#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () - #define COMPONENT_UPPERCASE_SPEECH 1 - // used to access COMSIG_MOB_SAY argslist - #define SPEECH_MESSAGE 1 - // #define SPEECH_BUBBLE_TYPE 2 - #define SPEECH_SPANS 3 - /* #define SPEECH_SANITIZE 4 - #define SPEECH_LANGUAGE 5 - #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ -#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) - #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 -#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () - -// /mob/living signals -#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) -#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) -#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) -#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) -#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () -#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) -#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) -#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) -#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) -#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) - -//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! -#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) -#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) - #define COMPONENT_NO_STUN 1 //For all of them -#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) - #define COMPONENT_CANT_TRACK 1 - -// /mob/living/carbon signals -#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) -#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) -#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) - -// /mob/living/simple_animal/hostile signals -#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK 1 - -// /obj signals -#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) -#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) -#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery - -// /obj/machinery signals -#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) -#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost -#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored - -// /obj/item signals -#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) -#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) - #define COMPONENT_NO_INTERACT 1 -#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) - #define COMPONENT_NO_ATTACK_OBJ 1 -#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) - #define COMPONENT_NO_ATTACK 1 -#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) -#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) -#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) -#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) -#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) -#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) -#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) -#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) - #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 -#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) -#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) - -// /obj/item/clothing signals -#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () - -// /obj/item/implant signals -#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () -#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) - #define COMPONENT_STOP_IMPLANTING 1 -#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) - //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both - #define COMPONENT_DELETE_NEW_IMPLANT 2 - #define COMPONENT_DELETE_OLD_IMPLANT 4 -#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) - //This uses all return values of COMSIG_IMPLANT_OTHER - -// /obj/item/pda signals -#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) - #define COMPONENT_STOP_RINGTONE_CHANGE 1 -#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" - #define COMPONENT_PDA_NO_DETONATE 1 - -// /obj/item/radio signals -#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) - -// /obj/item/pen signals -#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) - -// /obj/item/gun signals -#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) - -// /obj/projectile signals (sent to the firer) -#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) -#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) -#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () -#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles - -// /obj/mecha signals -#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to - -// /mob/living/carbon/human signals -#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) -#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) -#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set - -// /datum/species signals -#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) -#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) - -/*******Component Specific Signals*******/ -//Janitor -#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. -#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. -#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) - -//Creamed -#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) - -//Food -#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) - -//Gibs -#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) - -//Mood -#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. -#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for -#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. - -//NTnet -#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) - -//Nanites -#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found -#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth -#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component -#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list -#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount -#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount -#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount -#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount -#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount -#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable -#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount -#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount -#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. -#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. -#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected -#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs -#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component - #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful - #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites -#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component - -// /datum/component/storage signals -#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. -#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. -#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool -#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool -#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) -#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! -#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. -#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. -#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool -#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. -#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) -#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool - -// /datum/action signals -#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) - #define COMPONENT_ACTION_BLOCK_TRIGGER 1 - -/*******Non-Signal Component Related Defines*******/ - -//Redirection component init flags -#define REDIRECT_TRANSFER_WITH_TURF 1 - -//Arch -#define ARCH_PROB "probability" //Probability for each item -#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount - -//Ouch my toes! -#define CALTROP_BYPASS_SHOES 1 -#define CALTROP_IGNORE_WALKERS 2 - -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) +// All signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +// global signals +// These are signals which can be listened to by any component on any parent +// start global signals with "!", this used to be necessary but now it's just a formatting choice +/// from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args) +#define COMSIG_GLOB_NEW_Z "!new_z" +/// called after a successful var edit somewhere in the world: (list/args) +#define COMSIG_GLOB_VAR_EDIT "!var_edit" +/// called after an explosion happened : (epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) +#define COMSIG_GLOB_EXPLOSION "!explosion" +/// mob was created somewhere : (mob) +#define COMSIG_GLOB_MOB_CREATED "!mob_created" +/// mob died somewhere : (mob , gibbed) +#define COMSIG_GLOB_MOB_DEATH "!mob_death" +/// global living say plug - use sparingly: (mob/speaker , message) +#define COMSIG_GLOB_LIVING_SAY_SPECIAL "!say_special" +/// called by datum/cinematic/play() : (datum/cinematic/new_cinematic) +#define COMSIG_GLOB_PLAY_CINEMATIC "!play_cinematic" + #define COMPONENT_GLOB_BLOCK_CINEMATIC 1 +/// ingame button pressed (/obj/machinery/button/button) +#define COMSIG_GLOB_BUTTON_PRESSED "!button_pressed" + +// signals from globally accessible objects +/// from SSsun when the sun changes position : (azimuth) +#define COMSIG_SUN_MOVED "sun_moved" + +////////////////////////////////////////////////////////////////// + +// /datum signals +/// when a component is added to a datum: (/datum/component) +#define COMSIG_COMPONENT_ADDED "component_added" +/// before a component is removed from a datum because of RemoveComponent: (/datum/component) +#define COMSIG_COMPONENT_REMOVING "component_removing" +/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation +#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" +/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called +#define COMSIG_PARENT_QDELETING "parent_qdeleting" +/// generic topic handler (usr, href_list) +#define COMSIG_TOPIC "handle_topic" + +// /atom signals +#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) + #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called +#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) + //Positions for overrides list + #define EXAMINE_POSITION_ARTICLE 1 + #define EXAMINE_POSITION_BEFORE 2 + //End positions + #define COMPONENT_EXNAME_CHANGED 1 +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) +#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) +#define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) + #define COMPONENT_ATOM_BLOCK_EXIT 1 +#define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +#define COMSIG_ATOM_BUMPED "atom_bumped" //from base of atom/Bumped(): (/atom/movable) +#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_EMP_ACT "atom_emp_act" //from base of atom/emp_act(): (severity) +#define COMSIG_ATOM_FIRE_ACT "atom_fire_act" //from base of atom/fire_act(): (exposed_temperature, exposed_volume) +#define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" //from base of atom/bullet_act(): (/obj/projectile, def_zone) +#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob) +#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume) +#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): (/mob/user) +#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity) +#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): () +#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode) +#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) +#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" //from obj/machinery/bsa/full/proc/fire(): () + #define COMSIG_ATOM_BLOCKS_BSA_BEAM 1 +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color) +#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" //from base of atom/setDir(): (old_dir, new_dir) +#define COMSIG_ATOM_CONTENTS_DEL "atom_contents_del" //from base of atom/handle_atom_del(): (atom/deleted) +#define COMSIG_ATOM_HAS_GRAVITY "atom_has_gravity" //from base of atom/has_gravity(): (turf/location, list/forced_gravities) +#define COMSIG_ATOM_RAD_PROBE "atom_rad_probe" //from proc/get_rad_contents(): () + #define COMPONENT_BLOCK_RADIATION 1 +#define COMSIG_ATOM_RAD_CONTAMINATING "atom_rad_contam" //from base of datum/radiation_wave/radiate(): (strength) + #define COMPONENT_BLOCK_CONTAMINATION 1 +#define COMSIG_ATOM_RAD_WAVE_PASSING "atom_rad_wave_pass" //from base of datum/radiation_wave/check_obstructions(): (datum/radiation_wave, width) + #define COMPONENT_RAD_WAVE_HANDLED 1 +#define COMSIG_ATOM_CANREACH "atom_can_reach" //from internal loop in atom/movable/proc/CanReach(): (list/next) + #define COMPONENT_BLOCK_REACH 1 +#define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WRENCH_ACT "atom_wrench_act" //from base of atom/wrench_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_MULTITOOL_ACT "atom_multitool_act" //from base of atom/multitool_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WELDER_ACT "atom_welder_act" //from base of atom/welder_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_WIRECUTTER_ACT "atom_wirecutter_act" //from base of atom/wirecutter_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_CROWBAR_ACT "atom_crowbar_act" //from base of atom/crowbar_act(): (mob/living/user, obj/item/I) +#define COMSIG_ATOM_ANALYSER_ACT "atom_analyser_act" //from base of atom/analyser_act(): (mob/living/user, obj/item/I) + #define COMPONENT_BLOCK_TOOL_ATTACK 1 +#define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin) + #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom is added to the hearers on get_hearers_in_view(): (list/processing_list, list/hearers) +#define COMSIG_ATOM_ORBIT_BEGIN "atom_orbit_begin" //called when an atom starts orbiting another atom: (atom) +#define COMSIG_ATOM_ORBIT_STOP "atom_orbit_stop" //called when an atom stops orbiting another atom: (atom) +///////////////// +#define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" //from base of atom/attack_ghost(): (mob/dead/observer/ghost) +#define COMSIG_ATOM_ATTACK_HAND "atom_attack_hand" //from base of atom/attack_hand(): (mob/user) +#define COMSIG_ATOM_ATTACK_PAW "atom_attack_paw" //from base of atom/attack_paw(): (mob/user) + #define COMPONENT_NO_ATTACK_HAND 1 //works on all 3. +//This signal return value bitflags can be found in __DEFINES/misc.dm +#define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" //called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) +#define COMSIG_ATOM_START_PULL "movable_start_pull" //called on a movable (NOT living) when someone starts pulling it (atom/movable/puller, state, force) +#define COMSIG_LIVING_START_PULL "living_start_pull" //called on /living when someone starts pulling it (atom/movable/puller, state, force) + +///////////////// + +#define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) +#define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) + +#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) +#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob) + #define COMPONENT_ALLOW_EXAMINATE 1 //Allows the user to examinate regardless of client.eye. +#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) + #define COMPONENT_NO_MOUSEDROP 1 +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) + +// /area signals +#define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) +#define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) + +// /turf signals +#define COMSIG_TURF_CHANGE "turf_change" //from base of turf/ChangeTurf(): (path, list/new_baseturfs, flags, list/transferring_comps) +#define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" //from base of atom/has_gravity(): (atom/asker, list/forced_gravities) +#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" //from base of turf/New(): (turf/source, direction) + +// /atom/movable signals +#define COMSIG_MOVABLE_PRE_MOVE "movable_pre_move" //from base of atom/movable/Moved(): (/atom) + #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE 1 +#define COMSIG_MOVABLE_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) +#define COMSIG_MOVABLE_CROSS "movable_cross" //from base of atom/movable/Cross(): (/atom/movable) +#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (/atom/movable) +#define COMSIG_MOVABLE_UNCROSS "movable_uncross" //from base of atom/movable/Uncross(): (/atom/movable) + #define COMPONENT_MOVABLE_BLOCK_UNCROSS 1 +#define COMSIG_MOVABLE_UNCROSSED "movable_uncrossed" //from base of atom/movable/Uncrossed(): (/atom/movable) +#define COMSIG_MOVABLE_BUMP "movable_bump" //from base of atom/movable/Bump(): (/atom) +#define COMSIG_MOVABLE_IMPACT "movable_impact" //from base of atom/movable/throw_impact(): (/atom/hit_atom, /datum/thrownthing/throwingdatum) +#define COMSIG_MOVABLE_IMPACT_ZONE "item_impact_zone" //from base of mob/living/hitby(): (mob/living/target, hit_zone) +#define COMSIG_MOVABLE_BUCKLE "buckle" //from base of atom/movable/buckle_mob(): (mob, force) +#define COMSIG_MOVABLE_UNBUCKLE "unbuckle" //from base of atom/movable/unbuckle_mob(): (mob, force) +#define COMSIG_MOVABLE_PRE_THROW "movable_pre_throw" //from base of atom/movable/throw_at(): (list/args) + #define COMPONENT_CANCEL_THROW 1 +#define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //from base of atom/movable/throw_at(): (datum/thrownthing, spin) +#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_SECLUDED_LOCATION "movable_secluded" //called when the movable is placed in an unaccessible area, used for stationloving: () +#define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)) + #define HEARING_MESSAGE 1 + #define HEARING_SPEAKER 2 +// #define HEARING_LANGUAGE 3 + #define HEARING_RAW_MESSAGE 4 + /* #define HEARING_RADIO_FREQ 5 + #define HEARING_SPANS 6 + #define HEARING_MESSAGE_MODE 7 */ +#define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) + +// /mob signals +#define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) +#define COMSIG_MOB_STATCHANGE "mob_statchange" //from base of mob/set_stat(): (new_stat) +#define COMSIG_MOB_CLICKON "mob_clickon" //from base of mob/clickon(): (atom/A, params) +#define COMSIG_MOB_MIDDLECLICKON "mob_middleclickon" //from base of mob/MiddleClickOn(): (atom/A) +#define COMSIG_MOB_ALTCLICKON "mob_altclickon" //from base of mob/AltClickOn(): (atom/A) + #define COMSIG_MOB_CANCEL_CLICKON 1 + +#define COMSIG_MOB_ALLOWED "mob_allowed" //from base of obj/allowed(mob/M): (/obj) returns bool, if TRUE the mob has id access to the obj +#define COMSIG_MOB_RECEIVE_MAGIC "mob_receive_magic" //from base of mob/anti_magic_check(): (mob/user, magic, holy, tinfoil, chargecost, self, protection_sources) + #define COMPONENT_BLOCK_MAGIC 1 +#define COMSIG_MOB_HUD_CREATED "mob_hud_created" //from base of mob/create_mob_hud(): () +#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" //from base of +#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack" //from base of /obj/item/attack(): (mob/M, mob/user) + #define COMPONENT_ITEM_NO_ATTACK 1 +#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) +#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) +#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) +#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) +#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () +#define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): () + #define COMPONENT_UPPERCASE_SPEECH 1 + // used to access COMSIG_MOB_SAY argslist + #define SPEECH_MESSAGE 1 + // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_SPANS 3 + /* #define SPEECH_SANITIZE 4 + #define SPEECH_LANGUAGE 5 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 */ +#define COMSIG_MOB_DEADSAY "mob_deadsay" // from /mob/say_dead(): (mob/speaker, message) + #define MOB_DEADSAY_SIGNAL_INTERCEPT 1 +#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/living/emote(): () + +// /mob/living signals +#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living) +#define COMSIG_LIVING_IGNITED "living_ignite" //from base of mob/living/IgniteMob() (/mob/living) +#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living) +#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage, source, siemens_coeff, flags) +#define COMSIG_LIVING_SHOCK_PREVENTED "living_shock_prevented" //sent when items with siemen coeff. of 0 block a shock: (power_source, source, siemens_coeff, dist_check) +#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +#define COMSIG_LIVING_REVIVE "living_revive" //from base of mob/living/revive() (full_heal, admin_revive) +#define COMSIG_LIVING_REGENERATE_LIMBS "living_regen_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) +#define COMSIG_PROCESS_BORGCHARGER_OCCUPANT "living_charge" //sent from borg recharge stations: (amount, repairs) +#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client) +#define COMSIG_BORG_SAFE_DECONSTRUCT "borg_safe_decon" //sent from borg mobs to itself, for tools to catch an upcoming destroy() due to safe decon (rather than detonation) + +//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! +#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) + #define COMPONENT_NO_STUN 1 //For all of them +#define COMSIG_LIVING_CAN_TRACK "mob_cantrack" //from base of /mob/living/can_track(): (mob/user) + #define COMPONENT_CANT_TRACK 1 + +// /mob/living/carbon signals +#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) +#define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" //from /item/organ/proc/Insert() (/obj/item/organ/) +#define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" //from /item/organ/proc/Remove() (/obj/item/organ/) + +// /mob/living/simple_animal/hostile signals +#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget" + #define COMPONENT_HOSTILE_NO_ATTACK 1 + +// /obj signals +#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled) +#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value) +#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //from base of code/game/machinery + +// /obj/machinery signals +#define COMSIG_MACHINERY_BROKEN "machinery_broken" //from /obj/machinery/obj_break(damage_flag): (damage_flag) +#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" //from base power_change() when power is lost +#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" //from base power_change() when power is restored + +// /obj/item signals +#define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) +#define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self(): (/mob) + #define COMPONENT_NO_INTERACT 1 +#define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" //from base of obj/item/attack_obj(): (/obj, /mob) + #define COMPONENT_NO_ATTACK_OBJ 1 +#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) + #define COMPONENT_NO_ATTACK 1 +#define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) +#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) +#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) +#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) +#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) +#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone) +#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) +#define COMSIG_ITEM_MARK_RETRIEVAL "item_mark_retrieval" //called before marking an object for retrieval, checked in /obj/effect/proc_holder/spell/targeted/summonitem/cast() : (mob/user) + #define COMPONENT_BLOCK_MARK_RETRIEVAL 1 +#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) +#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable, mob/living/crossed) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) + + +// /obj/item/clothing signals +#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): () + +// /obj/item/implant signals +#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): () +#define COMSIG_IMPLANT_IMPLANTING "implant_implanting" //from base of /obj/item/implant/proc/implant(): (list/args) + #define COMPONENT_STOP_IMPLANTING 1 +#define COMSIG_IMPLANT_OTHER "implant_other" //called on already installed implants when a new one is being added in /obj/item/implant/proc/implant(): (list/args, obj/item/implant/new_implant) + //#define COMPONENT_STOP_IMPLANTING 1 //The name makes sense for both + #define COMPONENT_DELETE_NEW_IMPLANT 2 + #define COMPONENT_DELETE_OLD_IMPLANT 4 +#define COMSIG_IMPLANT_EXISTING_UPLINK "implant_uplink_exists" //called on implants being implanted into someone with an uplink implant: (datum/component/uplink) + //This uses all return values of COMSIG_IMPLANT_OTHER + +// /obj/item/pda signals +#define COMSIG_PDA_CHANGE_RINGTONE "pda_change_ringtone" //called on pda when the user changes the ringtone: (mob/living/user, new_ringtone) + #define COMPONENT_STOP_RINGTONE_CHANGE 1 +#define COMSIG_PDA_CHECK_DETONATE "pda_check_detonate" + #define COMPONENT_PDA_NO_DETONATE 1 + +// /obj/item/radio signals +#define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" //called from base of /obj/item/radio/proc/set_frequency(): (list/args) + +// /obj/item/pen signals +#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) + +// /obj/item/gun signals +#define COMSIG_MOB_FIRED_GUN "mob_fired_gun" //called in /obj/item/gun/process_fire (user, target, params, zone_override) + +// /obj/projectile signals (sent to the firer) +#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle) +#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/projectile/proc/fire(): (obj/projectile, atom/original_target) +#define COMSIG_PROJECTILE_FIRE "projectile_fire" // from the base of /obj/projectile/proc/fire(): () +#define COMSIG_PROJECTILE_PREHIT "com_proj_prehit" // sent to targets during the process_hit proc of projectiles + +// /obj/mecha signals +#define COMSIG_MECHA_ACTION_ACTIVATE "mecha_action_activate" //sent from mecha action buttons to the mecha they're linked to + +// /mob/living/carbon/human signals +#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity) +#define COMSIG_HUMAN_MELEE_UNARMED_ATTACKBY "human_melee_unarmed_attackby" //from mob/living/carbon/human/UnarmedAttack(): (mob/living/carbon/human/attacker) +#define COMSIG_HUMAN_DISARM_HIT "human_disarm_hit" //Hit by successful disarm attack (mob/living/carbon/human/attacker,zone_targeted) +#define COMSIG_JOB_RECEIVED "job_received" //Whenever EquipRanked is called, called after job is set + +// /datum/species signals +#define COMSIG_SPECIES_GAIN "species_gain" //from datum/species/on_species_gain(): (datum/species/new_species, datum/species/old_species) +#define COMSIG_SPECIES_LOSS "species_loss" //from datum/species/on_species_loss(): (datum/species/lost_species) + +// /datum/song signals +#define COMSIG_SONG_START "song_start" //sent to the instrument when a song starts playing +#define COMSIG_SONG_END "song_end" //sent to the instrument when a song stops playing + +/*******Component Specific Signals*******/ +//Janitor +#define COMSIG_TURF_IS_WET "check_turf_wet" //(): Returns bitflags of wet values. +#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool. +#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength) + +//Creamed +#define COMSIG_COMPONENT_CLEAN_FACE_ACT "clean_face_act" //called when you wash your face at a sink: (num/strength) + +//Food +#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder) + +//Gibs +#define COMSIG_GIBS_STREAK "gibs_streak" // from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) + +//Mood +#define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. +#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" //Mood event that only RnD members listen for +#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. + +//NTnet +#define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) + +//Nanites +#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found +#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth +#define COMSIG_NANITE_DELETE "nanite_delete" //() deletes the nanite component +#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list +#define COMSIG_NANITE_GET_VOLUME "nanite_get_volume" //(amount) Returns nanite amount +#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount +#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount +#define COMSIG_NANITE_SET_MAX_VOLUME "nanite_set_max_volume" //(amount) Sets maximum nanite volume to the given amount +#define COMSIG_NANITE_SET_CLOUD "nanite_set_cloud" //(amount(0-100)) Sets cloud ID to the given amount +#define COMSIG_NANITE_SET_CLOUD_SYNC "nanite_set_cloud_sync" //(method) Modify cloud sync status. Method can be toggle, enable or disable +#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount +#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount +#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob. +#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob. +#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected +#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs +#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component + #define COMPONENT_PROGRAM_INSTALLED 1 //Installation successful + #define COMPONENT_PROGRAM_NOT_INSTALLED 2 //Installation failed, but there are still nanites +#define COMSIG_NANITE_SYNC "nanite_sync" //(datum/component/nanites, full_overwrite, copy_activation) Called to sync the target's nanites to a given nanite component + +// /datum/component/storage signals +#define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. +#define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool +#define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool +#define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) +#define COMSIG_IS_STORAGE_LOCKED "storage_get_lockstate" //() - returns bool. MUST CHECK IF STORAGE IS THERE FIRST! +#define COMSIG_TRY_STORAGE_TAKE_TYPE "storage_take_type" //(type, atom/destination, amount = INFINITY, check_adjacent, force, mob/user, list/inserted) - returns bool - type can be a list of types. +#define COMSIG_TRY_STORAGE_FILL_TYPE "storage_fill_type" //(type, amount = INFINITY, force = FALSE) //don't fuck this up. Force will ignore max_items, and amount is normally clamped to max_items. +#define COMSIG_TRY_STORAGE_TAKE "storage_take_obj" //(obj, new_loc, force = FALSE) - returns bool +#define COMSIG_TRY_STORAGE_QUICK_EMPTY "storage_quick_empty" //(loc) - returns bool - if loc is null it will dump at parent location. +#define COMSIG_TRY_STORAGE_RETURN_INVENTORY "storage_return_inventory" //(list/list_to_inject_results_into, recursively_search_inside_storages = TRUE) +#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip" //(obj/item/insertion_candidate, mob/user, silent) - returns bool + +// /datum/action signals +#define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) + #define COMPONENT_ACTION_BLOCK_TRIGGER 1 + +//Xenobio hotkeys +#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) +#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) +#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) +#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index b87fb3dfd65..835114b2c6c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -4,16 +4,6 @@ #define ALL (~0) //For convenience. #define NONE 0 -//for convenience -#define ENABLE_BITFIELD(variable, flag) (variable |= (flag)) -#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag)) -#define CHECK_BITFIELD(variable, flag) (variable & (flag)) -#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag)) - - -//check if all bitflags specified are present -#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags)) - GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) // for /datum/var/datum_flags diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index 60f99c4c750..62bdd1d8c38 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -19,3 +19,7 @@ #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 #define FOOD_AMAZING 5 + +#define FOOD_IN_CONTAINER (1<<0) + +#define STOP_SERVING_BREAKFAST (15 MINUTES) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 7781efc5eee..71ea98f9f0d 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -110,10 +110,6 @@ #define MACHINE_ELECTRIFIED_PERMANENT -1 #define MACHINE_DEFAULT_ELECTRIFY_TIME 30 -//cloning defines. These are flags. -#define CLONING_SUCCESS (1<<0) -#define CLONING_DELETE_RECORD (1<<1) - //these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified. #define PLANT_GENE_REMOVABLE (1<<0) #define PLANT_GENE_EXTRACTABLE (1<<1) diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 3c4a78ea7a5..601df51d77f 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -4,10 +4,6 @@ /// Hard materials, such as iron or metal #define MAT_CATEGORY_RIGID "rigid material" - -/// Gets the reference for the material type that was given -#define getmaterialref(A) (SSmaterials.materials[A] || A) - /// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes. #define MATERIAL_COLOR (1<<0) #define MATERIAL_ADD_PREFIX (1<<1) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e79014c011f..89097b48e3f 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -262,10 +262,6 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE))) #define MAP_MAXY 5 #define MAP_MAXZ 6 -// Defib stats -#define DEFIB_TIME_LIMIT 900 -#define DEFIB_TIME_LOSS 60 - // Diagonal movement #define FIRST_DIAG_STEP 1 #define SECOND_DIAG_STEP 2 diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index a4b07f97e20..6ef4d0ca692 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -51,4 +51,5 @@ #define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed #define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. #define ORGAN_VITAL (1<<4) //Currently only the brain -#define ORGAN_SYNTHETIC_EMP (1<<5) //Synthetic organ affected by an EMP. Deteriorates over time. +#define ORGAN_EDIBLE (1<<5) //is a snack? :D +#define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time. diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index a56a648e878..2e734c1fb72 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -44,10 +44,8 @@ Ask ninjanomnom if they're around #define RAD_FULL_INSULATION 0 // Unused // WARNING: The defines below could have disastrous consequences if tweaked incorrectly. See: The great SM purge of Oct.6.2017 -// contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1)) // contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT #define RAD_MINIMUM_CONTAMINATION 350 // How strong does a radiation wave have to be to contaminate objects -#define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.01 // Higher means higher strength scaling contamination chance #define RAD_CONTAMINATION_STR_COEFFICIENT 0.25 // Higher means higher strength scaling contamination strength #define RAD_DISTANCE_COEFFICIENT 1 // Lower means further rad spread diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index bfba80a80cb..af6a9ac51b1 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -65,6 +65,7 @@ #define FREQ_ENGINEERING 1357 // Engineering comms frequency, orange #define FREQ_SECURITY 1359 // Security comms frequency, red +#define FREQ_HOLOGRID_SOLUTION 1433 #define FREQ_STATUS_DISPLAYS 1435 #define FREQ_ATMOS_ALARMS 1437 // air alarms <-> alert computers #define FREQ_ATMOS_CONTROL 1439 // air alarms <-> vents and scrubbers diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 1255eccf19e..bf307f74055 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -7,10 +7,11 @@ #define REFILLABLE (1<<2) // Makes it possible to add reagents through any reagent container. #define DRAINABLE (1<<3) // Makes it possible to remove reagents through any reagent container. +#define DUNKABLE (1<<4) // Allows items to be dunked into this container for transfering reagents. Used in conjunction with the dunkable component. -#define TRANSPARENT (1<<4) // Used on containers which you want to be able to see the reagents off. -#define AMOUNT_VISIBLE (1<<5) // For non-transparent containers that still have the general amount of reagents in them visible. -#define NO_REACT (1<<6) // Applied to a reagent holder, the contents will not react with each other. +#define TRANSPARENT (1<<5) // Used on containers which you want to be able to see the reagents off. +#define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. +#define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index ec5d9e155ae..ea11de883de 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -29,6 +29,7 @@ #define ROLE_HIVE "Hivemind Host" //Role removed, left here for safety. #define ROLE_OBSESSED "Obsessed" #define ROLE_SENTIENCE "Sentience Potion Spawn" +#define ROLE_PYROCLASTIC_SLIME "Pyroclastic Anomaly Slime" #define ROLE_MIND_TRANSFER "Mind Transfer Potion" #define ROLE_POSIBRAIN "Posibrain" #define ROLE_DRONE "Drone" diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index ab6268c2a8a..ee3f3ee70fa 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -26,3 +26,8 @@ //number defines #define CLEAN_SKILL_BEAUTY_ADJUSTMENT 15//It's a denominator so no 0. Higher number = less cleaning xp per cleanable #define CLEAN_SKILL_GENERIC_WASH_XP 1.5//Value. Higher number = more XP when cleaning non-cleanables (walls/floors/lips) + +#define MEDICAL_SKILL_EASY 3 //Cannot be 0 +#define MEDICAL_SKILL_MEDIUM (MEDICAL_SKILL_EASY*5) +#define MEDICAL_SKILL_ORGAN_FIX (MEDICAL_SKILL_MEDIUM*1.75) +#define MEDICAL_SKILL_ADVANCED (MEDICAL_SKILL_MEDIUM*2.5) diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c2b75a0bf0f..59a0a4c22a7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -95,7 +95,7 @@ #define STATUS_EFFECT_GO_AWAY /datum/status_effect/go_away //makes you launch through walls in a single direction for a while -#define STATUS_EFFECT_STASIS /datum/status_effect/incapacitating/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc +#define STATUS_EFFECT_STASIS /datum/status_effect/grouped/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus @@ -125,6 +125,10 @@ #define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic #define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor +// Grouped effect sources, see also code/__DEFINES/traits.dm + +#define STASIS_MACHINE_EFFECT "stasis_machine" + // Stasis helpers #define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS)) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 7a19c1ba9d2..f4246e19b3c 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -107,7 +107,6 @@ #define INIT_ORDER_INPUT 85 #define INIT_ORDER_VIS 80 #define INIT_ORDER_ACHIEVEMENTS 77 -#define INIT_ORDER_MATERIALS 76 #define INIT_ORDER_RESEARCH 75 #define INIT_ORDER_EVENTS 70 #define INIT_ORDER_JOBS 65 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 586282bcc6b..f00146d7848 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -55,6 +55,7 @@ } while (0) #define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) +#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE) /* Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index cc18622ddc2..b0e42aff3fc 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -341,7 +341,7 @@ GLOBAL_LIST_EMPTY(species_list) drifting = 0 user_loc = user.loc - if(L && !CHECK_MULTIPLE_BITFIELDS(L.mobility_flags, required_mobility_flags)) + if(L && !((L.mobility_flags & required_mobility_flags) == required_mobility_flags)) . = 0 break diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index c388a8a5713..f21bfce4c9f 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -38,7 +38,26 @@ GLOBAL_LIST_EMPTY(moth_wings_list) GLOBAL_LIST_EMPTY(moth_markings_list) GLOBAL_LIST_EMPTY(caps_list) -GLOBAL_LIST_INIT(color_list_ethereal, list("F Class(Green)" = "97ee63", "F2 Class (Light Green)" = "00fa9a", "F3 Class (Dark Green)" = "37835b", "M Class (Red)" = "9c3030", "M1 Class (Purple)" = "ee82ee", "G Class (Yellow)" = "fbdf56", "O Class (Blue)" = "3399ff", "A Class (Cyan)" = "00ffff")) +GLOBAL_LIST_INIT(color_list_ethereal, list( + "Red" = "ff4d4d", + "Faint Red" = "ffb3b3", + "Dark Red" = "9c3030", + "Orange" = "ffa64d", + "Burnt Orange" = "cc4400", + "Bright Yellow" = "ffff99", + "Dull Yellow" = "fbdf56", + "Faint Green" = "ddff99", + "Green" = "97ee63", + "Seafoam Green" = "00fa9a", + "Dark Green" = "37835b", + "Cyan Blue" = "00ffff", + "Faint Blue" = "b3d9ff", + "Blue" = "3399ff", + "Dark Blue" = "6666ff", + "Purple" = "ee82ee", + "Dark Fuschia" = "cc0066", + "Pink" = "ff99cc", + "White" = "f2f2f2",)) GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list( "ghost", diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index a9a1db0b37b..d70564bc151 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -78,6 +78,7 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/geiger_counter = 1, /obj/item/analyzer = 1, /obj/item/mop = 1, + /obj/item/twohanded/broom = 1, /obj/item/reagent_containers/glass/bucket = 1, /obj/item/toy/crayon/spraycan = 1, ) = 1, @@ -189,6 +190,7 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/stack/sheet/mineral/wood/fifty = 1, /obj/item/beacon = 1, /obj/item/weaponcrafting/receiver = 1, + /obj/item/paper/fluff/stations/soap =1, //recipes count as crafting. ) = 8, list(//medical and chemicals diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 580caa1ad49..98c801c1ff0 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -14,7 +14,6 @@ #define POLL_IGNORE_SWARMER "swarmer" #define POLL_IGNORE_DRONE "drone" #define POLL_IGNORE_FUGITIVE "fugitive" -#define POLL_IGNORE_DEFECTIVECLONE "defective_clone" #define POLL_IGNORE_PYROSLIME "slime" #define POLL_IGNORE_SHADE "shade" #define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" @@ -38,7 +37,6 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_SWARMER = "Swarmer shells", POLL_IGNORE_DRONE = "Drone shells", POLL_IGNORE_FUGITIVE = "Fugitive Hunter", - POLL_IGNORE_DEFECTIVECLONE = "Defective clone", POLL_IGNORE_PYROSLIME = "Slime", POLL_IGNORE_SHADE = "Shade", POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 8b8a502d371..4db5fbe9095 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -17,21 +17,6 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -//Lower left, persistent menu -#define ui_inventory "WEST:6,SOUTH:5" - -//Middle left indicators -#define ui_lingchemdisplay "WEST,CENTER-1:15" -#define ui_lingstingdisplay "WEST:6,CENTER-3:11" - -#define ui_devilsouldisplay "WEST:6,CENTER-1:15" - -//Lower center, persistent menu -#define ui_sstore1 "CENTER-5:10,SOUTH:5" -#define ui_id "CENTER-4:12,SOUTH:5" -#define ui_belt "CENTER-3:14,SOUTH:5" -#define ui_back "CENTER-2:14,SOUTH:5" - /proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) var/x_off = -(!(i % 2)) var/y_off = round((i-1) / 2) @@ -46,35 +31,22 @@ var/y_off = round((M.held_items.len-1) / 2) return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" +//Lower left, persistent menu +#define ui_inventory "WEST:6,SOUTH:5" + +//Middle left indicators +#define ui_lingchemdisplay "WEST,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" +#define ui_devilsouldisplay "WEST:6,CENTER-1:15" + +//Lower center, persistent menu +#define ui_sstore1 "CENTER-5:10,SOUTH:5" +#define ui_id "CENTER-4:12,SOUTH:5" +#define ui_belt "CENTER-3:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs -#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs -#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //borgs -#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs -#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs -#define ui_inv3 "CENTER :16,SOUTH:5" //borgs -#define ui_borg_module "CENTER+1:16,SOUTH:5" //borgs -#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs -#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs -#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs -#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" //borgs - -#define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey -#define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey -#define ui_monkey_neck "CENTER-3:15,SOUTH:5" //monkey -#define ui_monkey_back "CENTER-2:16,SOUTH:5" //monkey - -//#define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" //alien - -#define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones -#define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones -#define ui_drone_storage "CENTER-2:14,SOUTH:5" //maintenance drones -#define ui_drone_head "CENTER-3:14,SOUTH:5" //maintenance drones - //Lower right, persistent menu #define ui_drop_throw "EAST-1:28,SOUTH+1:7" #define ui_above_movement "EAST-2:26,SOUTH+1:7" @@ -88,11 +60,6 @@ #define ui_language_menu "EAST-4:6,SOUTH:21" #define ui_skill_menu "EAST-4:22,SOUTH:5" -#define ui_borg_pull "EAST-2:26,SOUTH+1:7" -#define ui_borg_radio "EAST-1:28,SOUTH+1:7" -#define ui_borg_intents "EAST-2:26,SOUTH:5" - - //Upper-middle right (alerts) #define ui_alert1 "EAST-1:28,CENTER+5:27" #define ui_alert2 "EAST-1:28,CENTER+4:25" @@ -100,35 +67,69 @@ #define ui_alert4 "EAST-1:28,CENTER+2:21" #define ui_alert5 "EAST-1:28,CENTER+1:19" - //Middle right (status indicators) #define ui_healthdoll "EAST-1:28,CENTER-2:13" #define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER:17" -#define ui_mood "EAST-1:28,CENTER-3:10" +#define ui_internal "EAST-1:28,CENTER-3:10" +#define ui_mood "EAST-1:28,CENTER:17" +#define ui_spacesuit "EAST-1:28,CENTER-4:10" -//living -#define ui_living_pull "EAST-1:28,CENTER-2:15" -#define ui_living_health "EAST-1:28,CENTER:15" -#define ui_living_healthdoll "EAST-1:28,CENTER-2:13" +//Pop-up inventory +#define ui_shoes "WEST+1:8,SOUTH:5" +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" +#define ui_glasses "WEST:6,SOUTH+3:11" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+2:9" +#define ui_neck "WEST:6,SOUTH+2:9" +#define ui_head "WEST+1:8,SOUTH+3:11" -//borgs -#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator. +//Generic living +#define ui_living_pull "EAST-1:28,CENTER-3:15" +#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" -//aliens -#define ui_alien_health "EAST,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator. +//Monkeys +#define ui_monkey_head "CENTER-5:13,SOUTH:5" +#define ui_monkey_mask "CENTER-4:14,SOUTH:5" +#define ui_monkey_neck "CENTER-3:15,SOUTH:5" +#define ui_monkey_back "CENTER-2:16,SOUTH:5" + +//Drones +#define ui_drone_drop "CENTER+1:18,SOUTH:5" +#define ui_drone_pull "CENTER+2:2,SOUTH:5" +#define ui_drone_storage "CENTER-2:14,SOUTH:5" +#define ui_drone_head "CENTER-3:14,SOUTH:5" + +//Cyborgs +#define ui_borg_health "EAST-1:28,CENTER-1:15" +#define ui_borg_pull "EAST-2:26,SOUTH+1:7" +#define ui_borg_radio "EAST-1:28,SOUTH+1:7" +#define ui_borg_intents "EAST-2:26,SOUTH:5" +#define ui_borg_sensor "CENTER-3:16, SOUTH:5" +#define ui_borg_lamp "CENTER-4:16, SOUTH:5" +#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" +#define ui_inv1 "CENTER-2:16,SOUTH:5" +#define ui_inv2 "CENTER-1 :16,SOUTH:5" +#define ui_inv3 "CENTER :16,SOUTH:5" +#define ui_borg_module "CENTER+1:16,SOUTH:5" +#define ui_borg_store "CENTER+2:16,SOUTH:5" +#define ui_borg_camera "CENTER+3:21,SOUTH:5" +#define ui_borg_album "CENTER+4:21,SOUTH:5" +#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" + +//Aliens +#define ui_alien_health "EAST,CENTER-1:15" #define ui_alienplasmadisplay "EAST,CENTER-2:15" #define ui_alien_queen_finder "EAST,CENTER-3:15" +#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" +#define ui_alien_language_menu "EAST-3:26,SOUTH:5" -//constructs +//Constructs #define ui_construct_pull "EAST,CENTER-2:15" -#define ui_construct_health "EAST,CENTER:15" //same as humans and slimes - -//slimes -#define ui_slime_health "EAST,CENTER:15" //same as humans and constructs +#define ui_construct_health "EAST,CENTER:15" // AI - #define ui_ai_core "SOUTH:6,WEST" #define ui_ai_camera_list "SOUTH:6,WEST+1" #define ui_ai_track_with_camera "SOUTH:6,WEST+2" @@ -148,7 +149,6 @@ #define ui_ai_add_multicam "SOUTH+1:6,WEST+14" // pAI - #define ui_pai_software "SOUTH:6,WEST" #define ui_pai_shell "SOUTH:6,WEST+1" #define ui_pai_chassis "SOUTH:6,WEST+2" @@ -163,21 +163,7 @@ #define ui_pai_take_picture "SOUTH:6,WEST+12" #define ui_pai_view_images "SOUTH:6,WEST+13" -//Pop-up inventory -#define ui_shoes "WEST+1:8,SOUTH:5" - -#define ui_iclothing "WEST:6,SOUTH+1:7" -#define ui_oclothing "WEST+1:8,SOUTH+1:7" -#define ui_gloves "WEST+2:10,SOUTH+1:7" - -#define ui_glasses "WEST:6,SOUTH+3:11" -#define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" -#define ui_neck "WEST:6,SOUTH+2:9" -#define ui_head "WEST+1:8,SOUTH+3:11" - //Ghosts - #define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" #define ui_ghost_orbit "SOUTH:6,CENTER-1:24" #define ui_ghost_reenter_corpse "SOUTH:6,CENTER:24" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index abcf107d202..a833d1c6859 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -57,6 +57,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/obj/screen/healths var/obj/screen/healthdoll var/obj/screen/internals + var/obj/screen/spacesuit // subtypes can override this to force a specific UI style var/ui_style @@ -101,6 +102,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( healths = null healthdoll = null internals = null + spacesuit = null lingchemdisplay = null devilsouldisplay = null lingstingdisplay = null diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index fcdc69d4c1c..c2d0b0526ee 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -315,6 +315,10 @@ internals.hud = src infodisplay += internals + spacesuit = new /obj/screen/spacesuit + spacesuit.hud = src + infodisplay += spacesuit + healths = new /obj/screen/healths() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm index 277ea8b898a..9389d25f427 100644 --- a/code/_onclick/hud/lavaland_elite.dm +++ b/code/_onclick/hud/lavaland_elite.dm @@ -1,7 +1,7 @@ /datum/hud/lavaland_elite ui_style = 'icons/mob/screen_elite.dmi' -/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) +/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite/owner) ..() pull_icon = new /obj/screen/pull() @@ -11,6 +11,6 @@ pull_icon.hud = src static_inventory += pull_icon - healths = new /obj/screen/healths/lavaland_elite() - healths.hud = src - infodisplay += healths + healthdoll = new /obj/screen/healthdoll/lavaland_elite() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index d605995f489..84b91263dec 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -342,6 +342,11 @@ return C.update_action_buttons_icon() +/obj/screen/spacesuit + name = "Space suit cell status" + icon_state = "spacesuit_0" + screen_loc = ui_spacesuit + /obj/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen_midnight.dmi' @@ -406,7 +411,6 @@ var/mob/living/user = hud?.mymob if(!istype(user)) return - if(!user.resting) icon_state = "act_rest" else @@ -609,21 +613,19 @@ /obj/screen/healths/blob/naut/core name = "overmind health" - screen_loc = ui_health icon_state = "corehealth" + screen_loc = ui_health /obj/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' icon_state = "base" - screen_loc = ui_living_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/screen/healths/revenant name = "essence" icon = 'icons/mob/actions/backgrounds.dmi' icon_state = "bg_revenant" - screen_loc = ui_living_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/screen/healths/construct @@ -632,18 +634,6 @@ screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/slime - icon = 'icons/mob/screen_slime.dmi' - icon_state = "slime_health0" - screen_loc = ui_slime_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/lavaland_elite - icon = 'icons/mob/screen_elite.dmi' - icon_state = "elite_health0" - screen_loc = ui_living_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - /obj/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll @@ -658,6 +648,16 @@ screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update +/obj/screen/healthdoll/slime + icon = 'icons/mob/screen_slime.dmi' + icon_state = "slime_health0" + screen_loc = ui_living_healthdoll + +/obj/screen/healthdoll/lavaland_elite + icon = 'icons/mob/screen_elite.dmi' + icon_state = "elite_health0" + screen_loc = ui_living_healthdoll + /obj/screen/mood name = "mood" icon_state = "mood5" diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm index 46df28799bf..a70f2d32ef5 100644 --- a/code/_onclick/hud/slime.dm +++ b/code/_onclick/hud/slime.dm @@ -11,6 +11,6 @@ pull_icon.hud = src static_inventory += pull_icon - healths = new /obj/screen/healths/slime() - healths.hud = src - infodisplay += healths + healthdoll = new /obj/screen/healthdoll/slime() + healthdoll.hud = src + infodisplay += healthdoll diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 589109d45e6..4dc647b8cea 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -4,7 +4,7 @@ if(can_reenter_corpse && mind && mind.current) if(A == mind.current || (mind.current in A)) // double click your corpse or whatever holds it - reenter_corpse() // (cloning scanner, body bag, closet, mech, etc) + reenter_corpse() // (body bag, closet, mech, etc) return // seems legit. // Things you might plausibly want to follow diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index f6668eef33e..1d6c4d82852 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -97,7 +97,7 @@ A.attack_animal(src) /atom/proc/attack_animal(mob/user) - return + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) /mob/living/RestrainedClickOn(atom/A) return diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index b8fa4e456dd..1ec0829c701 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -66,6 +66,8 @@ /datum/config_entry/flag/disable_peaceborg +/datum/config_entry/flag/disable_warops + /datum/config_entry/flag/economy //money money money money money money money money money money money money /datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors @@ -393,4 +395,8 @@ config_entry_value = 64 min_val = 0 +/datum/config_entry/number/maxfine + config_entry_value = 1000 + min_val = 0 + /datum/config_entry/flag/dynamic_config_enabled diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 811937deb13..210b3e8cacb 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -284,12 +284,6 @@ /datum/config_entry/flag/maprotation -/datum/config_entry/number/maprotatechancedelta - config_entry_value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - /datum/config_entry/number/soft_popcap config_entry_value = null min_val = 0 diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index ae27e42a617..8b068e5d675 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -7,22 +7,47 @@ PROCESSING_SUBSYSTEM_DEF(dcs) /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(datum/element/eletype, ...) +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + var/datum/element/eletype = arguments[1] var/element_id = eletype + if(!ispath(eletype, /datum/element)) + CRASH("Attempted to instantiate [eletype] as a /datum/element") + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - var/list/fullid = list("[eletype]") - for(var/i in initial(eletype.id_arg_index) to length(args)) - var/argument = args[i] - if(istext(argument) || isnum(argument)) - fullid += "[argument]" - else - fullid += "[REF(argument)]" - element_id = fullid.Join("&") + element_id = GetIdFromArguments(arguments) . = elements_by_type[element_id] if(.) return - if(!ispath(eletype, /datum/element)) - CRASH("Attempted to instantiate [eletype] as a /datum/element") . = elements_by_type[element_id] = new eletype + +/**** + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ +/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) + var/datum/element/eletype = arguments[1] + var/list/fullid = list("[eletype]") + var/list/named_arguments = list() + for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/key = arguments[i] + var/value + if(istext(key)) + value = arguments[key] + if(!(istext(key) || isnum(key))) + key = REF(key) + key = "[key]" // Key is stringified so numbers dont break things + if(!isnull(value)) + if(!(istext(value) || isnum(value))) + value = REF(value) + named_arguments["[key]"] = value + else + fullid += "[key]" + + if(length(named_arguments)) + named_arguments = sortList(named_arguments) + fullid += named_arguments + return list2params(fullid) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index f17c5c5e55c..cf7d9c460e0 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -97,9 +97,10 @@ SUBSYSTEM_DEF(events) //aka Badmin Central // > Not in modules/admin // REEEEEEEEE +// Why the heck is this here! Took me so damn long to find! /client/proc/forceEvent() set name = "Trigger Event" - set category = "Fun" + set category = "Admin - Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 5f2524a0b64..271e9e5a20b 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -417,7 +417,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) //Manual loading of away missions. /client/proc/admin_away() set name = "Load Away Mission" - set category = "Fun" + set category = "Admin - Events" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 0dcc5e96997..9813df6e747 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -7,12 +7,11 @@ These materials call on_applied() on whatever item they are applied to, common e SUBSYSTEM_DEF(materials) name = "Materials" - flags = SS_NO_FIRE - init_order = INIT_ORDER_MATERIALS + flags = SS_NO_FIRE | SS_NO_INIT ///Dictionary of material.type || material ref - var/list/materials = list() + var/list/materials ///Dictionary of category || list of material refs - var/list/materials_by_category = list() + var/list/materials_by_category ///List of stackcrafting recipes for materials using rigid materials var/list/rigid_stack_recipes = list( new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), @@ -20,14 +19,17 @@ SUBSYSTEM_DEF(materials) new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), ) -/datum/controller/subsystem/materials/Initialize(timeofday) - InitializeMaterials() - return ..() - ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) -/datum/controller/subsystem/materials/proc/InitializeMaterials(timeofday) +/datum/controller/subsystem/materials/proc/InitializeMaterials() + materials = list() + materials_by_category = list() for(var/type in subtypesof(/datum/material)) var/datum/material/ref = new type materials[type] = ref for(var/c in ref.categories) materials_by_category[c] += list(ref) + +/datum/controller/subsystem/materials/proc/GetMaterialRef(datum/material/fakemat) + if(!materials) + InitializeMaterials() + return materials[fakemat] || fakemat diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 969893e6714..d75b9d620a9 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -83,7 +83,7 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/under/rank/security/head_of_security/grey, /obj/item/clothing/under/rank/security/head_of_security/alt, /obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck, /obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female, - /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton, + /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor, /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/officer, /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, @@ -122,7 +122,7 @@ SUBSYSTEM_DEF(traumas) "aliens" = typecacheof(list(/obj/item/clothing/mask/facehugger, /obj/item/organ/body_egg/alien_embryo, /obj/structure/alien, /obj/item/toy/toy_xeno, /obj/item/clothing/suit/armor/abductor, /obj/item/abductor, /obj/item/gun/energy/alien, - /obj/item/abductor/baton, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, + /obj/item/melee/baton/abductor, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien, /obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor, /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland, diff --git a/code/datums/action.dm b/code/datums/action.dm index 7d9f5a5e593..32b7c643178 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -272,14 +272,18 @@ if(istype(H)) H.toggle_welding_screen(owner) -/datum/action/item_action/toggle_headphones - name = "Toggle Headphones" - desc = "UNTZ UNTZ UNTZ" +/datum/action/item_action/toggle_spacesuit + name = "Toggle Suit Thermal Regulator" + icon_icon = 'icons/mob/actions/actions_spacesuit.dmi' + button_icon_state = "thermal_off" -/datum/action/item_action/toggle_headphones/Trigger() - var/obj/item/clothing/ears/headphones/H = target - if(istype(H)) - H.toggle(owner) +/datum/action/item_action/toggle_spacesuit/Trigger() + var/obj/item/clothing/suit/space/suit = target + if(!istype(suit)) + return + suit.toggle_spacesuit() + button_icon_state = "thermal_[suit.thermal_on ? "on" : "off"]" + UpdateButtonIcon() /datum/action/item_action/toggle_unfriendly_fire name = "Toggle Friendly Fire \[ON\]" diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm index 1aa1341c9cf..ca63c5b3d66 100644 --- a/code/datums/brain_damage/brain_trauma.dm +++ b/code/datums/brain_damage/brain_trauma.dm @@ -14,7 +14,6 @@ var/can_gain = TRUE var/random_gain = TRUE //can this be gained through random traumas? var/resilience = TRAUMA_RESILIENCE_BASIC //how hard is this to cure? - var/clonable = TRUE // will this transfer if the brain is cloned? /datum/brain_trauma/Destroy() if(brain && brain.traumas) @@ -25,10 +24,6 @@ owner = null return ..() -/datum/brain_trauma/proc/on_clone() - if(clonable) - return new type - //Called on life ticks /datum/brain_trauma/proc/on_life() return diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index 80a1bd24704..12faa9ba365 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -31,11 +31,6 @@ trigger_species = SStraumas.phobia_species[phobia_type] ..() - -/datum/brain_trauma/mild/phobia/on_clone() - if(clonable) - return new type(phobia_type) - /datum/brain_trauma/mild/phobia/on_life() ..() if(HAS_TRAIT(owner, TRAIT_FEARLESS)) diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 9444795108d..c743bf200da 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -142,7 +142,6 @@ /datum/brain_trauma/special/psychotic_brawling/bath_salts name = "Chemical Violent Psychosis" - clonable = FALSE /datum/brain_trauma/special/tenacity name = "Tenacity" @@ -244,7 +243,6 @@ scan_desc = "criminal mind" gain_text = "Justice is coming for you." lose_text = "You were absolved for your crimes." - clonable = FALSE random_gain = FALSE var/obj/effect/hallucination/simple/securitron/beepsky diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 88e13ae5ffe..7a03d87fc4d 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -13,15 +13,15 @@ /// Defines how duplicate existing components are handled when added to a datum /// See `COMPONENT_DUPE_*` definitions for available options var/dupe_mode = COMPONENT_DUPE_HIGHLANDER - + /// The type to check for duplication /// `null` means exact match on `type` (default) /// Any other type means that and all subtypes var/dupe_type - + /// The datum this components belongs to var/datum/parent - + /// Only set to true if you are able to properly transfer this component /// At a minimum RegisterWithParent and UnregisterFromParent should be used /// Make sure you also implement PostTransfer for any post transfer handling @@ -34,14 +34,14 @@ * Arguments: * * datum/P the parent datum this component reacts to signals from */ -/datum/component/New(datum/P, ...) - parent = P - var/list/arguments = args.Copy(2) +/datum/component/New(list/raw_args) + parent = raw_args[1] + var/list/arguments = raw_args.Copy(2) if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE) qdel(src, TRUE, TRUE) - CRASH("Incompatible [type] assigned to a [P.type]! args: [json_encode(arguments)]") + CRASH("Incompatible [type] assigned to a [parent.type]! args: [json_encode(arguments)]") - _JoinParent(P) + _JoinParent(parent) /** * Called during component creation with the same arguments as in new excluding parent. @@ -203,6 +203,8 @@ if(!islist(sig_type_or_types)) sig_type_or_types = list(sig_type_or_types) for(var/sig in sig_type_or_types) + if(!signal_procs[target][sig]) + continue switch(length(lookup[sig])) if(2) lookup[sig] = (lookup[sig]-src)[1] @@ -359,7 +361,8 @@ * If this tries to add an component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it * Properly handles duplicate situations based on the `dupe_mode` var */ -/datum/proc/AddComponent(new_type, ...) +/datum/proc/_AddComponent(list/raw_args) + var/new_type = raw_args[1] var/datum/component/nt = new_type var/dm = initial(nt.dupe_mode) var/dt = initial(nt.dupe_type) @@ -374,7 +377,7 @@ new_comp = nt nt = new_comp.type - args[1] = src + raw_args[1] = src if(dm != COMPONENT_DUPE_ALLOWED) if(!dt) @@ -385,24 +388,25 @@ switch(dm) if(COMPONENT_DUPE_UNIQUE) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) old_comp.InheritComponent(new_comp, TRUE) QDEL_NULL(new_comp) if(COMPONENT_DUPE_HIGHLANDER) if(!new_comp) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) if(!QDELETED(new_comp)) new_comp.InheritComponent(old_comp, FALSE) QDEL_NULL(old_comp) if(COMPONENT_DUPE_UNIQUE_PASSARGS) if(!new_comp) - var/list/arguments = args.Copy(2) - old_comp.InheritComponent(null, TRUE, arguments) + var/list/arguments = raw_args.Copy(2) + arguments.Insert(1, null, TRUE) + old_comp.InheritComponent(arglist(arguments)) else old_comp.InheritComponent(new_comp, TRUE) if(COMPONENT_DUPE_SELECTIVE) - var/list/arguments = args.Copy() + var/list/arguments = raw_args.Copy() arguments[1] = new_comp var/make_new_component = TRUE for(var/i in GetComponents(new_type)) @@ -412,11 +416,11 @@ QDEL_NULL(new_comp) break if(!new_comp && make_new_component) - new_comp = new nt(arglist(args)) + new_comp = new nt(raw_args) else if(!new_comp) - new_comp = new nt(arglist(args)) // There's a valid dupe mode but there's no old component, act like normal + new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal else if(!new_comp) - new_comp = new nt(arglist(args)) // Dupes are allowed, act like normal + new_comp = new nt(raw_args) // Dupes are allowed, act like normal if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) @@ -435,7 +439,7 @@ /datum/proc/LoadComponent(component_type, ...) . = GetComponent(component_type) if(!.) - return AddComponent(arglist(args)) + return _AddComponent(args) /** * Removes the component from parent, ends up with a null parent diff --git a/code/datums/components/beauty.dm b/code/datums/components/beauty.dm index 1be21cf0cb5..8d36cf0294b 100644 --- a/code/datums/components/beauty.dm +++ b/code/datums/components/beauty.dm @@ -2,13 +2,13 @@ var/beauty = 0 /datum/component/beauty/Initialize(beautyamount) - if(!ismovableatom(parent)) + if(!isatom(parent)) return COMPONENT_INCOMPATIBLE beauty = beautyamount RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area) RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area) var/area/A = get_area(parent) - if(A) + if(A) enter_area(null, A) /datum/component/beauty/proc/enter_area(datum/source, area/A) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index adf81dda997..77e8e63fbfd 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -385,19 +385,19 @@ return switch(action) if("make") + var/mob/user = usr var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes busy = TRUE - ui_interact(usr) - var/atom/movable/result = construct_item(usr, TR) + ui_interact(user) + var/atom/movable/result = construct_item(user, TR) if(!istext(result)) //We made an item and didn't get a fail message - if(ismob(usr)) //In case the user is actually possessing a non mob like a machine - var/mob/m = usr - m.put_in_hands(result) + if(ismob(user) && isitem(result)) //In case the user is actually possessing a non mob like a machine + user.put_in_hands(result) else - result.forceMove(usr.loc) - to_chat(usr, "[TR.name] constructed.") + result.forceMove(user.drop_location()) + to_chat(user, "[TR.name] constructed.") else - to_chat(usr, "Construction failed[result]") + to_chat(user, "Construction failed[result]") busy = FALSE if("toggle_recipes") display_craftable_only = !display_craftable_only diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 8bc450a4e89..7dda2b1ac45 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -786,3 +786,11 @@ /obj/item/shovel/spade = 1) result = /obj/item/shovel/serrated category = CAT_PRIMAL + +/datum/crafting_recipe/lasso + name = "Bone Lasso" + reqs = list( + /obj/item/stack/sheet/bone = 1, + /obj/item/stack/sheet/sinew = 5) + result = /obj/item/key/lasso + category = CAT_PRIMAL diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm new file mode 100644 index 00000000000..22825fe3de2 --- /dev/null +++ b/code/datums/components/edible.dm @@ -0,0 +1,237 @@ +/*! + +This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items). +These items take a specific time to eat, and can do most of the things our original food items could. + +Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else: + Components: + Drying component (jerky etc) + Customizable component (custom pizzas etc) + Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.) + Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents) + + Misc: + Something for cakes (You can store things inside) + +*/ +/datum/component/edible + ///Amount of reagents taken per bite + var/bite_consumption = 2 + ///Amount of bites taken so far + var/bitecount = 0 + ///Flags for food + var/food_flags = NONE + ///Bitfield of the types of this food + var/foodtypes = NONE + ///Amount of seconds it takes to eat this food + var/eat_time = 30 + ///Defines how much it lowers someones satiety (Need to eat, essentialy) + var/junkiness = 0 + ///Message to send when eating + var/list/eatverbs + ///Callback to be ran for when you take a bite of something + var/datum/callback/after_eat + ///Last time we checked for food likes + var/last_check_time + +/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand) + else if(isturf(parent)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatTurf) + + src.bite_consumption = bite_consumption + src.food_flags = food_flags + src.foodtypes = foodtypes + src.eat_time = eat_time + src.eatverbs = eatverbs + src.junkiness = junkiness + src.after_eat = after_eat + + var/atom/owner = parent + + owner.create_reagents(volume, INJECTABLE) + + if(initial_reagents) + for(var/rid in initial_reagents) + var/amount = initial_reagents[rid] + if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) + owner.reagents.add_reagent(rid, amount, tastes.Copy()) + else + owner.reagents.add_reagent(rid, amount) + +/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) + if(!food_flags & FOOD_IN_CONTAINER) + switch (bitecount) + if (0) + return + if(1) + examine_list += "[parent] was bitten by someone!" + if(2,3) + examine_list += "[parent] was bitten [bitecount] times!" + else + examine_list += "[parent] was bitten multiple times!" + +/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) + return TryToEat(M, user) + +/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user) + return TryToEat(user, user) + +///All the checks for the act of eating itself and +/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) + + var/atom/owner = parent + + if(feeder.a_intent == INTENT_HARM) + return + if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it. + to_chat(feeder, "None of [owner] left, oh no!") + qdel(parent) + return + if(!CanConsume(eater, feeder)) + return + var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this + for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting + fullness += C.nutriment_factor * C.volume / C.metabolization_rate + + . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose + + if(eater == feeder)//If you're eating it yourself. + if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time + return + var/eatverb = pick(eatverbs) + if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) + to_chat(eater, "You don't feel like eating any more junk food at the moment!") + return + else if(fullness <= 50) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!") + else if(fullness > 50 && fullness < 150) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].") + else if(fullness > 150 && fullness < 500) + eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].") + else if(fullness > 500 && fullness < 600) + eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].") + else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat + eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!") + return + else //If you're feeding it to someone else. + if(isbrain(eater)) + to_chat(feeder, "[eater] doesn't seem to have a mouth!") + return + if(fullness <= (600 * (1 + eater.overeatduration / 1000))) + eater.visible_message("[feeder] attempts to feed [eater] [parent].", \ + "[feeder] attempts to feed you [parent].") + else + eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \ + "[feeder] cannot force any more of [parent] down your throat!") + return + if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed + return + + log_combat(feeder, eater, "fed", owner.reagents.log_list()) + eater.visible_message("[feeder] forces [eater] to eat [parent]!", \ + "[feeder] forces you to eat [parent]!") + + TakeBite(eater, feeder) + +///This function lets the eater take a bite and transfers the reagents to the eater. +/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder) + + var/atom/owner = parent + + if(!owner.reagents) + return FALSE + if(eater.satiety > -200) + eater.satiety -= junkiness + playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + if(owner.reagents.total_volume) + SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST) + bitecount++ + On_Consume(eater) + checkLiked(fraction, eater) + + //Invoke our after eat callback if it is valid + if(after_eat) + after_eat.Invoke(eater, feeder) + + return TRUE + +///Checks whether or not the eater can actually consume the food +/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder) + if(!iscarbon(eater)) + return FALSE + var/mob/living/carbon/C = eater + var/covered = "" + if(C.is_mouth_covered(head_only = 1)) + covered = "headgear" + else if(C.is_mouth_covered(mask_only = 1)) + covered = "mask" + if(covered) + var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" + to_chat(feeder, "You have to remove [who] [covered] first!") + return FALSE + return TRUE + +///Check foodtypes to see if we should send a moodlet +/datum/component/edible/proc/checkLiked(var/fraction, mob/M) + if(last_check_time + 50 > world.time) + return FALSE + if(!ishuman(M)) + return FALSE + var/mob/living/carbon/human/H = M + if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food) + to_chat(H, "You don't feel so good...") + H.adjust_disgust(25 + 30 * fraction) + else + if(foodtypes & H.dna.species.toxic_food) + to_chat(H,"What the hell was that thing?!") + H.adjust_disgust(25 + 30 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) + else if(foodtypes & H.dna.species.disliked_food) + to_chat(H,"That didn't taste very good...") + H.adjust_disgust(11 + 15 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) + else if(foodtypes & H.dna.species.liked_food) + to_chat(H,"I love this taste!") + H.adjust_disgust(-5 + -2.5 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) + if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) + last_check_time = world.time + +///Delete the item when it is fully eaten +/datum/component/edible/proc/On_Consume(mob/living/eater) + + var/atom/owner = parent + + if(!eater) + return + if(!owner.reagents.total_volume) + qdel(parent) + +///Ability to feed food to puppers +/datum/component/edible/proc/UseByAnimal(datum/source, mob/user) + + var/atom/owner = parent + + if(!isdog(user)) + return + var/mob/living/L = user + if(bitecount == 0 || prob(50)) + L.emote("me", 1, "nibbles away at \the [parent]") + bitecount++ + . = COMPONENT_ITEM_NO_ATTACK + L.taste(owner.reagents) // why should carbons get all the fun? + if(bitecount >= 5) + var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was") + if(sattisfaction_text) + L.emote("me", 1, "[sattisfaction_text]") + qdel(parent) diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 962e1d2080c..d1dbb305e92 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -5,8 +5,10 @@ var/light_impact_range = 2 var/flash_range = 3 var/equipped_slot //For items, lets us determine where things should be hit. + ///wheter we always delete. useful for nukes turned plasma and such, so they don't default delete and can survive + var/always_delete -/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override) +/datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override, _always_delete = TRUE) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -31,6 +33,7 @@ light_impact_range = light_impact_range_override if(flash_range_override) flash_range = flash_range_override + always_delete = _always_delete /datum/component/explodable/proc/explodable_insert_item(datum/source, obj/item/I, mob/M, silent = FALSE, force = FALSE) check_if_detonate(I) @@ -105,6 +108,7 @@ if(light_impact_range < 1) log = FALSE explosion(A, devastation_range, heavy_impact_range, light_impact_range, flash_range, log) //epic explosion time - qdel(A) + if(always_delete) + qdel(A) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 86e016784ad..a203264fae0 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -37,17 +37,16 @@ /datum/component/fantasy/UnregisterFromParent() unmodify() -/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments) +/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, quality, list/affixes, canFail, announce) unmodify() if(newComp) - quality += newComp.quality - canFail = newComp.canFail - announce = newComp.announce + src.quality += newComp.quality + src.canFail = newComp.canFail + src.announce = newComp.announce else - arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given - quality += arguments[1] - canFail = arguments[4] || canFail - announce = arguments[5] || announce + src.quality += quality + src.canFail = canFail || src.canFail + src.announce = announce || src.announce modify() /datum/component/fantasy/proc/randomQuality() diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index e0de6259bf4..442236ae9ff 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -42,7 +42,7 @@ return var/mob/living/LM = parent - if(!T.footstep || LM.buckled || LM.lying || !CHECK_MULTIPLE_BITFIELDS(LM.mobility_flags, MOBILITY_STAND | MOBILITY_MOVE) || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) + if(!T.footstep || LM.buckled || LM.lying || !((LM.mobility_flags & (MOBILITY_STAND | MOBILITY_MOVE)) == (MOBILITY_STAND | MOBILITY_MOVE)) || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * volume) return diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 9bf2dc3819e..29931c900ef 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -42,7 +42,7 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine) for(var/mat in mat_list) //Make the assoc list ref | amount - var/datum/material/M = getmaterialref(mat) || mat + var/datum/material/M = SSmaterials.GetMaterialRef(mat) materials[M] = 0 /datum/component/material_container/proc/OnExamine(datum/source, mob/user) @@ -128,9 +128,9 @@ return primary_mat /// For inserting an amount of material -/datum/component/material_container/proc/insert_amount_mat(amt, var/datum/material/mat) +/datum/component/material_container/proc/insert_amount_mat(amt, var/datum/material/mat) if(!istype(mat)) - mat = getmaterialref(mat) + mat = SSmaterials.GetMaterialRef(mat) if(amt > 0 && has_space(amt)) var/total_amount_saved = total_amount if(mat) @@ -143,9 +143,9 @@ return FALSE /// Uses an amount of a specific material, effectively removing it. -/datum/component/material_container/proc/use_amount_mat(amt, var/datum/material/mat) +/datum/component/material_container/proc/use_amount_mat(amt, var/datum/material/mat) if(!istype(mat)) - mat = getmaterialref(mat) + mat = SSmaterials.GetMaterialRef(mat) var/amount = materials[mat] if(mat) if(amount >= amt) @@ -155,9 +155,9 @@ return FALSE /// Proc for transfering materials to another container. -/datum/component/material_container/proc/transer_amt_to(var/datum/component/material_container/T, amt, var/datum/material/mat) +/datum/component/material_container/proc/transer_amt_to(var/datum/component/material_container/T, amt, var/datum/material/mat) if(!istype(mat)) - mat = getmaterialref(mat) + mat = SSmaterials.GetMaterialRef(mat) if((amt==0)||(!T)||(!mat)) return FALSE if(amt<0) @@ -184,13 +184,13 @@ /datum/component/material_container/proc/use_materials(list/mats, multiplier=1) if(!mats || !length(mats)) return FALSE - + var/list/mats_to_remove = list() //Assoc list MAT | AMOUNT for(var/x in mats) //Loop through all required materials var/datum/material/req_mat = x if(!istype(req_mat)) - req_mat = getmaterialref(req_mat) //Get the ref if necesary + req_mat = SSmaterials.GetMaterialRef(req_mat) //Get the ref if necesary if(!materials[req_mat]) //Do we have the resource? return FALSE //Can't afford it var/amount_required = mats[x] * multiplier @@ -198,7 +198,7 @@ return FALSE //Can't afford it mats_to_remove[req_mat] += amount_required //Add it to the assoc list of things to remove continue - + var/total_amount_save = total_amount for(var/i in mats_to_remove) @@ -207,7 +207,7 @@ return total_amount_save - total_amount /// For spawning mineral sheets at a specific location. Used by machines to output sheets. -/datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null) +/datum/component/material_container/proc/retrieve_sheets(sheet_amt, var/datum/material/M, target = null) if(!M.sheet_type) return 0 //Add greyscale sheet handling here later if(sheet_amt <= 0) @@ -231,7 +231,7 @@ /// Proc to get all the materials and dump them as sheets -/datum/component/material_container/proc/retrieve_all(target = null) +/datum/component/material_container/proc/retrieve_all(target = null) var/result = 0 for(var/MAT in materials) var/amount = materials[MAT] @@ -251,7 +251,7 @@ var/datum/material/req_mat = x if(!istype(req_mat)) if(ispath(req_mat)) //Is this an actual material, or is it a category? - req_mat = getmaterialref(req_mat) //Get the ref + req_mat = SSmaterials.GetMaterialRef(req_mat) //Get the ref else // Its a category. (For example MAT_CATEGORY_RIGID) if(!has_enough_of_category(req_mat, mats[x], multiplier)) //Do we have enough of this category? @@ -265,7 +265,7 @@ return TRUE /// Returns all the categories in a recipe. -/datum/component/material_container/proc/get_categories(list/mats) +/datum/component/material_container/proc/get_categories(list/mats) var/list/categories = list() for(var/x in mats) //Loop through all required materials if(!istext(x)) //This means its not a category @@ -275,12 +275,12 @@ /// Returns TRUE if you have enough of the specified material. -/datum/component/material_container/proc/has_enough_of_material(var/datum/material/req_mat, amount, multiplier=1) +/datum/component/material_container/proc/has_enough_of_material(var/datum/material/req_mat, amount, multiplier=1) if(!materials[req_mat]) //Do we have the resource? return FALSE //Can't afford it var/amount_required = amount * multiplier if(materials[req_mat] >= amount_required) // do we have enough of the resource? - return TRUE + return TRUE return FALSE //Can't afford it /// Returns TRUE if you have enough of a specified material category (Which could be multiple materials) @@ -292,7 +292,7 @@ return FALSE /// Turns a material amount into the amount of sheets it should output -/datum/component/material_container/proc/amount2sheet(amt) +/datum/component/material_container/proc/amount2sheet(amt) if(amt >= MINERAL_MATERIAL_AMOUNT) return round(amt / MINERAL_MATERIAL_AMOUNT) return FALSE @@ -314,7 +314,7 @@ return material_amount /// Returns the amount of a specific material in this container. -/datum/component/material_container/proc/get_material_amount(var/datum/material/mat) +/datum/component/material_container/proc/get_material_amount(var/datum/material/mat) if(!istype(mat)) - mat = getmaterialref(mat) + mat = SSmaterials.GetMaterialRef(mat) return(materials[mat]) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 1c8c451acf4..c38080b4535 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -192,15 +192,12 @@ ///Sets sanity to the specified amount and applies effects. /datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_GREAT, override = FALSE) - // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.5 + // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.7 // If the new amount would move towards the acceptable range faster then use it instead if(amount < minimum) - amount += CLAMP(minimum - sanity, 0, 0.7) - else - if(!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) - maximum = sanity - if(amount > maximum) - amount = min(maximum, sanity) + amount += clamp(minimum - amount, 0, 0.7) + if((!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) || amount > maximum) + amount = min(sanity, amount) if(amount == sanity) //Prevents stuff from flicking around. return sanity = amount diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 3fa59b1535b..64870dfca6d 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -101,11 +101,11 @@ host_mob = null return ..() -/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, list/arguments) +/datum/component/nanites/InheritComponent(datum/component/nanites/new_nanites, i_am_original, amount, cloud) if(new_nanites) adjust_nanites(null, new_nanites.nanite_volume) else - adjust_nanites(null, arguments[1]) //just add to the nanite volume + adjust_nanites(null, amount) //just add to the nanite volume /datum/component/nanites/process() if(!IS_IN_STASIS(host_mob)) @@ -200,12 +200,17 @@ var/datum/nanite_program/NP = X NP.on_emp(severity) -/datum/component/nanites/proc/on_shock(datum/source, shock_damage) - nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites - adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume - for(var/X in programs) - var/datum/nanite_program/NP = X - NP.on_shock(shock_damage) + +/datum/component/nanites/proc/on_shock(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) + if(flags & SHOCK_ILLUSION || shock_damage < 1) + return + + if(!HAS_TRAIT_NOT_FROM(host_mob, TRAIT_SHOCKIMMUNE, "nanites"))//Another shock protection must protect nanites too, but nanites protect only host + nanite_volume *= (rand(45, 80) * 0.01) //Lose 20-55% of nanites + adjust_nanites(null, -(rand(5, 50))) //Lose 5-50 flat nanite volume + for(var/X in programs) + var/datum/nanite_program/NP = X + NP.on_shock(shock_damage) /datum/component/nanites/proc/on_minor_shock(datum/source) adjust_nanites(null, -(rand(5, 15))) //Lose 5-15 flat nanite volume diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 44665479192..80e1bc59505 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -37,9 +37,9 @@ orbiters = null return ..() -/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments) - if(arguments) - begin_orbit(arglist(arguments)) +/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) + if(!newcomp) + begin_orbit(arglist(args.Copy(3))) return // The following only happens on component transfers orbiters += newcomp.orbiters diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index ed34ac90074..0b9b62eb7c6 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -18,7 +18,7 @@ hl3_release_date = _half_life can_contaminate = _can_contaminate - if(istype(parent, /atom)) + if(istype(parent, /atom)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) if(istype(parent, /obj/item)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) @@ -47,7 +47,7 @@ qdel(src) return PROCESS_KILL -/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, list/arguments) +/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original, _strength, _source, _half_life, _can_contaminate) if(!i_am_original) return if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger @@ -56,7 +56,7 @@ var/datum/component/radioactive/other = C strength = max(strength, other.strength) else - strength = max(strength, arguments[1]) + strength = max(strength, _strength) /datum/component/radioactive/proc/rad_examine(datum/source, mob/user, atom/thing) var/atom/master = parent diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index ab5dd224733..e4faab361a6 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -54,11 +54,22 @@ handles linking back and forth. /datum/component/remote_materials/proc/_MakeLocal() silo = null - mat_container = parent.AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - local_size, - FALSE, - /obj/item/stack) + + var/static/list/allowed_mats = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + + mat_container = parent.AddComponent(/datum/component/material_container, allowed_mats, local_size, allowed_types=/obj/item/stack) /datum/component/remote_materials/proc/set_local_size(size) local_size = size diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 5f60daff4d1..475ea1f5544 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -197,7 +197,7 @@ handle_vehicle_layer() handle_vehicle_offsets() else - to_chat(user, "You'll need the keys in one of your hands to [drive_verb] [AM].") + to_chat(user, "You'll need a special item in one of your hands to [drive_verb] [AM].") /datum/component/riding/proc/Unbuckle(atom/movable/M) addtimer(CALLBACK(parent, /atom/movable/.proc/unbuckle_mob, M), 0, TIMER_UNIQUE) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 51d67e10e20..0282f247153 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -16,13 +16,13 @@ src.allow_death = allow_death check_in_bounds() // Just in case something is being created outside of station/centcom -/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, list/arguments) +/datum/component/stationloving/InheritComponent(datum/component/stationloving/newc, original, inform_admins, allow_death) if (original) - if (istype(newc)) + if (newc) inform_admins = newc.inform_admins allow_death = newc.allow_death - else if (LAZYLEN(arguments)) - inform_admins = arguments[1] + else + inform_admins = inform_admins /datum/component/stationloving/proc/relocate() var/targetturf = find_safe_turf() diff --git a/code/datums/components/stationstuck.dm b/code/datums/components/stationstuck.dm index 5fd00d30119..b9027ef8115 100644 --- a/code/datums/components/stationstuck.dm +++ b/code/datums/components/stationstuck.dm @@ -15,11 +15,13 @@ stuck_zlevel = L.z -/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, list/arguments) - if(original) - if(istype(newc)) - murder = newc.murder - message = newc.message +/datum/component/stationstuck/InheritComponent(datum/component/stationstuck/newc, original, _murder, _message) + if(newc) + murder = newc.murder + message = newc.message + else + murder = _murder + message = _message /datum/component/stationstuck/proc/punish() var/mob/living/L = parent diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index ce397f9fea5..b745e740571 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -52,13 +52,13 @@ master.cut_overlay(overlay) return ..() -/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, list/arguments) +/datum/component/thermite/InheritComponent(datum/component/thermite/newC, i_am_original, _amount) if(!i_am_original) return if(newC) amount += newC.amount else - amount += arguments[1] + amount += _amount /datum/component/thermite/proc/thermite_melt(mob/user) var/turf/master = parent diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 715c20e4219..fd2a82ce042 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -12,9 +12,9 @@ var/permanent = FALSE var/last_process = 0 -/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, argslist) +/datum/component/wet_floor/InheritComponent(datum/newcomp, orig, strength, duration_minimum, duration_add, duration_maximum, _permanent) if(!newcomp) //We are getting passed the arguments of a would-be new component, but not a new component - add_wet(arglist(argslist)) + add_wet(arglist(args.Copy(3))) else //We are being passed in a full blown component var/datum/component/wet_floor/WF = newcomp //Lets make an assumption if(WF.gc()) //See if it's even valid, still. Also does LAZYLEN and stuff for us. diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 231fc1ec01f..d6db4de908f 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -11,7 +11,6 @@ var/list/temporary_mutations = list() //Temporary changes to the UE var/list/previous = list() //For temporary name/ui/ue/blood_type modifications var/mob/living/holder - var/delete_species = TRUE //Set to FALSE when a body is scanned by a cloner to fix #38875 var/mutation_index[DNA_MUTATION_BLOCKS] //List of which mutations this carbon has and its assigned block var/stability = 100 var/scrambled = FALSE //Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. @@ -27,8 +26,7 @@ cholder.dna = null holder = null - if(delete_species) - QDEL_NULL(species) + QDEL_NULL(species) mutations.Cut() //This only references mutations, just dereference. temporary_mutations.Cut() //^ diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index bf510e0f56f..f74dcd0b6e1 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -36,16 +36,16 @@ //DATUM PROCS /// Finds the singleton for the element type given and attaches it to src -/datum/proc/AddElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) - args[1] = src - if(ele.Attach(arglist(args)) == ELEMENT_INCOMPATIBLE) - CRASH("Incompatible [eletype] assigned to a [type]! args: [json_encode(args)]") +/datum/proc/_AddElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) + arguments[1] = src + if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) + CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src * You only need additional arguments beyond the type if you're using ELEMENT_BESPOKE */ -/datum/proc/RemoveElement(eletype, ...) - var/datum/element/ele = SSdcs.GetElement(arglist(args)) +/datum/proc/_RemoveElement(list/arguments) + var/datum/element/ele = SSdcs.GetElement(arguments) ele.Detach(src) diff --git a/code/datums/elements/dunkable.dm b/code/datums/elements/dunkable.dm new file mode 100644 index 00000000000..c5b4a92d430 --- /dev/null +++ b/code/datums/elements/dunkable.dm @@ -0,0 +1,34 @@ +// If an item has the dunkable element, it's able to be dunked into reagent containers like beakers and glasses. +// Dunking the item into a container will transfer reagents from the container to the item. +/datum/element/dunkable + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + var/dunk_amount // the amount of reagents that will be transfered from the container to the item on each click + +/datum/element/dunkable/Attach(datum/target, amount_per_dunk) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + dunk_amount = amount_per_dunk + RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, .proc/get_dunked) + +/datum/element/dunkable/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_ITEM_AFTERATTACK) + +/datum/element/dunkable/proc/get_dunked(datum/source, atom/target, mob/user, proximity_flag) + if(!proximity_flag) // if the user is not adjacent to the container + return + var/obj/item/reagent_containers/container = target // the container we're trying to dunk into + if(istype(container) && container.reagent_flags & DUNKABLE) // container should be a valid target for dunking + if(!container.is_drainable()) + to_chat(user, "[container] is unable to be dunked in!") + return + var/obj/item/I = source // the item that has the dunkable element + if(container.reagents.trans_to(I, dunk_amount, transfered_by = user)) //if reagents were transfered, show the message + to_chat(user, "You dunk \the [I] into \the [container].") + return + if(!container.reagents.total_volume) + to_chat(user, "[container] is empty!") + else + to_chat(user, "[I] is full!") diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 7ab9e3587f8..dc95d24ea37 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -89,12 +89,14 @@ /datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) if(D.stat || D.IsParalyzed()) return 0 + var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST) + var/armor_block = D.run_armor_check(affecting, "melee") D.visible_message("[A] leg sweeps [D]!", \ "Your legs are sweeped by [A]!", "You hear a sickening sound of flesh hitting flesh!", null, A) to_chat(A, "You leg sweep [D]!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) - D.apply_damage(5, BRUTE) - D.Paralyze(40) + D.apply_damage(rand(20,30), STAMINA, affecting, armor_block) + D.Knockdown(60) log_combat(A, D, "leg sweeped") return 1 @@ -130,12 +132,14 @@ if(check_streak(A,D)) return 1 log_combat(A, D, "punched") + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") var/picked_hit_type = pick("punch", "kick") - var/bonus_damage = 10 + var/bonus_damage = 0 if(!(D.mobility_flags & MOBILITY_STAND)) bonus_damage += 5 picked_hit_type = "stomp" - D.apply_damage(bonus_damage, A.dna.species.attack_type) + D.apply_damage(rand(5,10) + bonus_damage, A.dna.species.attack_type, affecting, armor_block) if(picked_hit_type == "kick" || picked_hit_type == "stomp") A.do_attack_animation(D, ATTACK_EFFECT_KICK) playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, TRUE, -1) @@ -151,22 +155,27 @@ /datum/martial_art/krav_maga/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) if(check_streak(A,D)) return 1 - var/obj/item/I = null - if(prob(60)) - I = D.get_active_held_item() - if(I) - if(D.temporarilyRemoveItemFromInventory(I)) - A.put_in_hands(I) - D.visible_message("[A] disarms [D]!", \ - "You're disarmed by [A]!", "You hear aggressive shuffling!", COMBAT_MESSAGE_RANGE, A) - to_chat(A, "You disarm [D]!") - playsound(D, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - else - D.visible_message("[A] fails to disarm [D]!", \ - "You're nearly disarmed by [A]!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, A) - to_chat(A, "You fail to disarm [D]!") - playsound(D, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) - log_combat(A, D, "disarmed (Krav Maga)", "[I ? " removing \the [I]" : ""]") + var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) + var/armor_block = D.run_armor_check(affecting, "melee") + if((D.mobility_flags & MOBILITY_STAND)) + D.visible_message("[A] reprimands [D]!", \ + "You're slapped by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You jab [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(rand(5,10), STAMINA, affecting, armor_block) + log_combat(A, D, "punched nonlethally") + if(!(D.mobility_flags & MOBILITY_STAND)) + D.visible_message("[A] reprimands [D]!", \ + "You're manhandled by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A) + to_chat(A, "You stomp [D]!") + A.do_attack_animation(D, ATTACK_EFFECT_KICK) + playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1) + D.apply_damage(rand(10,15), STAMINA, affecting, armor_block) + log_combat(A, D, "stomped nonlethally") + if(prob(D.getStaminaLoss())) + D.visible_message("[D] sputters and recoils in pain!", "You recoil in pain as you are jabbed in a nerve!") + D.drop_all_held_items() return 1 //Krav Maga Gloves diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index b5ba7246967..5e5a2eaca34 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -41,7 +41,7 @@ Simple datum which is instanced once per type and is used for every object of sa source.name = "[name] [source.name]" if(beauty_modifier) - addtimer(CALLBACK(source, /datum.proc/AddComponent, /datum/component/beauty, beauty_modifier * amount), 0) + addtimer(CALLBACK(source, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty_modifier * amount)), 0) if(istype(source, /obj)) //objs on_applied_obj(source, amount, material_flags) diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 2f86e777029..839d6857401 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -99,12 +99,12 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() if(ismovableatom(source)) - source.AddElement(/datum/element/firestacker, 1) + source.AddElement(/datum/element/firestacker, amount=1) source.AddComponent(/datum/component/explodable, 0, 0, amount / 2500, amount / 1250) /datum/material/plasma/on_removed(atom/source, material_flags) . = ..() - source.RemoveElement(/datum/element/firestacker, 1) + source.RemoveElement(/datum/element/firestacker, amount=1) qdel(source.GetComponent(/datum/component/explodable)) ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 558b23111d5..118b691345c 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -394,7 +394,7 @@ if(creator.mind.special_role) message_admins("[ADMIN_LOOKUPFLW(current)] has been created by [ADMIN_LOOKUPFLW(creator)], an antagonist.") - to_chat(current, "Despite your creators current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") + to_chat(current, "Despite your creator's current allegiances, your true master remains [creator.real_name]. If their loyalties change, so do yours. This will never change unless your creator's body is destroyed.") /datum/mind/proc/show_memory(mob/recipient, window=1) if(!recipient) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index b2aa5b95cbd..857fb6e45ed 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -213,10 +213,6 @@ timeout = 3 MINUTES //These are unused so far but I want to remember them to use them later -/datum/mood_event/cloned_corpse - description = "I recently saw my own corpse...\n" - mood_change = -6 - /datum/mood_event/surgery description = "HE'S CUTTING ME OPEN!!\n" mood_change = -8 diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 189e41c5061..128346d7c37 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -19,6 +19,11 @@ /datum/mood_event/besthug/add_effects(mob/friend) description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!\n" +/datum/mood_event/warmhug + description = "Warm cozy hugs are the best!\n" + mood_change = 1 + timeout = 2 MINUTES + /datum/mood_event/arcade description = "I beat the arcade game!\n" mood_change = 3 @@ -165,11 +170,11 @@ description = "The bottle landing like that was satisfying.\n" mood_change = 2 timeout = 3 MINUTES - + /datum/mood_event/hope_lavaland description = "What a peculiar emblem. It makes me feel hopeful for my future.\n" mood_change = 5 - + /datum/mood_event/nanite_happiness description = "+++++++HAPPINESS ENHANCEMENT+++++++\n" mood_change = 7 diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 0acf4d19ecf..7781b0a3d44 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -368,17 +368,29 @@ /datum/mutation/human/extrastun name = "Two Left Feet" - desc = "A mutation that replaces the right foot with another left foot. It makes standing up after getting knocked down very difficult." + desc = "A mutation that replaces the right foot with another left foot. Symptoms include kissing the floor when taking a step." quality = NEGATIVE text_gain_indication = "Your right foot feels... left." text_lose_indication = "Your right foot feels alright." difficulty = 16 - var/stun_cooldown = 0 -/datum/mutation/human/extrastun/on_life() - if(world.time > stun_cooldown) - if(owner.AmountKnockdown() || owner.AmountStun()) - owner.SetKnockdown(owner.AmountKnockdown()*2) - owner.SetStun(owner.AmountStun()*2) - owner.visible_message("[owner] tries to stand up, but trips!", "You trip over your own feet!") - stun_cooldown = world.time + 300 +/datum/mutation/human/extrastun/on_acquiring() + . = ..() + if(.) + return + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move) + +/datum/mutation/human/extrastun/on_losing() + . = ..() + if(.) + return + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +///Triggers on moved(). Randomly makes the owner trip +/datum/mutation/human/extrastun/proc/on_move() + if(prob(99.5)) //The brawl mutation + return + if(owner.buckled || owner.lying || !((owner.mobility_flags & (MOBILITY_STAND | MOBILITY_MOVE)) == (MOBILITY_STAND | MOBILITY_MOVE)) || owner.throwing || owner.movement_type & (VENTCRAWLING | FLYING | FLOATING)) + return //remove the 'edge' cases + to_chat(owner, "You trip over your own feet.") + owner.Knockdown(30) diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 7dae69c230e..b27b044ad2c 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -1,11 +1,21 @@ /datum/radiation_wave + /// The thing that spawned this radiation wave var/source - var/turf/master_turf //The center of the wave - var/steps=0 //How far we've moved - var/intensity //How strong it was originaly - var/range_modifier //Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc - var/move_dir //The direction of movement - var/list/__dirs //The directions to the side of the wave, stored for easy looping + /// The center of the wave + var/turf/master_turf + /// How far we've moved + var/steps=0 + /// How strong it was originaly + var/intensity + /// How much contaminated material it still has + var/remaining_contam + /// Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc + var/range_modifier + /// The direction of movement + var/move_dir + /// The directions to the side of the wave, stored for easy looping + var/list/__dirs + /// Whether or not this radiation wave can create contaminated objects var/can_contaminate /datum/radiation_wave/New(atom/_source, dir, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE) @@ -20,6 +30,7 @@ __dirs+=turn(dir, -90) intensity = _intensity + remaining_contam = intensity range_modifier = _range_modifier can_contaminate = _can_contaminate @@ -47,9 +58,7 @@ if(strength= RAD_MINIMUM_CONTAMINATION + var/contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT + contamination_strength = max(contamination_strength, RAD_BACKGROUND_RADIATION) + // It'll never reach 100% chance but the further out it gets the more likely it'll contaminate + var/contamination_chance = 100 - (90 / (1 + steps * 0.1)) + for(var/k in atoms) + var/atom/thing = k + if(QDELETED(thing)) continue thing.rad_act(strength) @@ -110,10 +123,18 @@ /obj/item/implant, /obj/singularity )) - if(!can_contaminate || blacklisted[thing.type]) + if(!can_contaminate || !can_contam || blacklisted[thing.type]) continue - if(prob(contamination_chance)) // Only stronk rads get to have little baby rads - if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) - continue - var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT - thing.AddComponent(/datum/component/radioactive, rad_strength, source) + if(thing.rad_flags & RAD_NO_CONTAMINATE || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) + continue + + if(contamination_strength > remaining_contam) + contamination_strength = remaining_contam + if(!prob(contamination_chance)) + continue + if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION) + continue + remaining_contam -= contamination_strength + if(remaining_contam < RAD_BACKGROUND_RADIATION) + can_contaminate = FALSE + thing.AddComponent(/datum/component/radioactive, contamination_strength, source) diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 886cca8e8bb..880b4d709e7 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -270,12 +270,6 @@ description = "With heated debates over the legality of the catperson and their status in the workforce, there's always a place for the blackmarket to slip in for some cash. Whether the results \ are morally sound or not is another issue entirely." -/datum/map_template/ruin/space/cloning_facility - id = "cloning_facility" - suffix = "cloning_facility.dmm" - name = "Ancient Cloning Lab" - description = "An experimental cloning lab snapped off from an ancient ship. The cloner model inside lacks many modern functionalities and security measures." - /datum/map_template/ruin/space/hilbertresearchfacility id = "hilbert_facility" suffix = "hilbertshoteltestingsite.dmm" @@ -301,3 +295,10 @@ description = "Well wish you luck." allow_duplicates = FALSE unpickable = TRUE + +/datum/map_template/ruin/space/hellfactory + id = "hellfactory" + suffix = "hellfactory.dmm" + name = "Heck Brewery" + description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive." + diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index df39eeb7763..047cf571892 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -478,7 +478,7 @@ name = "Tr%nPo2r& Z3TA" description = "A glitch appears on your monitor, flickering in and out of the options laid before you. \ It seems strange and alien, you may need a special technology to access the signal.." - admin_notes = "Has an on-board experimental cloner that creates copies of its user, alien surgery tools, and a void core that provides unlimited power." + admin_notes = "Has alien surgery tools, and a void core that provides unlimited power." credit_cost = 8000 /datum/map_template/shuttle/emergency/zeta/prerequisites_met() diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 51794087288..6bb0bc4b6e9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -98,43 +98,42 @@ icon_state = "asleep" //STASIS -/datum/status_effect/incapacitating/stasis - id = "stasis" - duration = -1 - tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/stasis - var/last_dead_time +/datum/status_effect/grouped/stasis + id = "stasis" + duration = -1 + tick_interval = 10 + alert_type = /obj/screen/alert/status_effect/stasis + var/last_dead_time -/datum/status_effect/incapacitating/stasis/proc/update_time_of_death() - if(last_dead_time) - var/delta = world.time - last_dead_time - var/new_timeofdeath = owner.timeofdeath + delta - owner.timeofdeath = new_timeofdeath - owner.tod = station_time_timestamp(wtime=new_timeofdeath) - last_dead_time = null - if(owner.stat == DEAD) - last_dead_time = world.time +/datum/status_effect/grouped/stasis/proc/update_time_of_death() + if(last_dead_time) + var/delta = world.time - last_dead_time + var/new_timeofdeath = owner.timeofdeath + delta + owner.timeofdeath = new_timeofdeath + owner.tod = station_time_timestamp(wtime=new_timeofdeath) + last_dead_time = null + if(owner.stat == DEAD) + last_dead_time = world.time -/datum/status_effect/incapacitating/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) - . = ..() - update_time_of_death() - owner.reagents?.end_metabolization(owner, FALSE) +/datum/status_effect/grouped/stasis/on_creation(mob/living/new_owner, set_duration, updating_canmove) + . = ..() + if(.) + update_time_of_death() + owner.reagents?.end_metabolization(owner, FALSE) + owner.update_mobility() -/datum/status_effect/incapacitating/stasis/tick() - update_time_of_death() +/datum/status_effect/grouped/stasis/tick() + update_time_of_death() -/datum/status_effect/incapacitating/stasis/on_remove() - update_time_of_death() - return ..() - -/datum/status_effect/incapacitating/stasis/be_replaced() - update_time_of_death() - return ..() +/datum/status_effect/grouped/stasis/on_remove() + owner.update_mobility() + update_time_of_death() + return ..() /obj/screen/alert/status_effect/stasis - name = "Stasis" - desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." - icon_state = "stasis" + name = "Stasis" + desc = "Your biological functions have halted. You could live forever this way, but it's pretty boring." + icon_state = "stasis" //GOLEM GANG diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 112d17c4e72..891102a291d 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -63,6 +63,9 @@ owner = null qdel(src) +/datum/status_effect/proc/before_remove() //! Called before being removed; returning FALSE will cancel removal + return TRUE + /datum/status_effect/proc/refresh() var/original_duration = initial(duration) if(original_duration == -1) @@ -107,12 +110,13 @@ S1 = new effect(arguments) . = S1 -/mob/living/proc/remove_status_effect(effect) //removes all of a given status effect from this mob, returning TRUE if at least one was removed +/mob/living/proc/remove_status_effect(effect, ...) //removes all of a given status effect from this mob, returning TRUE if at least one was removed . = FALSE + var/list/arguments = args.Copy(2) if(status_effects) var/datum/status_effect/S1 = effect for(var/datum/status_effect/S in status_effects) - if(initial(S1.id) == S.id) + if(initial(S1.id) == S.id && S.before_remove(arguments)) qdel(S) . = TRUE @@ -238,3 +242,22 @@ owner.underlays -= status_underlay QDEL_NULL(status_overlay) return ..() + +/// Status effect from multiple sources, when all sources are removed, so is the effect +/datum/status_effect/grouped + status_type = STATUS_EFFECT_MULTIPLE //! Adds itself to sources and destroys itself if one exists already, there are never multiple + var/list/sources = list() + +/datum/status_effect/grouped/on_creation(mob/living/new_owner, source) + var/datum/status_effect/grouped/existing = new_owner.has_status_effect(type) + if(existing) + existing.sources |= source + qdel(src) + return FALSE + else + sources |= source + return ..() + +/datum/status_effect/grouped/before_remove(source) + sources -= source + return !length(sources) diff --git a/code/datums/traits/_quirk.dm b/code/datums/traits/_quirk.dm index 9187d57d856..e27fd4d8009 100644 --- a/code/datums/traits/_quirk.dm +++ b/code/datums/traits/_quirk.dm @@ -56,9 +56,6 @@ /datum/quirk/proc/post_add() //for text, disclaimers etc. given after you spawn in with the trait /datum/quirk/proc/on_transfer() //code called when the trait is transferred to a new mob -/datum/quirk/proc/clone_data() //return additional data that should be remembered by cloning -/datum/quirk/proc/on_clone(data) //create the quirk from clone data - /datum/quirk/process() if(QDELETED(quirk_holder)) quirk_holder = null diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 3498514b44d..3f431aa1b98 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -107,7 +107,7 @@ if("Mime") heirloom_type = /obj/item/reagent_containers/food/snacks/baguette if("Janitor") - heirloom_type = pick(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket) + heirloom_type = pick(/obj/item/mop, /obj/item/clothing/suit/caution, /obj/item/reagent_containers/glass/bucket, /obj/item/paper/fluff/stations/soap) if("Cook") heirloom_type = pick(/obj/item/reagent_containers/food/condiment/saltshaker, /obj/item/kitchen/rollingpin, /obj/item/clothing/head/chefhat) if("Botanist") @@ -203,12 +203,6 @@ SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) -/datum/quirk/family_heirloom/clone_data() - return heirloom - -/datum/quirk/family_heirloom/on_clone(data) - heirloom = data - /datum/quirk/frail name = "Frail" desc = "Your bones might as well be made of glass! Your limbs can take less damage before they become disabled." diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 853587888ff..c69d13d1792 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -128,7 +128,7 @@ /datum/quirk/phobia/post_add() var/mob/living/carbon/human/H = quirk_holder - H.gain_trauma(new /datum/brain_trauma/mild/phobia(H.client.prefs.phobia), TRAUMA_RESILIENCE_ABSOLUTE) + H.gain_trauma(new /datum/brain_trauma/mild/phobia(H.client?.prefs.phobia), TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/phobia/remove() var/mob/living/carbon/human/H = quirk_holder diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index d34788fe68b..bbc117ec3f6 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -701,10 +701,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Genetics Lab" icon_state = "genetics" -/area/medical/genetics/cloning - name = "Cloning Lab" - icon_state = "cloning" - /area/medical/sleeper name = "Medbay Treatment Center" icon_state = "exam_room" diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index da0ee2cfadc..9f171b15a3a 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -419,3 +419,13 @@ /area/ruin/space/has_grav/powered/ancient_shuttle name = "Ancient Shuttle" icon_state = "yellow" + +//HELL'S FACTORY OPERATING FACILITY +/area/ruin/space/has_grav/hellfactory + name = "Hell Factory" + icon_state = "yellow" + +/area/ruin/space/has_grav/hellfactoryoffice + name = "Hell Factory Office" + icon_state = "red" + noteleport = TRUE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bf1c631c30c..1913399760f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -161,7 +161,7 @@ var/temp_list = list() for(var/i in custom_materials) - temp_list[getmaterialref(i)] = custom_materials[i] //Get the proper instanced version + temp_list[SSmaterials.GetMaterialRef(i)] = custom_materials[i] //Get the proper instanced version custom_materials = null //Null the list to prepare for applying the materials properly set_custom_materials(temp_list) @@ -476,9 +476,11 @@ . += desc if(custom_materials) + var/list/materials_list = list() for(var/i in custom_materials) var/datum/material/M = i - . += "It is made out of [M.name]." + materials_list += "[M.name]" + . += "It is made out of [english_list(materials_list)]." if(reagents) if(reagents.flags & TRANSPARENT) . += "It contains:" @@ -1204,7 +1206,7 @@ if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways for(var/i in custom_materials) - var/datum/material/custom_material = getmaterialref(i) + var/datum/material/custom_material = SSmaterials.GetMaterialRef(i) custom_material.on_removed(src, material_flags) //Remove the current materials if(!length(materials)) @@ -1213,7 +1215,7 @@ custom_materials = list() //Reset the list for(var/x in materials) - var/datum/material/custom_material = getmaterialref(x) + var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) if(!(material_flags & MATERIAL_NO_EFFECTS)) custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index e2caa140996..4dbafaa202c 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -186,7 +186,10 @@ if(HAS_TRAIT(src, TRAIT_XENO_HOST)) holder.icon_state = "hudxeno" else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - holder.icon_state = "huddead" + if(key || get_ghost(FALSE, TRUE)) + holder.icon_state = "huddefib" + else + holder.icon_state = "huddead" else switch(virus_threat) if(DISEASE_SEVERITY_BIOHAZARD) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 4536fa5182a..8fab8717f08 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -16,7 +16,7 @@ if(!(antag_flag_override in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag_override, ROLE_SYNDICATE))) candidates.Remove(P) continue - else + else if(!(antag_flag in P.client.prefs.be_special) || is_banned_from(P.ckey, list(antag_flag, ROLE_SYNDICATE))) candidates.Remove(P) continue @@ -133,21 +133,24 @@ else if (check_heads_victory()) finished = STATION_VICTORY SSshuttle.clearHostileEnvironment(src) - priority_announce("It appears the mutiny has been quelled. Please return yourself and your colleagues to work. \ - We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") revolution.save_members() for(var/datum/mind/M in revolution.members) // Remove antag datums and prevents podcloned or exiled headrevs restarting rebellions. if(M.has_antag_datum(/datum/antagonist/rev/head)) var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head) R.remove_revolutionary(FALSE, "gamemode") - var/mob/living/carbon/C = M.current - if(C.stat == DEAD) - C.makeUncloneable() + if(M.current) + var/mob/living/carbon/C = M.current + if(istype(C) && C.stat == DEAD) + C.makeUncloneable() if(M.has_antag_datum(/datum/antagonist/rev)) var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) R.remove_revolutionary(FALSE, "gamemode") + priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ + We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") return RULESET_STOP_PROCESSING + + /// Checks for revhead loss conditions and other antag datums. /datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(var/datum/mind/M) var/turf/T = get_turf(M.current) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 1a949438dc2..a8ecc841597 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -402,19 +402,20 @@ else if (check_heads_victory()) finished = STATION_VICTORY SSshuttle.clearHostileEnvironment(src) - priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ - We have remotely blacklisted the head revolutionaries from your cloning software to prevent accidental cloning.", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") revolution.save_members() for(var/datum/mind/M in revolution.members) // Remove antag datums and prevents podcloned or exiled headrevs restarting rebellions. if(M.has_antag_datum(/datum/antagonist/rev/head)) var/datum/antagonist/rev/head/R = M.has_antag_datum(/datum/antagonist/rev/head) R.remove_revolutionary(FALSE, "gamemode") - var/mob/living/carbon/C = M.current - if(C.stat == DEAD) - C.makeUncloneable() + if(M.current) + var/mob/living/carbon/C = M.current + if(istype(C) && C.stat == DEAD) + C.makeUncloneable() if(M.has_antag_datum(/datum/antagonist/rev)) var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) R.remove_revolutionary(FALSE, "gamemode") + priority_announce("It appears the mutiny has been quelled. Please return yourself and your incapacitated colleagues to work. \ + We have remotely blacklisted the head revolutionaries in your medical records to prevent accidental revival.", null, 'sound/ai/attention.ogg', null, "Central Command Loyalty Monitoring Division") return RULESET_STOP_PROCESSING /// Checks for revhead loss conditions and other antag datums. diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 56d031f30a0..334e0447855 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -133,7 +133,6 @@ name = "Syndicate Leader - Basic" id = /obj/item/card/id/syndicate/nuke_leader gloves = /obj/item/clothing/gloves/krav_maga/combatglovesplus - r_hand = /obj/item/nuclear_challenge command_radio = TRUE /datum/outfit/syndicate/no_crystals diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 1972915a318..625708dd091 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -12,7 +12,7 @@ density = FALSE state_open = TRUE circuit = /obj/item/circuitboard/machine/sleeper - ui_x = 250 + ui_x = 310 ui_y = 465 var/efficiency = 1 @@ -279,3 +279,45 @@ /obj/machinery/sleeper/old icon_state = "oldpod" + +/obj/machinery/sleeper/party + name = "party pod" + desc = "'Sleeper' units were once known for their healing properties, until a lengthy investigation revealed they were also dosing patients with deadly lead acetate. This appears to be one of those old 'sleeper' units repurposed as a 'Party Pod'. It’s probably not a good idea to use it." + icon_state = "partypod" + idle_power_usage = 3000 + circuit = /obj/item/circuitboard/machine/sleeper/party + var/leddit = FALSE //Get it like reddit and lead alright fine + ui_x = 310 + ui_y = 400 + + controls_inside = TRUE + possible_chems = list( + list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/laughter), + list(/datum/reagent/spraytan,/datum/reagent/barbers_aid), + list(/datum/reagent/colorful_reagent,/datum/reagent/hair_dye), + list(/datum/reagent/drug/space_drugs,/datum/reagent/baldium) + )//Exclusively uses non-lethal, "fun" chems. At an obvious downside. + var/spray_chems = list( + /datum/reagent/spraytan, /datum/reagent/hair_dye, /datum/reagent/baldium, /datum/reagent/barbers_aid + )//Chemicals that need to have a touch or vapor reaction to be applied, not the standard chamber reaction. + enter_message = "You're surrounded by some funky music inside the chamber. You zone out as you feel waves of krunk vibe within you." + +/obj/machinery/sleeper/party/inject_chem(chem, mob/user) + if(leddit) + occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, 4) //You're injecting chemicals into yourself from a recalled, decrepit medical machine. What did you expect? + else if (prob(20)) + occupant.reagents.add_reagent(/datum/reagent/toxin/leadacetate, rand(1,3)) + if(chem in spray_chems) + var/datum/reagents/holder = new() + holder.add_reagent(chem_buttons[chem], 10) //I hope this is the correct way to do this. + holder.reaction(occupant, VAPOR, 0) + holder.trans_to(occupant, 10) + playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6) + if(user) + log_combat(user, occupant, "sprayed [chem] into", addition = "via [src]") + return TRUE + ..() + +/obj/machinery/sleeper/party/emag_act(mob/user) + ..() + leddit = TRUE diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 97cfa97715c..8179e7f227c 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -48,23 +48,24 @@ ) /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, - /datum/material/glass, - /datum/material/gold, - /datum/material/silver, - /datum/material/diamond, - /datum/material/uranium, - /datum/material/plasma, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/runite, - /datum/material/plastic, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/wood - ), 0, TRUE, null, null, CALLBACK(src, .proc/AfterMaterialInsert)) + var/static/list/allowed_types = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/gold, + /datum/material/silver, + /datum/material/diamond, + /datum/material/uranium, + /datum/material/plasma, + /datum/material/bluespace, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/runite, + /datum/material/plastic, + /datum/material/adamantine, + /datum/material/mythril, + /datum/material/wood, + ) + AddComponent(/datum/component/material_container, allowed_types, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) @@ -142,7 +143,7 @@ /obj/machinery/autolathe/proc/AfterMaterialInsert(item_inserted, id_inserted, amount_inserted) if(istype(item_inserted, /obj/item/stack/ore/bluespace_crystal)) use_power(MINERAL_MATERIAL_AMOUNT / 10) - else if(custom_materials && custom_materials.len && custom_materials[getmaterialref(/datum/material/glass)]) + else if(custom_materials && custom_materials.len && custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]) flick("autolathe_r",src)//plays glass insertion animation by default otherwise else flick("autolathe_o",src)//plays metal insertion animation diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm deleted file mode 100644 index 97bb1eafdb3..00000000000 --- a/code/game/machinery/cloning.dm +++ /dev/null @@ -1,572 +0,0 @@ -//Cloning revival method. -//The pod handles the actual cloning while the computer manages the clone profiles - -//Potential replacement for genetics revives or something I dunno (?) - -#define CLONE_INITIAL_DAMAGE 150 //Clones in clonepods start with 150 cloneloss damage and 150 brainloss damage, thats just logical -#define MINIMUM_HEAL_LEVEL 40 - -#define SPEAK(message) radio.talk_into(src, message, radio_channel) - -/obj/machinery/clonepod - name = "cloning pod" - desc = "An electronically-lockable pod for growing organic tissue." - density = TRUE - icon = 'icons/obj/machines/cloning.dmi' - icon_state = "pod_0" - req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING. - verb_say = "states" - circuit = /obj/item/circuitboard/machine/clonepod - - var/heal_level //The clone is released once its health reaches this level. - var/obj/machinery/computer/cloning/connected //So we remember the connected clone machine. - var/mess = FALSE //Need to clean out it if it's full of exploded clone. - var/attempting = FALSE //One clone attempt at a time thanks - var/speed_coeff - var/efficiency - - var/datum/mind/clonemind - var/grab_ghost_when = CLONER_MATURE_CLONE - - var/internal_radio = TRUE - var/obj/item/radio/radio - var/radio_key = /obj/item/encryptionkey/headset_med - var/radio_channel = RADIO_CHANNEL_MEDICAL - - var/obj/effect/countdown/clonepod/countdown - - var/list/unattached_flesh - var/flesh_number = 0 - var/datum/bank_account/current_insurance - fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. - payment_department = ACCOUNT_MED -/obj/machinery/clonepod/Initialize() - . = ..() - - countdown = new(src) - - if(internal_radio) - radio = new(src) - radio.keyslot = new radio_key - radio.subspace_transmission = TRUE - radio.canhear_range = 0 - radio.recalculateChannels() - -/obj/machinery/clonepod/Destroy() - var/mob/living/mob_occupant = occupant - go_out() - if(mob_occupant) - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to Destroy().") - QDEL_NULL(radio) - QDEL_NULL(countdown) - if(connected) - connected.DetachCloner(src) - QDEL_LIST(unattached_flesh) - . = ..() - -/obj/machinery/clonepod/RefreshParts() - speed_coeff = 0 - efficiency = 0 - for(var/obj/item/stock_parts/scanning_module/S in component_parts) - efficiency += S.rating - for(var/obj/item/stock_parts/manipulator/P in component_parts) - speed_coeff += P.rating - heal_level = (efficiency * 15) + 10 - if(heal_level < MINIMUM_HEAL_LEVEL) - heal_level = MINIMUM_HEAL_LEVEL - if(heal_level > 100) - heal_level = 100 - -/obj/machinery/clonepod/attack_hand(mob/user) - . = ..() - if(.) - return - user.examinate(src) - -/obj/machinery/clonepod/attack_ai(mob/user) - return attack_hand(user) - -/obj/machinery/clonepod/examine(mob/user) - . = ..() - . += "The linking device can be scanned with a multitool." - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%.
" - if(efficiency > 5) - . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." - -//The return of data disks?? Just for transferring between genetics machine/cloning machine. -//TO-DO: Make the genetics machine accept them. -/obj/item/disk/data - name = "cloning data disk" - icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. - var/list/fields = list() - var/list/mutations = list() - var/max_mutations = 6 - var/read_only = FALSE //Well,it's still a floppy disk - -//Disk stuff. -/obj/item/disk/data/Initialize() - . = ..() - icon_state = "datadisk[rand(0,6)]" - add_overlay("datadisk_gene") - -/obj/item/disk/data/attack_self(mob/user) - read_only = !read_only - to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") - -/obj/item/disk/data/examine(mob/user) - . = ..() - . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." - - -//Clonepod - -/obj/machinery/clonepod/examine(mob/user) - . = ..() - var/mob/living/mob_occupant = occupant - if(mess) - . += "It's filled with blood and viscera. You swear you can see it moving..." - if(is_operational() && istype(mob_occupant)) - if(mob_occupant.stat != DEAD) - . += "Current clone cycle is [round(get_completion())]% complete." - -/obj/machinery/clonepod/return_air() - // We want to simulate the clone not being in contact with - // the atmosphere, so we'll put them in a constant pressure - // nitrogen. They don't need to breathe while cloning anyway. - var/static/datum/gas_mixture/immutable/cloner/GM //global so that there's only one instance made for all cloning pods - if(!GM) - GM = new - return GM - -/obj/machinery/clonepod/proc/get_completion() - . = FALSE - var/mob/living/mob_occupant = occupant - if(mob_occupant) - . = (100 * ((mob_occupant.health + 100) / (heal_level + 100))) - -/obj/machinery/clonepod/attack_ai(mob/user) - return examine(user) - -//Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance, list/traumas, empty) - if(panel_open) - return NONE - if(mess || attempting) - return NONE - - if(!empty) //Doesn't matter if we're just making a copy - clonemind = locate(mindref) in SSticker.minds - if(!istype(clonemind)) //not a mind - return NONE - if(clonemind.last_death != last_death) //The soul has advanced, the record has not. - return NONE - if(!QDELETED(clonemind.current)) - if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body - return NONE - if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. - return NONE - if(!clonemind.active) - // get_ghost() will fail if they're unable to reenter their body - var/mob/dead/observer/G = clonemind.get_ghost() - if(!G) - return NONE - if(G.suiciding) // The ghost came from a body that is suiciding. - return NONE - if(clonemind.damnation_type) //Can't clone the damned. - INVOKE_ASYNC(src, .proc/horrifyingsound) - mess = TRUE - icon_state = "pod_g" - update_icon() - return NONE - current_insurance = insurance - attempting = TRUE //One at a time!! - countdown.start() - - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - - if(!clonename) //to prevent null names - clonename = "clone ([rand(1,999)])" - H.real_name = clonename - - H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features) - - if(!HAS_TRAIT(H, TRAIT_RADIMMUNE))//dont apply mutations if the species is Mutation proof. - if(efficiency > 2) - var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) - H.dna.remove_mutation_group(unclean_mutations) - if(efficiency > 5 && prob(20)) - H.easy_randmut(POSITIVE) - if(efficiency < 3 && prob(50)) - var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) - if(ismob(M)) - H = M - - H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. - occupant = H - - icon_state = "pod_1" - //Get the clone body ready - maim_clone(H) - ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) - H.Unconscious(80) - - if(!empty) - clonemind.transfer_to(H) - - if(grab_ghost_when == CLONER_FRESH_CLONE) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") - - if(grab_ghost_when == CLONER_MATURE_CLONE) - H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost - to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") - - if(H) - H.faction |= factions - - for(var/V in quirks) - var/datum/quirk/Q = new V(H) - Q.on_clone(quirks[V]) - - for(var/t in traumas) - var/datum/brain_trauma/BT = t - var/datum/brain_trauma/cloned_trauma = BT.on_clone() - if(cloned_trauma) - H.gain_trauma(cloned_trauma, BT.resilience) - - H.set_cloned_appearance() - - H.set_suicide(FALSE) - attempting = FALSE - return CLONING_SUCCESS - -//Grow clones to maturity then kick them out. FREELOADERS -/obj/machinery/clonepod/process() - var/mob/living/mob_occupant = occupant - - if(!is_operational()) //Autoeject if power is lost - if(mob_occupant) - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to power loss.") - - connected_message("Clone Ejected: Loss of power.") - - else if(mob_occupant && (mob_occupant.loc == src)) - if(SSeconomy.full_ancap) - if(!current_insurance) - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to invalid bank account.") - connected_message("Clone Ejected: No bank account.") - if(internal_radio) - SPEAK("The cloning of [mob_occupant.real_name] has been terminated due to no bank account to draw payment from.") - else if(!current_insurance.adjust_money(-fair_market_price)) - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to insufficient funds.") - connected_message("Clone Ejected: Out of Money.") - if(internal_radio) - SPEAK("The cloning of [mob_occupant.real_name] has been ended prematurely due to being unable to pay.") - else - var/datum/bank_account/D = SSeconomy.get_dep_account(payment_department) - if(D) - D.adjust_money(fair_market_price) - if(mob_occupant && (mob_occupant.stat == DEAD) || (mob_occupant.suiciding) || mob_occupant.hellbound) //Autoeject corpses and suiciding dudes. - connected_message("Clone Rejected: Deceased.") - if(internal_radio) - SPEAK("The cloning of [mob_occupant.real_name] has been \ - aborted due to unrecoverable tissue failure.") - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] after suiciding.") - - else if(mob_occupant && mob_occupant.cloneloss > (100 - heal_level)) - mob_occupant.Unconscious(80) - var/dmg_mult = CONFIG_GET(number/damage_multiplier) - //Slowly get that clone healed and finished. - mob_occupant.adjustCloneLoss(-((speed_coeff / 2) * dmg_mult)) - var/progress = CLONE_INITIAL_DAMAGE - mob_occupant.getCloneLoss() - // To avoid the default cloner making incomplete clones - progress += (100 - MINIMUM_HEAL_LEVEL) - var/milestone = CLONE_INITIAL_DAMAGE / flesh_number - var/installed = flesh_number - unattached_flesh.len - - if((progress / milestone) >= installed) - // attach some flesh - var/obj/item/I = pick_n_take(unattached_flesh) - if(isorgan(I)) - var/obj/item/organ/O = I - O.organ_flags &= ~ORGAN_FROZEN - O.Insert(mob_occupant) - else if(isbodypart(I)) - var/obj/item/bodypart/BP = I - BP.attach_limb(mob_occupant) - - use_power(7500) //This might need tweaking. - - else if(mob_occupant && (mob_occupant.cloneloss <= (100 - heal_level))) - connected_message("Cloning Process Complete.") - if(internal_radio) - SPEAK("The cloning cycle of [mob_occupant.real_name] is complete.") - - // If the cloner is upgraded to debugging high levels, sometimes - // organs and limbs can be missing. - for(var/i in unattached_flesh) - if(isorgan(i)) - var/obj/item/organ/O = i - O.organ_flags &= ~ORGAN_FROZEN - O.Insert(mob_occupant) - else if(isbodypart(i)) - var/obj/item/bodypart/BP = i - BP.attach_limb(mob_occupant) - - go_out() - log_cloning("[key_name(mob_occupant)] completed cloning cycle in [src] at [AREACOORD(src)].") - - else if (!mob_occupant || mob_occupant.loc != src) - occupant = null - if (!mess && !panel_open) - icon_state = "pod_0" - use_power(200) - -//Let's unlock this early I guess. Might be too early, needs tweaking. -/obj/machinery/clonepod/attackby(obj/item/W, mob/user, params) - if(!(occupant || mess)) - if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]",W)) - return - - if(default_deconstruction_crowbar(W)) - return - - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/computer/cloning)) - if(get_area(P.buffer) != get_area(src)) - to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null - return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/computer/cloning/comp = P.buffer - if(connected) - connected.DetachCloner(src) - comp.AttachCloner(src) - else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") - return - - var/mob/living/mob_occupant = occupant - if(W.GetID()) - if(!check_access(W)) - to_chat(user, "Access Denied.") - return - if(!(mob_occupant || mess)) - to_chat(user, "Error: Pod has no occupant.") - return - else - add_fingerprint(user) - connected_message("Emergency Ejection") - SPEAK("An emergency ejection of [clonemind.name] has occurred. Survival not guaranteed.") - to_chat(user, "You force an emergency ejection. ") - go_out() - log_cloning("[key_name(user)] manually ejected [key_name(mob_occupant)] from [src] at [AREACOORD(src)].") - log_combat(user, mob_occupant, "ejected", W, "from [src]") - else - return ..() - -/obj/machinery/clonepod/emag_act(mob/user) - if(!occupant) - return - to_chat(user, "You corrupt the genetic compiler.") - malfunction() - add_fingerprint(user) - log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") - if(user) - log_combat(user, src, "emagged", null, occupant ? "[occupant] inside, killing them via malfunction." : null) - -//Put messages in the connected computer's temp var for display. -/obj/machinery/clonepod/proc/connected_message(message) - if ((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) - return FALSE - if (!message) - return FALSE - - connected.temp = message - connected.updateUsrDialog() - return TRUE - -/obj/machinery/clonepod/proc/go_out() - countdown.stop() - var/mob/living/mob_occupant = occupant - var/turf/T = get_turf(src) - - if(mess) //Clean that mess and dump those gibs! - for(var/obj/fl in unattached_flesh) - fl.forceMove(T) - if(istype(fl, /obj/item/organ)) - var/obj/item/organ/O = fl - O.organ_flags &= ~ORGAN_FROZEN - unattached_flesh.Cut() - mess = FALSE - new /obj/effect/gibspawner/generic(get_turf(src), mob_occupant) - audible_message("You hear a splat.") - icon_state = "pod_0" - return - - if(!mob_occupant) - return - current_insurance = null - REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) - REMOVE_TRAIT(mob_occupant, TRAIT_STABLELIVER, CLONING_POD_TRAIT) - REMOVE_TRAIT(mob_occupant, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) - REMOVE_TRAIT(mob_occupant, TRAIT_MUTE, CLONING_POD_TRAIT) - REMOVE_TRAIT(mob_occupant, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) - REMOVE_TRAIT(mob_occupant, TRAIT_NOBREATH, CLONING_POD_TRAIT) - - if(grab_ghost_when == CLONER_MATURE_CLONE) - mob_occupant.grab_ghost() - to_chat(occupant, "There is a bright flash!
You feel like a new being.
") - mob_occupant.flash_act() - - occupant.forceMove(T) - icon_state = "pod_0" - mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. - for(var/fl in unattached_flesh) - qdel(fl) - unattached_flesh.Cut() - - occupant = null - clonemind = null - -/obj/machinery/clonepod/proc/malfunction() - var/mob/living/mob_occupant = occupant - if(mob_occupant) - connected_message("Critical Error!") - SPEAK("Critical error! Please contact a Thinktronic Systems \ - technician, as your warranty may be affected.") - mess = TRUE - maim_clone(mob_occupant) //Remove every bit that's grown back so far to drop later, also destroys bits that haven't grown yet - icon_state = "pod_g" - if(clonemind && mob_occupant.mind != clonemind) - clonemind.transfer_to(mob_occupant) - mob_occupant.grab_ghost() // We really just want to make you suffer. - flash_color(mob_occupant, flash_color="#960000", flash_time=100) - to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.
") - playsound(src, 'sound/machines/warning-buzzer.ogg', 50) - SEND_SOUND(mob_occupant, sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)) - log_cloning("[key_name(mob_occupant)] destroyed within [src] at [AREACOORD(src)] due to malfunction.") - QDEL_IN(mob_occupant, 40) - -/obj/machinery/clonepod/relaymove(mob/user) - container_resist(user) - -/obj/machinery/clonepod/container_resist(mob/living/user) - if(user.stat == CONSCIOUS) - go_out() - -/obj/machinery/clonepod/emp_act(severity) - . = ..() - if (!(. & EMP_PROTECT_SELF)) - var/mob/living/mob_occupant = occupant - if(mob_occupant && prob(100/(severity*efficiency))) - connected_message(Gibberish("EMP-caused Accidental Ejection")) - SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely.")) - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to EMP pulse.") - -/obj/machinery/clonepod/ex_act(severity, target) - ..() - if(!QDELETED(src) && occupant) - var/mob/living/mob_occupant = occupant - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to explosion.") - -/obj/machinery/clonepod/handle_atom_del(atom/A) - if(A == occupant) - occupant = null - countdown.stop() - -/obj/machinery/clonepod/proc/horrifyingsound() - for(var/i in 1 to 5) - playsound(src,pick('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg'), 100, (rand(95,105) * 0.01)) - sleep(1) - sleep(10) - playsound(src,'sound/hallucinations/wail.ogg', 100, TRUE) - -/obj/machinery/clonepod/deconstruct(disassembled = TRUE) - if(occupant) - var/mob/living/mob_occupant = occupant - go_out() - log_cloning("[key_name(mob_occupant)] ejected from [src] at [AREACOORD(src)] due to deconstruction.") - ..() - -/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H) - if(!unattached_flesh) - unattached_flesh = list() - else - for(var/fl in unattached_flesh) - qdel(fl) - unattached_flesh.Cut() - - H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health - // In addition to being cellularly damaged, they also have no limbs or internal organs. - // Applying brainloss is done when the clone leaves the pod, so application of traumas can happen - // based on the level of damage sustained. - - if(!HAS_TRAIT(H, TRAIT_NODISMEMBER)) - var/static/list/zones = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) - for(var/zone in zones) - var/obj/item/bodypart/BP = H.get_bodypart(zone) - if(BP) - BP.drop_limb() - BP.forceMove(src) - unattached_flesh += BP - - for(var/o in H.internal_organs) - var/obj/item/organ/organ = o - if(!istype(organ) || (organ.organ_flags & ORGAN_VITAL)) - continue - organ.organ_flags |= ORGAN_FROZEN - organ.Remove(H, special=TRUE) - organ.forceMove(src) - unattached_flesh += organ - - flesh_number = unattached_flesh.len - -/* - * Manual -- A big ol' manual. - */ - -/obj/item/paper/guides/jobs/medical/cloning - name = "paper - 'H-87 Cloning Apparatus Manual" - info = {"

Getting Started

- Congratulations, your station has purchased the H-87 industrial cloning device!
- Using the H-87 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the scan option to create a new profile!
- That's all there is to it!
- Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
-

Clone profiles may be viewed through the profiles menu. Scanning implants a complementary HEALTH MONITOR IMPLANT into the subject, which may be viewed from each profile. - Profile Deletion has been restricted to \[Station Head\] level access.

-

Cloning from a profile

- Cloning is as simple as pressing the CLONE option at the bottom of the desired profile.
- Per your company's EMPLOYEE PRIVACY RIGHTS agreement, the H-87 has been blocked from cloning crewmembers while they are still alive.
-
-

The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times (With SPEEDCLONE technology) are roughly 90 seconds. - The cloning pod may be unlocked early with any \[Medical Researcher\] ID after initial maturation is complete.


- Please note that resulting clones may have a small DEVELOPMENTAL DEFECT as a result of genetic drift.
-

Profile Management

-

The H-87 (as well as your station's standard genetics machine) can accept STANDARD DATA DISKETTES. - These diskettes are used to transfer genetic information between machines and profiles. - A load/save dialog will become available in each profile if a disk is inserted.


- A good diskette is a great way to counter aforementioned genetic drift!
-
- This technology produced under license from Thinktronic Systems, LTD."} - -#undef CLONE_INITIAL_DAMAGE -#undef SPEAK -#undef MINIMUM_HEAL_LEVEL diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index a2f41700be6..846a1deaa4c 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -46,7 +46,10 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( /obj/item/clothing/shoes/wheelys = 2, /obj/item/clothing/shoes/kindleKicks = 2, /obj/item/toy/plush/goatplushie/angry/realgoat = 2, - /obj/item/storage/belt/military/snack = 2)) + /obj/item/storage/belt/military/snack = 2, + /obj/item/toy/brokenradio = 2, + /obj/item/toy/braintoy = 2, + /obj/item/clothing/glasses/trickblindfold = 2)) /obj/machinery/computer/arcade name = "random arcade" diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm deleted file mode 100644 index a19bc6d3d23..00000000000 --- a/code/game/machinery/computer/cloning.dm +++ /dev/null @@ -1,627 +0,0 @@ -#define AUTOCLONING_MINIMAL_LEVEL 3 - -/obj/machinery/computer/cloning - name = "cloning console" - desc = "Used to clone people and manage DNA." - icon_screen = "dna" - icon_keyboard = "med_key" - circuit = /obj/item/circuitboard/computer/cloning - req_access = list(ACCESS_GENETICS) //for modifying records - var/obj/machinery/dna_scannernew/scanner //Linked scanner. For scanning. - var/list/pods //Linked cloning pods - var/temp = "Inactive" - var/scantemp_ckey - var/scantemp = "Ready to Scan" - var/menu = 1 //Which menu screen to display - var/list/records = list() - var/datum/data/record/active_record - var/obj/item/disk/data/diskette //Incompatible format to genetics machine - //select which parts of the diskette to load - var/include_se = FALSE //mutations - var/include_ui = FALSE //appearance - var/include_ue = FALSE //blood type, UE, and name - - var/loading = FALSE // Nice loading text - var/autoprocess = FALSE - - light_color = LIGHT_COLOR_BLUE - -/obj/machinery/computer/cloning/Initialize() - . = ..() - updatemodules(TRUE) - -/obj/machinery/computer/cloning/Destroy() - if(pods) - for(var/P in pods) - DetachCloner(P) - pods = null - return ..() - -/obj/machinery/computer/cloning/proc/GetAvailablePod(mind = null) - if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/pod = P - if(pod.occupant && mind && pod.clonemind == mind) - return null - if(pod.is_operational() && !(pod.occupant || pod.mess)) - return pod - -/obj/machinery/computer/cloning/proc/HasEfficientPod() - if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/pod = P - if(pod.is_operational() && pod.efficiency > 5) - return TRUE - -/obj/machinery/computer/cloning/proc/GetAvailableEfficientPod(mind = null) - if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/pod = P - if(pod.occupant && pod.clonemind == mind) - return pod - else if(!. && pod.is_operational() && !(pod.occupant || pod.mess) && pod.efficiency > 5) - . = pod - -/proc/grow_clone_from_record(obj/machinery/clonepod/pod, datum/data/record/R, empty) - return pod.growclone(R.fields["name"], R.fields["UI"], R.fields["SE"], R.fields["mindref"], R.fields["last_death"], R.fields["blood_type"], R.fields["mrace"], R.fields["features"], R.fields["factions"], R.fields["quirks"], R.fields["bank_account"], R.fields["traumas"], empty) - -/obj/machinery/computer/cloning/process() - if(!(scanner && LAZYLEN(pods) && autoprocess)) - return - - if(scanner.occupant && scanner.scan_level > 2) - scan_occupant(scanner.occupant) - - for(var/datum/data/record/R in records) - var/obj/machinery/clonepod/pod = GetAvailableEfficientPod(R.fields["mindref"]) - - if(!pod) - return - - if(pod.occupant) - break - - var/result = grow_clone_from_record(pod, R) - if(result & CLONING_SUCCESS) - temp = "[R.fields["name"]] => Cloning cycle in progress..." - log_cloning("Cloning of [key_name(R.fields["mindref"])] automatically started via autoprocess - [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") - if(result & CLONING_DELETE_RECORD) - records -= R - - -/obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner) - scanner = findscanner() - if(findfirstcloner && !LAZYLEN(pods)) - findcloner() - if(!autoprocess) - STOP_PROCESSING(SSmachines, src) - else - START_PROCESSING(SSmachines, src) - -/obj/machinery/computer/cloning/proc/findscanner() - var/obj/machinery/dna_scannernew/scannerf = null - - // Loop through every direction - for(var/direction in GLOB.cardinals) - - // Try to find a scanner in that direction - scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) - - // If found and operational, return the scanner - if (!isnull(scannerf) && scannerf.is_operational()) - return scannerf - - // If no scanner was found, it will return null - return null - -/obj/machinery/computer/cloning/proc/findcloner() - var/obj/machinery/clonepod/podf = null - - for(var/direction in GLOB.cardinals) - - podf = locate(/obj/machinery/clonepod, get_step(src, direction)) - if (!isnull(podf) && podf.is_operational()) - AttachCloner(podf) - -/obj/machinery/computer/cloning/proc/AttachCloner(obj/machinery/clonepod/pod) - if(!pod.connected) - pod.connected = src - LAZYADD(pods, pod) - -/obj/machinery/computer/cloning/proc/DetachCloner(obj/machinery/clonepod/pod) - pod.connected = null - LAZYREMOVE(pods, pod) - -/obj/machinery/computer/cloning/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/disk/data)) //INSERT SOME DISKETTES - if (!diskette) - if (!user.transferItemToLoc(W,src)) - return - diskette = W - to_chat(user, "You insert [W].") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - updateUsrDialog() - else if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/clonepod)) - if(get_area(P.buffer) != get_area(src)) - to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null - return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/clonepod/pod = P.buffer - if(pod.connected) - pod.connected.DetachCloner(pod) - AttachCloner(pod) - else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") - return - else - return ..() - -/obj/machinery/computer/cloning/ui_interact(mob/user) - . = ..() - - updatemodules(TRUE) - - var/dat = "" - dat += "Refresh" - - if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) - if(!autoprocess) - dat += "Autoprocess" - else - dat += "Stop autoprocess" - else - dat += "Autoprocess" - dat += "

Cloning Pod Status

" - dat += "
[temp] 
" - switch(menu) - if(1) - // Modules - if (isnull(scanner) || !LAZYLEN(pods)) - dat += "

Modules

" - //dat += "Reload Modules" - if (isnull(scanner)) - dat += "ERROR: No Scanner detected!
" - if (!LAZYLEN(pods)) - dat += "ERROR: No Pod detected
" - - // Scanner - if (!isnull(scanner)) - var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) - - dat += "

Scanner Functions

" - - dat += "
" - if(!scanner_occupant) - dat += "Scanner Unoccupied" - else if(loading) - dat += "[scanner_occupant] => Scanning..." - else - if(scanner_occupant.ckey != scantemp_ckey) - scantemp = "Ready to Scan" - scantemp_ckey = scanner_occupant.ckey - dat += "[scanner_occupant] => [scantemp]" - dat += "
" - - if(scanner_occupant) - dat += "Start Scan" - dat += "Body-Only Scan" - dat += "
[scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" - else - dat += "Start Scan" - - // Database - dat += "

Database Functions

" - if (records.len && records.len > 0) - dat += "View Records ([records.len])
" - else - dat += "View Records (0)
" - if (diskette) - dat += "Eject Disk
" - - - - if(2) - dat += "

Current records

" - dat += "<< Back

" - for(var/datum/data/record/R in records) - dat += "

[R.fields["name"]]

Scan ID [R.fields["id"]] View Record" - if(3) - dat += "

Selected Record

" - dat += "<< Back
" - - if (!active_record) - dat += "Record not found." - else - var/body_only = active_record.fields["body_only"] - dat += "

[active_record.fields["name"]][body_only ? " - BODY-ONLY" : ""]

" - dat += "Scan ID [active_record.fields["id"]] \ - [!body_only ? "Clone" : "" ]\ - Empty Clone
" - - var/obj/item/implant/health/H = locate(active_record.fields["imp"]) - - if ((H) && (istype(H))) - dat += "Health Implant Data:
[H.sensehealth()]

" - else - dat += "Unable to locate Health Implant.

" - - dat += "Unique Identifier:
[active_record.fields["UI"]]
" - dat += "Structural Enzymes:
" - for(var/key in active_record.fields["SE"]) - if(key != RACEMUT) - var/val = active_record.fields["SE"][key] - var/alias = GLOB.all_mutations[key].alias - dat +="[alias]: [val]
" - - dat += "

" - - if(diskette && diskette.fields) - dat += "
" - dat += "

Inserted Disk

" - dat += "Contents: " - var/list/L = list() - if(diskette.fields["UI"]) - L += "Unique Identifier" - if(diskette.fields["UE"] && diskette.fields["name"] && diskette.fields["blood_type"]) - L += "Unique Enzymes" - if(diskette.fields["SE"]) - L += "Structural Enzymes" - dat += english_list(L, "Empty", " + ", " + ") - var/can_load = FALSE - var/obj/item/card/id/C = user.get_idcard(TRUE) - if(C) - if(check_access(C)) - can_load = TRUE - if(can_load) - dat += "
Load From Disk" - else - dat += "Cannot Load From Disk: Access Denied" - if(diskette.fields["SE"]) - if(!include_se) - dat += "
Currently Excluding SE" - else - dat += "
Currently Including SE" - if(diskette.fields["UI"]) - if(!include_ui) - dat += "
Currently Excluding UI" - else - dat += "
Currently Including UI" - if(diskette.fields["UE"]) - if(!include_ue) - dat += "
Currently Excluding UE" - else - dat += "
Currently Including UE" - - - dat += "
Save to Disk" - dat += "
" - - dat += "Delete Record" - - if(4) - if (!active_record) - menu = 2 - ui_interact(user) - return - dat += "Please confirm.
" - dat += "Cancel" - - var/datum/browser/popup = new(user, "cloning", "Cloning System Control") - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - -/obj/machinery/computer/cloning/Topic(href, href_list) - if(..()) - return - - if(loading) - return - - if(href_list["task"]) - switch(href_list["task"]) - if("autoprocess") - if(scanner && HasEfficientPod() && scanner.scan_level >= AUTOCLONING_MINIMAL_LEVEL) - autoprocess = TRUE - START_PROCESSING(SSmachines, src) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - if("stopautoprocess") - autoprocess = FALSE - STOP_PROCESSING(SSmachines, src) - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - if("include_se") - include_se = TRUE - if("exclude_se") - include_se = FALSE - if("include_ui") - include_ui = TRUE - if("exclude_ui") - include_ui = FALSE - if("include_ue") - include_ue = TRUE - if("exclude_ue") - include_ue = FALSE - - else if ((href_list["scan"]) && !isnull(scanner) && scanner.is_operational()) - scantemp = "" - var/body_only = href_list["body_only"] - loading = TRUE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - say("Initiating scan...") - - addtimer(CALLBACK(src, .proc/do_scan, usr, body_only), 2 SECONDS) - - //No locking an open scanner. - else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) - if ((!scanner.locked) && (scanner.occupant)) - scanner.locked = TRUE - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else - scanner.locked = FALSE - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - - else if(href_list["view_rec"]) - playsound(src, "terminal_type", 25, FALSE) - active_record = find_record("id", href_list["view_rec"], records) - if(active_record) - menu = 3 - else - temp = "Record missing." - - else if (href_list["del_rec"]) - if ((!active_record) || (menu < 3)) - return - if (menu == 3) //If we are viewing a record, confirm deletion - var/has_access = FALSE - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - var/obj/item/card/id/C = user.get_idcard(TRUE) - if(C) - if(check_access(C)) - has_access = TRUE - if(active_record.fields["body_only"]) //Body-only scans are not as important and can be deleted freely - has_access = TRUE - if(has_access) - temp = "Delete record?" - menu = 4 - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - else - temp = "Access Denied" - menu = 2 - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - - - else if (menu == 4) - log_cloning("[key_name(usr)] deleted [key_name(active_record.fields["mindref"])]'s cloning records from [src] at [AREACOORD(src)].") - temp = "[active_record.fields["name"]] => Record deleted." - records.Remove(active_record) - active_record = null - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - menu = 2 - - else if (href_list["disk"]) //Load or eject. - switch(href_list["disk"]) - if("load") - - - if (!diskette || !istype(diskette.fields)) - temp = "Load error." - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - if (!active_record) - temp = "Record error." - menu = 1 - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - - if(include_ue) - overwrite_field_if_available(active_record, diskette, "UE") - overwrite_field_if_available(active_record, diskette, "name") - overwrite_field_if_available(active_record, diskette, "blood_type") - if(include_ui) - overwrite_field_if_available(active_record, diskette, "UI") - if(include_se) - overwrite_field_if_available(active_record, diskette, "SE") - - log_cloning("[key_name(usr)] uploaded [key_name(active_record.fields["mindref"])]'s cloning records to [src] at [AREACOORD(src)] via [diskette].") - temp = "Load successful." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - - if("eject") - if(diskette) - diskette.forceMove(drop_location()) - diskette = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - if("save") - if(!diskette || diskette.read_only || !active_record || !active_record.fields) - temp = "Save error." - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - - log_cloning("[key_name(usr)] added [key_name(active_record.fields["mindref"])]'s cloning records to [diskette] via [src] at [AREACOORD(src)].") - diskette.fields = active_record.fields.Copy() - diskette.name = "data disk - '[diskette.fields["name"]]'" - temp = "Save successful." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - - else if (href_list["refresh"]) - updateUsrDialog() - playsound(src, "terminal_type", 25, FALSE) - - else if (href_list["clone"]) - var/datum/data/record/C = find_record("id", href_list["clone"], records) - var/empty = href_list["empty"] - //Look for that player! They better be dead! - if(C) - if(C.fields["body_only"] && !empty) - temp = "Cannot initiate regular cloning with body-only scans." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - var/obj/machinery/clonepod/pod = GetAvailablePod() - var/success = FALSE - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!LAZYLEN(pods)) - temp = "No Clonepods detected." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else if(!pod) - temp = "No Clonepods available." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else if(!CONFIG_GET(flag/revival_cloning) && !empty) - temp = "Unable to initiate cloning cycle." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else if(pod.occupant) - temp = "Cloning cycle already in progress." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else - var/result = grow_clone_from_record(pod, C, empty) - if(result & CLONING_SUCCESS) - temp = "[C.fields["name"]] => Cloning cycle in progress..." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - if(active_record == C) - active_record = null - menu = 1 - success = TRUE - if(!empty) - log_cloning("[key_name(usr)] initiated cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") - else - log_cloning("[key_name(usr)] initiated EMPTY cloning of [key_name(C.fields["mindref"])] via [src] at [AREACOORD(src)]. Pod: [pod] at [AREACOORD(pod)].") - if(result & CLONING_DELETE_RECORD) - if(active_record == C) - active_record = null - menu = 1 - records -= C - - if(!success) - temp = "[C.fields["name"]] => Initialisation failure." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - - else - temp = "Data corruption." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - - else if (href_list["menu"]) - menu = text2num(href_list["menu"]) - playsound(src, "terminal_type", 25, FALSE) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/cloning/proc/do_scan(mob/user, body_only) - scan_occupant(scanner.occupant, user, body_only) - - loading = FALSE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - -/obj/machinery/computer/cloning/proc/scan_occupant(occupant, mob/M, body_only) - var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) - var/datum/dna/dna - var/datum/bank_account/has_bank_account - - // Do not use unless you know what they are. - var/mob/living/carbon/C = mob_occupant - var/mob/living/brain/B = mob_occupant - - if(ishuman(mob_occupant)) - dna = C.has_dna() - var/obj/item/card/id/I = C.get_idcard(TRUE) - if(I) - has_bank_account = I.registered_account - if(isbrain(mob_occupant)) - dna = B.stored_dna - - if(!istype(dna)) - scantemp = "Unable to locate valid genetic data." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - if(!body_only && (mob_occupant.suiciding || mob_occupant.hellbound)) - scantemp = "Subject's brain is not responding to scanning stimuli." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) - scantemp = "Subject's body is too damaged to scan properly." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - return - if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) - scantemp = "Subject's DNA is damaged beyond any hope of recovery." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - return - if (!body_only && isnull(mob_occupant.mind)) - scantemp = "Mental interface failure." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - if(!body_only && SSeconomy.full_ancap) - if(!has_bank_account) - scantemp = "Subject is either missing an ID card with a bank account on it, or does not have an account to begin with. Please ensure the ID card is on the body before attempting to scan." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - var/datum/data/record/R = new() - if(dna.species) - // We store the instance rather than the path, because some - // species (abductors, slimepeople) store state in their - // species datums - dna.delete_species = FALSE - R.fields["mrace"] = dna.species - else - var/datum/species/rando_race = pick(GLOB.roundstart_races) - R.fields["mrace"] = rando_race.type - - R.fields["name"] = mob_occupant.real_name - R.fields["id"] = copytext_char(md5(mob_occupant.real_name), 2, 6) - R.fields["UE"] = dna.unique_enzymes - R.fields["UI"] = dna.uni_identity - R.fields["SE"] = dna.mutation_index - R.fields["blood_type"] = dna.blood_type - R.fields["features"] = dna.features - R.fields["factions"] = mob_occupant.faction - R.fields["quirks"] = list() - for(var/V in mob_occupant.roundstart_quirks) - var/datum/quirk/T = V - R.fields["quirks"][T.type] = T.clone_data() - - R.fields["traumas"] = list() - if(ishuman(mob_occupant)) - R.fields["traumas"] = C.get_traumas() - if(isbrain(mob_occupant)) - R.fields["traumas"] = B.get_traumas() - - R.fields["bank_account"] = has_bank_account - R.fields["mindref"] = "[REF(mob_occupant.mind)]" - R.fields["last_death"] = mob_occupant.stat == DEAD && mob_occupant.mind ? mob_occupant.mind.last_death : -1 - R.fields["body_only"] = body_only - - if(!body_only) - //Add an implant if needed - var/obj/item/implant/health/imp - for(var/obj/item/implant/health/HI in mob_occupant.implants) - imp = HI - break - if(!imp) - imp = new /obj/item/implant/health(mob_occupant) - imp.implant(mob_occupant) - R.fields["imp"] = "[REF(imp)]" - - var/datum/data/record/old_record = find_record("mindref", REF(mob_occupant.mind), records) - if(body_only) - old_record = find_record("UE", dna.unique_enzymes, records) //Body-only records cannot be identified by mind, so we use the DNA - if(old_record && ((old_record.fields["UI"] != dna.uni_identity) || (!old_record.fields["body_only"]))) //Never overwrite a mind-and-body record if it exists - old_record = null - if(old_record) - records -= old_record - scantemp = "Record updated." - else - scantemp = "Subject successfully scanned." - records += R - log_cloning("[M ? key_name(M) : "Autoprocess"] added the [body_only ? "body-only " : ""]record of [key_name(mob_occupant)] to [src] at [AREACOORD(src)].") - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e3ab9d96c58..2873cd670dc 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -17,7 +17,6 @@ //Sorting Variables var/sortBy = "name" var/order = 1 // -1 = Descending - 1 = Ascending - var/maxFine = 1000 light_color = LIGHT_COLOR_RED @@ -730,18 +729,19 @@ What a mess.*/ GLOB.data_core.removeMajorCrime(active1.fields["id"], href_list["cdataid"]) if("citation_add") if(istype(active1, /datum/data/record)) + var/maxFine = CONFIG_GET(number/maxfine) + var/t1 = stripped_input(usr, "Please input citation crime:", "Secure. records", "", null) - var/fine = FLOOR(input(usr, "Please input citation fine:", "Secure. records", 50) as num|null, 1) + var/fine = FLOOR(input(usr, "Please input citation fine, up to [maxFine]:", "Secure. records", 50) as num|null, 1) if (isnull(fine)) return + fine = min(fine, maxFine) if(fine < 0) to_chat(usr, "You're pretty sure that's not how money works.") return - fine = min(fine, maxFine) - if(!canUseSecurityRecordsConsole(usr, t1, null, a2)) return diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 4f7d1e8f362..ff28914286d 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -460,10 +460,6 @@ /obj/machinery/jukebox/disco/process() . = ..() if(active) - for(var/mob/M in rangers) - if(prob(5+(allowed(M)*4))) - if(isliving(M)) - var/mob/living/L = M - if(!(L.mobility_flags & MOBILITY_MOVE)) - continue + for(var/mob/living/M in rangers) + if(prob(5+(allowed(M)*4)) && (M.mobility_flags & MOBILITY_MOVE)) dance(M) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index a3eea895387..8525b2063d0 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -8,7 +8,7 @@ idle_power_usage = 50 active_power_usage = 300 occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain) - circuit = /obj/item/circuitboard/machine/clonescanner + circuit = /obj/item/circuitboard/machine/dnascanner var/locked = FALSE var/damage_coeff var/scan_level @@ -141,3 +141,26 @@ if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) return close_machine(target) + + +//Just for transferring between genetics machines. +/obj/item/disk/data + name = "DNA data disk" + icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. + var/list/fields = list() + var/list/mutations = list() + var/max_mutations = 6 + var/read_only = FALSE //Well,it's still a floppy disk + +/obj/item/disk/data/Initialize() + . = ..() + icon_state = "datadisk[rand(0,6)]" + add_overlay("datadisk_gene") + +/obj/item/disk/data/attack_self(mob/user) + read_only = !read_only + to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") + +/obj/item/disk/data/examine(mob/user) + . = ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 1f8c8d37e2a..dfe84db4e54 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -93,4 +93,24 @@ /obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) if(machine_stat & NOPOWER) - open(1) + open(TRUE) + +/obj/machinery/door/poddoor/attack_alien(mob/living/carbon/alien/humanoid/user) + if(density & !(resistance_flags & INDESTRUCTIBLE)) + add_fingerprint(user) + user.visible_message("[user] begins prying open [src].",\ + "You begin digging your claws into [src] with all your might!",\ + "You hear groaning metal...") + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + + var/time_to_open = 5 SECONDS + if(hasPower()) + time_to_open = 15 SECONDS + + if(do_after(user, time_to_open, TRUE, src)) + if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) + to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!") + + else + return ..() + diff --git a/code/game/machinery/exp_cloner.dm b/code/game/machinery/exp_cloner.dm deleted file mode 100644 index 3935d84631d..00000000000 --- a/code/game/machinery/exp_cloner.dm +++ /dev/null @@ -1,306 +0,0 @@ -//Experimental cloner; clones a body regardless of the owner's status, letting a ghost control it instead -/obj/machinery/clonepod/experimental - name = "experimental cloning pod" - desc = "An ancient cloning pod. It seems to be an early prototype of the experimental cloners used in Nanotrasen Stations." - icon = 'icons/obj/machines/cloning.dmi' - icon_state = "pod_0" - req_access = null - circuit = /obj/item/circuitboard/machine/clonepod/experimental - internal_radio = FALSE - -//Start growing a human clone in the pod! -/obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, last_death, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) - if(panel_open) - return NONE - if(mess || attempting) - return NONE - - attempting = TRUE //One at a time!! - countdown.start() - - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - - H.hardset_dna(ui, mutation_index, H.real_name, blood_type, mrace, features) - - if(efficiency > 2) - var/list/unclean_mutations = (GLOB.not_good_mutations|GLOB.bad_mutations) - H.dna.remove_mutation_group(unclean_mutations) - if(efficiency > 5 && prob(20)) - H.easy_randmut(POSITIVE) - if(efficiency < 3 && prob(50)) - var/mob/M = H.easy_randmut(NEGATIVE+MINOR_NEGATIVE) - if(ismob(M)) - H = M - - H.silent = 20 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. - occupant = H - - if(!clonename) //to prevent null names - clonename = "clone ([rand(1,999)])" - H.real_name = clonename - - icon_state = "pod_1" - //Get the clone body ready - maim_clone(H) - ADD_TRAIT(H, TRAIT_STABLEHEART, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_STABLELIVER, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_EMOTEMUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_MUTE, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOBREATH, CLONING_POD_TRAIT) - ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) - H.Unconscious(80) - - var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H, POLL_IGNORE_DEFECTIVECLONE) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - H.key = C.key - - if(grab_ghost_when == CLONER_FRESH_CLONE) - H.grab_ghost() - to_chat(H, "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
") - - if(grab_ghost_when == CLONER_MATURE_CLONE) - H.ghostize(TRUE) //Only does anything if they were still in their old body and not already a ghost - to_chat(H.get_ghost(TRUE), "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") - - if(H) - H.faction |= factions - - H.set_cloned_appearance() - - H.set_suicide(FALSE) - attempting = FALSE - return CLONING_DELETE_RECORD | CLONING_SUCCESS //so that we don't spam clones with autoprocess unless we leave a body in the scanner - - -//Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. -/obj/machinery/computer/prototype_cloning - name = "prototype cloning console" - desc = "Used to operate an experimental cloner." - icon_screen = "dna" - icon_keyboard = "med_key" - circuit = /obj/item/circuitboard/computer/prototype_cloning - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/list/pods //Linked experimental cloning pods - var/temp = "Inactive" - var/scantemp = "Ready to Scan" - var/loading = FALSE // Nice loading text - - light_color = LIGHT_COLOR_BLUE - -/obj/machinery/computer/prototype_cloning/Initialize() - . = ..() - updatemodules(TRUE) - -/obj/machinery/computer/prototype_cloning/Destroy() - if(pods) - for(var/P in pods) - DetachCloner(P) - pods = null - return ..() - -/obj/machinery/computer/prototype_cloning/proc/GetAvailablePod(mind = null) - if(pods) - for(var/P in pods) - var/obj/machinery/clonepod/experimental/pod = P - if(pod.is_operational() && !(pod.occupant || pod.mess)) - return pod - -/obj/machinery/computer/prototype_cloning/proc/updatemodules(findfirstcloner) - scanner = findscanner() - if(findfirstcloner && !LAZYLEN(pods)) - findcloner() - -/obj/machinery/computer/prototype_cloning/proc/findscanner() - var/obj/machinery/dna_scannernew/scannerf = null - - // Loop through every direction - for(var/direction in GLOB.cardinals) - // Try to find a scanner in that direction - scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, direction)) - // If found and operational, return the scanner - if (!isnull(scannerf) && scannerf.is_operational()) - return scannerf - - // If no scanner was found, it will return null - return null - -/obj/machinery/computer/prototype_cloning/proc/findcloner() - var/obj/machinery/clonepod/experimental/podf = null - for(var/direction in GLOB.cardinals) - podf = locate(/obj/machinery/clonepod/experimental, get_step(src, direction)) - if (!isnull(podf) && podf.is_operational()) - AttachCloner(podf) - -/obj/machinery/computer/prototype_cloning/proc/AttachCloner(obj/machinery/clonepod/experimental/pod) - if(!pod.connected) - pod.connected = src - LAZYADD(pods, pod) - -/obj/machinery/computer/prototype_cloning/proc/DetachCloner(obj/machinery/clonepod/experimental/pod) - pod.connected = null - LAZYREMOVE(pods, pod) - -/obj/machinery/computer/prototype_cloning/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/P = W - - if(istype(P.buffer, /obj/machinery/clonepod/experimental)) - if(get_area(P.buffer) != get_area(src)) - to_chat(user, "-% Cannot link machines across power zones. Buffer cleared %-") - P.buffer = null - return - to_chat(user, "-% Successfully linked [P.buffer] with [src] %-") - var/obj/machinery/clonepod/experimental/pod = P.buffer - if(pod.connected) - pod.connected.DetachCloner(pod) - AttachCloner(pod) - else - P.buffer = src - to_chat(user, "-% Successfully stored [REF(P.buffer)] [P.buffer.name] in buffer %-") - return - else - return ..() - -/obj/machinery/computer/prototype_cloning/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/computer/prototype_cloning/interact(mob/user) - user.set_machine(src) - add_fingerprint(user) - - if(..()) - return - - updatemodules(TRUE) - - var/dat = "" - dat += "Refresh" - - dat += "

Cloning Pod Status

" - dat += "
[temp] 
" - - if (isnull(src.scanner) || !LAZYLEN(pods)) - dat += "

Modules

" - //dat += "Reload Modules" - if (isnull(src.scanner)) - dat += "ERROR: No Scanner detected!
" - if (!LAZYLEN(pods)) - dat += "ERROR: No Pod detected
" - - // Scan-n-Clone - if (!isnull(src.scanner)) - var/mob/living/scanner_occupant = get_mob_or_brainmob(scanner.occupant) - - dat += "

Cloning

" - - dat += "
" - if(!scanner_occupant) - dat += "Scanner Unoccupied" - else if(loading) - dat += "[scanner_occupant] => Scanning..." - else - scantemp = "Ready to Clone" - dat += "[scanner_occupant] => [scantemp]" - dat += "
" - - if(scanner_occupant) - dat += "Clone" - dat += "
[src.scanner.locked ? "Unlock Scanner" : "Lock Scanner"]" - else - dat += "Clone" - - var/datum/browser/popup = new(user, "cloning", "Prototype Cloning System Control") - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - -/obj/machinery/computer/prototype_cloning/Topic(href, href_list) - if(..()) - return - - if(loading) - return - - else if ((href_list["clone"]) && !isnull(scanner) && scanner.is_operational()) - scantemp = "" - - loading = TRUE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt.ogg', 50, FALSE) - say("Initiating scan...") - - addtimer(CALLBACK(src, .proc/do_clone), 2 SECONDS) - - //No locking an open scanner. - else if ((href_list["lock"]) && !isnull(scanner) && scanner.is_operational()) - if ((!scanner.locked) && (scanner.occupant)) - scanner.locked = TRUE - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else - scanner.locked = FALSE - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - - else if (href_list["refresh"]) - updateUsrDialog() - playsound(src, "terminal_type", 25, FALSE) - - add_fingerprint(usr) - updateUsrDialog() - return - -/obj/machinery/computer/prototype_cloning/proc/do_clone() - clone_occupant(scanner.occupant) - loading = FALSE - updateUsrDialog() - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - -/obj/machinery/computer/prototype_cloning/proc/clone_occupant(occupant) - var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) - var/datum/dna/dna - if(ishuman(mob_occupant)) - var/mob/living/carbon/C = mob_occupant - dna = C.has_dna() - if(isbrain(mob_occupant)) - var/mob/living/brain/B = mob_occupant - dna = B.stored_dna - - if(!istype(dna)) - scantemp = "Unable to locate valid genetic data." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - return - if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2)) - scantemp = "Subject's body is too damaged to scan properly." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - return - if(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) - scantemp = "Subject's DNA is damaged beyond any hope of recovery." - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - return - - var/clone_species - if(dna.species) - clone_species = dna.species - else - var/datum/species/rando_race = pick(GLOB.roundstart_races) - clone_species = rando_race.type - - var/obj/machinery/clonepod/pod = GetAvailablePod() - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!LAZYLEN(pods)) - temp = "No Clonepods detected." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else if(!pod) - temp = "No Clonepods available." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else if(pod.occupant) - temp = "Cloning cycle already in progress." - playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) - else - pod.growclone(mob_occupant.real_name, dna.uni_identity, dna.mutation_index, null, null, dna.blood_type, clone_species, dna.features, mob_occupant.faction) - temp = "[mob_occupant.real_name] => Cloning data sent to pod." - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm new file mode 100644 index 00000000000..1182440f2d0 --- /dev/null +++ b/code/game/machinery/medipen_refiller.dm @@ -0,0 +1,96 @@ +/obj/machinery/medipen_refiller + name = "Medipen Refiller" + desc = "A machine that refills used medipens with chemicals." + icon = 'icons/obj/machines/medipen_refiller.dmi' + icon_state = "medipen_refiller" + density = TRUE + circuit = /obj/item/circuitboard/machine/medipen_refiller + idle_power_usage = 100 + /// list of medipen subtypes it can refill + var/list/allowed = list(/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine, + /obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine, + /obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol, + /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone, + /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid, + /obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid) + /// var to prevent glitches in the animation + var/busy = FALSE + +/obj/machinery/medipen_refiller/Initialize() + . = ..() + create_reagents(100, TRANSPARENT) + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + reagents.maximum_volume += 100 * B.rating + AddComponent(/datum/component/plumbing/simple_demand) + + +/obj/machinery/medipen_refiller/RefreshParts() + var/new_volume = 100 + for(var/obj/item/stock_parts/matter_bin/B in component_parts) + new_volume += 100 * B.rating + if(!reagents) + create_reagents(new_volume, TRANSPARENT) + reagents.maximum_volume = new_volume + return TRUE + +/// handles the messages and animation, calls refill to end the animation +/obj/machinery/medipen_refiller/attackby(obj/item/I, mob/user, params) + if(busy) + to_chat(user, "The machine is busy.") + return + if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) + var/obj/item/reagent_containers/RC = I + var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) + if(units) + to_chat(user, "You transfer [units] units of the solution to the [name].") + return + else + to_chat(user, "The [name] is full.") + return + if(istype(I, /obj/item/reagent_containers/hypospray/medipen)) + var/obj/item/reagent_containers/hypospray/medipen/P = I + if(!(LAZYFIND(allowed, P.type))) + to_chat(user, "Error! Unknown schematics.") + return + if(P.reagents?.reagent_list.len) + to_chat(user, "The medipen is already filled.") + return + if(reagents.has_reagent(allowed[P.type], 10)) + busy = TRUE + add_overlay("active") + addtimer(CALLBACK(src, .proc/refill, P, user), 20) + qdel(P) + return + to_chat(user, "There aren't enough reagents to finish this operation.") + return + ..() + +/obj/machinery/medipen_refiller/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) + to_chat(user, "You start furiously plunging [name].") + if(do_after(user, 30, target = src)) + to_chat(user, "You finish plunging the [name].") + reagents.reaction(get_turf(src), TOUCH) + reagents.clear_reagents() + +/obj/machinery/medipen_refiller/wrench_act(mob/living/user, obj/item/I) + ..() + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/medipen_refiller/crowbar_act(mob/user, obj/item/I) + ..() + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/medipen_refiller/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + if(!.) + return default_deconstruction_screwdriver(user, "medipen_refiller_open", "medipen_refiller", I) + +/// refills the medipen +/obj/machinery/medipen_refiller/proc/refill(obj/item/reagent_containers/hypospray/medipen/P, mob/user) + new P.type(loc) + reagents.remove_reagent(allowed[P.type], 10) + cut_overlays() + busy = FALSE + to_chat(user, "Medipen refilled.") diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm index f06f4d677d8..f2164d03bf3 100644 --- a/code/game/machinery/porta_turret/portable_turret_construct.dm +++ b/code/game/machinery/porta_turret/portable_turret_construct.dm @@ -148,6 +148,7 @@ turret.installation = installed_gun.type turret.setup(installed_gun) qdel(src) + return else if(I.tool_behaviour == TOOL_CROWBAR) I.play_tool_sound(src, 75) diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index b62be915735..f7410c45cdb 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -90,11 +90,13 @@ eat(AM) . = ..() -/obj/machinery/recycler/proc/eat(atom/AM0, sound=TRUE) +/obj/machinery/recycler/proc/eat(atom/movable/AM0, sound=TRUE) if(machine_stat & (BROKEN|NOPOWER)) return if(safety_mode) return + if(!isturf(AM0.loc)) + return //I don't know how you called Crossed() but stop it. var/list/to_eat if(istype(AM0, /obj/item)) @@ -102,54 +104,66 @@ else to_eat = list(AM0) - var/items_recycled = 0 + var/living_detected = FALSE //technically includes silicons as well but eh + var/list/nom = list() + var/list/crunchy_nom = list() //Mobs have to be handled differently so they get a different list instead of checking them multiple times. for(var/i in to_eat) var/atom/movable/AM = i - var/obj/item/bodypart/head/as_head = AM - var/obj/item/mmi/as_mmi = AM - if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) || istype(AM, /obj/item/dullahan_relay)) - emergency_stop(AM) + if(istype(AM, /obj/item)) + var/obj/item/bodypart/head/as_head = AM + var/obj/item/mmi/as_mmi = AM + if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay)) + living_detected = TRUE + nom += AM else if(isliving(AM)) - if(obj_flags & EMAGGED) - crush_living(AM) - else - emergency_stop(AM) - else if(istype(AM, /obj/item)) - recycle_item(AM) - items_recycled++ - else - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) - if(items_recycled && sound) - playsound(src, item_recycle_sound, 50, TRUE) + living_detected = TRUE + crunchy_nom += AM + var/not_eaten = to_eat.len - nom.len - crunchy_nom.len + if(living_detected) // First, check if we have any living beings detected. + if(obj_flags & EMAGGED) + for(var/CRUNCH in crunchy_nom) // Eat them and keep going because we don't care about safety. + if(isliving(CRUNCH)) // MMIs and brains will get eaten like normal items + crush_living(CRUNCH) + else // Stop processing right now without eating anything. + emergency_stop() + return + for(var/nommed in nom) + recycle_item(nommed) + if(nom.len && sound) + playsound(src, item_recycle_sound, (50 + nom.len*5), TRUE, nom.len, ignore_walls = (nom.len - 10)) // As a substitute for playing 50 sounds at once. + if(not_eaten) + playsound(src, 'sound/machines/buzz-sigh.ogg', (50 + not_eaten*5), FALSE, not_eaten, ignore_walls = (not_eaten - 10)) // Ditto. + if(!ismob(AM0)) + AM0.moveToNullspace() + qdel(AM0) + else // Lets not move a mob to nullspace and qdel it, yes? + for(var/i in AM0.contents) + var/atom/movable/content = i + content.moveToNullspace() + qdel(content) /obj/machinery/recycler/proc/recycle_item(obj/item/I) - I.forceMove(loc) var/obj/item/grown/log/L = I if(istype(L)) var/seed_modifier = 0 if(L.seed) seed_modifier = round(L.seed.potency / 25) - new L.plank_type(src.loc, 1 + seed_modifier) - qdel(L) - return + new L.plank_type(loc, 1 + seed_modifier) else var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) var/material_amount = materials.get_item_material_amount(I) if(!material_amount) - qdel(I) return materials.insert_item(I, multiplier = (amount_produced / 100)) - qdel(I) materials.retrieve_all() -/obj/machinery/recycler/proc/emergency_stop(mob/living/L) +/obj/machinery/recycler/proc/emergency_stop() playsound(src, 'sound/machines/buzz-sigh.ogg', 50, FALSE) safety_mode = TRUE update_icon() - L.forceMove(loc) addtimer(CALLBACK(src, .proc/reboot), SAFETY_COOLDOWN) /obj/machinery/recycler/proc/reboot() @@ -175,12 +189,6 @@ blood = TRUE update_icon() - // Remove and recycle the equipped items - if(eat_victim_items) - for(var/obj/item/I in L.get_equipped_items(TRUE)) - if(L.dropItemToGround(I)) - eat(I, sound=FALSE) - // Instantly lie down, also go unconscious from the pain, before you die. L.Unconscious(100) L.adjustBruteLoss(crush_damage) diff --git a/code/game/machinery/stasis.dm b/code/game/machinery/stasis.dm index 5392608670e..8daab3a9e16 100644 --- a/code/game/machinery/stasis.dm +++ b/code/game/machinery/stasis.dm @@ -109,12 +109,12 @@ return var/freq = rand(24750, 26550) playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 2, frequency = freq) - target.apply_status_effect(STATUS_EFFECT_STASIS, null, TRUE) + target.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) target.ExtinguishMob() use_power = ACTIVE_POWER_USE /obj/machinery/stasis/proc/thaw_them(mob/living/target) - target.remove_status_effect(STATUS_EFFECT_STASIS) + target.remove_status_effect(STATUS_EFFECT_STASIS, STASIS_MACHINE_EFFECT) if(target == occupant) use_power = IDLE_POWER_USE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 6cfb708cbd0..7507d89bf8b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -4,6 +4,9 @@ desc = "An industrial unit made to hold and decontaminate irradiated equipment. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit." icon = 'icons/obj/machines/suit_storage.dmi' icon_state = "close" + use_power = ACTIVE_POWER_USE + active_power_usage = 60 + power_channel = EQUIP density = TRUE max_integrity = 250 ui_x = 400 @@ -46,6 +49,8 @@ var/message_cooldown /// How long it takes to break out of the SSU. var/breakout_time = 300 + /// How fast it charges cells in a suit + var/charge_rate = 500 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -302,6 +307,18 @@ if(occupant) dump_contents() +/obj/machinery/suit_storage_unit/process() + if(!suit) + return + if(!istype(suit, /obj/item/clothing/suit/space)) + return + if(!suit.cell) + return + + var/obj/item/stock_parts/cell/C = suit.cell + use_power(charge_rate) + C.give(charge_rate) + /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) if(!prob(prb)) var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread diff --git a/code/game/machinery/telecomms/machines/receiver.dm b/code/game/machinery/telecomms/machines/receiver.dm index 4dd3af036cd..0d2fe60e8e1 100644 --- a/code/game/machinery/telecomms/machines/receiver.dm +++ b/code/game/machinery/telecomms/machines/receiver.dm @@ -1,7 +1,7 @@ /* The receiver idles and receives messages from subspace-compatible radio equipment; - primarily headsets. They then just relay this information to all linked devices, - which can would probably be network hubs. + primarily headsets. Then they just relay this information to all linked devices, + which would probably be network hubs. Link to Processor Units in case receiver can't send to bus units. */ diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 3e3fdb9ba92..24197a34f45 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -26,10 +26,11 @@ name = "\improper Dark Gygax" icon_state = "darkgygax" max_integrity = 300 - deflect_chance = 15 + deflect_chance = 20 armor = list("melee" = 40, "bullet" = 40, "laser" = 50, "energy" = 35, "bomb" = 20, "bio" = 0, "rad" =20, "fire" = 100, "acid" = 100) max_temperature = 35000 leg_overload_coeff = 70 + force = 30 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) wreckage = /obj/structure/mecha_wreckage/gygax/dark @@ -40,11 +41,11 @@ . = ..() var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine + ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang + ME = new /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/teleporter + ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay ME.attach(src) @@ -55,7 +56,7 @@ C.forceMove(src) cell = C return - cell = new /obj/item/stock_parts/cell/hyper(src) + cell = new /obj/item/stock_parts/cell/bluespace(src) /obj/mecha/combat/gygax/GrantActions(mob/living/user, human_occupant = 0) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ce88021154d..7f19c69ca78 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -242,16 +242,8 @@ return output /obj/machinery/mecha_part_fabricator/proc/sync() - temp = "Updating local R&D database..." - updateUsrDialog() - sleep(30) //only sleep if called by user - for(var/obj/machinery/computer/rdconsole/RDC in oview(7,src)) RDC.stored_research.copy_research_to(stored_research) - temp = "Processed equipment designs.
" - //check if the tech coefficients have changed - temp += "Return" - updateUsrDialog() say("Successfully synchronized with R&D server.") return diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 96e7b6f35be..98fb613af02 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -276,11 +276,17 @@ S.rabid = TRUE S.amount_grown = SLIME_EVOLUTION_THRESHOLD S.Evolve() + var/datum/action/innate/slime/reproduce/A = new + A.Grant(S) - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_PAI, null, null, 100, S, POLL_IGNORE_PYROSLIME) + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a pyroclastic anomaly slime?", ROLE_SENTIENCE, null, null, 100, S, POLL_IGNORE_PYROSLIME) if(LAZYLEN(candidates)) var/mob/dead/observer/chosen = pick(candidates) S.key = chosen.key + S.mind.special_role = ROLE_PYROCLASTIC_SLIME + var/policy = get_policy(ROLE_PYROCLASTIC_SLIME) + if (policy) + to_chat(S, policy) log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].") ///////////////////// diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 841777c704a..c19561c22c5 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -57,6 +57,7 @@ var/poster_item_name = "hypothetical poster" var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." var/poster_item_icon_state = "rolled_poster" + var/poster_item_type = /obj/item/poster /obj/structure/sign/poster/Initialize() . = ..() @@ -66,8 +67,8 @@ original_name = name // can't use initial because of random posters name = "poster - [name]" desc = "A large piece of space-resistant printed paper. [desc]" - - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 300), 0) + + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 300)), 0) /obj/structure/sign/poster/proc/randomise(base_type) var/list/poster_types = subtypesof(base_type) @@ -116,7 +117,7 @@ /obj/structure/sign/poster/proc/roll_and_drop(loc) pixel_x = 0 pixel_y = 0 - var/obj/item/poster/P = new(loc, src) + var/obj/item/poster/P = new poster_item_type(loc, src) forceMove(P) return P diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index b30289fbe47..af80f120153 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -90,19 +90,6 @@ else if(N.timing) return round(N.get_time_left(), 1) -/obj/effect/countdown/clonepod - name = "cloning pod countdown" - color = "#18d100" - text_size = 1 - -/obj/effect/countdown/clonepod/get_value() - var/obj/machinery/clonepod/C = attached_to - if(!istype(C)) - return - else if(C.occupant) - var/completion = round(C.get_completion()) - return completion - /obj/effect/countdown/supermatter name = "supermatter damage" text_size = 1 diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index c988704828b..b197c758c97 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -26,7 +26,7 @@ if(LAZYLEN(diseases_to_add)) AddComponent(/datum/component/infective, diseases_to_add) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, beauty), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, beauty)), 0) var/turf/T = get_turf(src) if(T && is_station_level(T.z)) diff --git a/code/game/objects/effects/decals/cleanable/food.dm b/code/game/objects/effects/decals/cleanable/food.dm index 7a702bf354f..5444e3ba32d 100644 --- a/code/game/objects/effects/decals/cleanable/food.dm +++ b/code/game/objects/effects/decals/cleanable/food.dm @@ -30,6 +30,7 @@ name = "salt pile" desc = "A sizable pile of table salt. Someone must be upset." icon_state = "salt_pile" + var/safepasses = 3 //how many times can this salt pile be passed before dissipating /obj/effect/decal/cleanable/food/salt/CanAllowThrough(atom/movable/AM, turf/target) . = ..() @@ -41,6 +42,18 @@ if(is_species(AM, /datum/species/snail)) to_chat(AM, "Your path is obstructed by salt.") +/obj/effect/decal/cleanable/food/salt/Crossed(atom/movable/AM) + ..() + if(!isliving(AM)) + return + if(iscarbon(AM)) + var/mob/living/carbon/C = AM + if(C.m_intent == MOVE_INTENT_WALK) + return + safepasses-- + if(safepasses <= 0 && !QDELETED(src)) + qdel(src) + /obj/effect/decal/cleanable/food/flour name = "flour" desc = "It's still good. Four second rule!" diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index cc2a5180797..edafa39828a 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -11,8 +11,7 @@ /obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C) C.add_blood_DNA(return_blood_DNA()) if (bloodiness) - if (C.bloodiness < MAX_SHOE_BLOODINESS) - C.bloodiness += bloodiness + C.bloodiness = min((C.bloodiness + bloodiness),MAX_SHOE_BLOODINESS) return ..() /obj/effect/decal/cleanable/blood/old diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 2aeabfbad58..c6461b6baac 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -39,9 +39,10 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - var/plas_amt = min(30,G.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma - G.gases[/datum/gas/plasma][MOLES] -= plas_amt - absorbed_plasma += plas_amt + if(G.gases[/datum/gas/plasma]) + var/plas_amt = min(30,G.gases[/datum/gas/plasma][MOLES]) //Absorb some plasma + G.gases[/datum/gas/plasma][MOLES] -= plas_amt + absorbed_plasma += plas_amt if(G.temperature > T20C) G.temperature = max(G.temperature/2,T20C) G.garbage_collect() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index cdb06ba00ba..6baec2f118e 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -78,6 +78,11 @@ gas_type = "n2o" +/obj/effect/mine/gas/water_vapor + name = "chilled vapor mine" + gas_amount = 500 + gas_type = "water_vapor" + /obj/effect/mine/sound name = "honkblaster 1000" var/sound = 'sound/items/bikehorn.ogg' diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index ce15a77c89e..3722218113b 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -9,9 +9,8 @@ /obj/effect/spawner/bundle/Initialize(mapload) ..() if(items && items.len) - var/turf/T = get_turf(src) for(var/path in items) - new path(T) + new path(loc) return INITIALIZE_HINT_QDEL /obj/effect/spawner/bundle/costume/chicken @@ -168,3 +167,31 @@ items = list( /obj/item/clothing/mask/gas/sexymime, /obj/item/clothing/under/rank/civilian/mime/sexy) + +/obj/effect/spawner/bundle/costume/mafia + name = "black mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora, + /obj/item/clothing/under/suit/blacktwopiece, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/white + name = "white mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora/white, + /obj/item/clothing/under/suit/white, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/checkered + name = "checkered mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora, + /obj/item/clothing/under/suit/checkered, + /obj/item/clothing/shoes/laceup) + +/obj/effect/spawner/bundle/costume/mafia/beige + name = "beige mafia outfit spawner" + items = list( + /obj/item/clothing/head/fedora/beige, + /obj/item/clothing/under/suit/beige, + /obj/item/clothing/shoes/laceup) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 1c0b5a55954..5bc486a523f 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -10,7 +10,6 @@ /obj/effect/spawner/lootdrop/Initialize(mapload) ..() if(loot && loot.len) - var/turf/T = get_turf(src) var/loot_spawned = 0 while((lootcount-loot_spawned) && loot.len) var/lootspawn = pickweight(loot) @@ -20,7 +19,7 @@ loot.Remove(lootspawn) if(lootspawn) - var/atom/movable/spawned_loot = new lootspawn(T) + var/atom/movable/spawned_loot = new lootspawn(loc) if (!fan_out_items) if (pixel_x != 0) spawned_loot.pixel_x = pixel_x @@ -339,14 +338,12 @@ /obj/effect/spawner/lootdrop/techstorage/medical name = "medical circuit board spawner" loot = list( - /obj/item/circuitboard/computer/cloning, - /obj/item/circuitboard/machine/clonepod, /obj/item/circuitboard/machine/chem_dispenser, /obj/item/circuitboard/computer/scan_consolenew, /obj/item/circuitboard/computer/med_data, /obj/item/circuitboard/machine/smoke_machine, /obj/item/circuitboard/machine/chem_master, - /obj/item/circuitboard/machine/clonescanner, + /obj/item/circuitboard/machine/dnascanner, /obj/item/circuitboard/computer/pandemic ) @@ -374,6 +371,15 @@ /obj/item/circuitboard/computer/robotics ) +/obj/effect/spawner/lootdrop/mafia_outfit + name = "mafia outfit spawner" + loot = list( + /obj/effect/spawner/bundle/costume/mafia = 20, + /obj/effect/spawner/bundle/costume/mafia/white = 5, + /obj/effect/spawner/bundle/costume/mafia/checkered = 2, + /obj/effect/spawner/bundle/costume/mafia/beige = 5 + ) + //finds the probabilities of items spawning from a loot spawner's loot pool /obj/item/loot_table_maker icon = 'icons/effects/landmarks_static.dmi' diff --git a/code/game/objects/effects/wanted_poster.dm b/code/game/objects/effects/wanted_poster.dm index 5cc2923f5ae..5363ba71bf5 100644 --- a/code/game/objects/effects/wanted_poster.dm +++ b/code/game/objects/effects/wanted_poster.dm @@ -34,6 +34,8 @@ var/posterHeaderText var/posterHeaderColor + poster_item_type = /obj/item/poster/wanted + /obj/structure/sign/poster/wanted/Initialize(mapload, icon/person_icon, person_name, description, postHeaderText, postHeaderColor, background, pname, pdesc) . = ..() if(!person_icon) @@ -45,7 +47,7 @@ posterHeaderColor = postHeaderColor wanted_name = person_name - name = "[postName] ([wanted_name])" + name = "[postName] ([wanted_name])" desc = description person_icon = icon(person_icon, dir = SOUTH)//copy the image so we don't mess with the one in the record. @@ -57,11 +59,11 @@ // Print text on top of poster. print_across_top(the_icon, postHeaderText, postHeaderColor) - + the_icon.Insert(the_icon, "wanted") the_icon.Insert(icon('icons/obj/contraband.dmi', "poster_being_set"), "poster_being_set") the_icon.Insert(icon('icons/obj/contraband.dmi', "poster_ripped"), "poster_ripped") - + icon = the_icon /* @@ -83,7 +85,7 @@ letter_icon.Shift(SOUTH, 2) letter_icon.SwapColor(rgb(255,255,255), color) poster_icon.Blend(letter_icon, ICON_OVERLAY) - startX = startX + 4 + startX = startX + 4 /obj/structure/sign/poster/wanted/roll_and_drop(turf/location) var/obj/item/poster/wanted/P = ..(location) @@ -92,4 +94,4 @@ P.postHeaderText = posterHeaderText P.postHeaderColor = posterHeaderColor return P - + diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1a8415c549c..6eba8746a31 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -702,6 +702,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) ..() /obj/item/proc/microwave_act(obj/machinery/microwave/M) + SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) if(istype(M) && M.dirty < 100) M.dirty++ diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index e5bdd85de23..7d98d227169 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -66,8 +66,8 @@ if(iswallturf(T)) T.attackby(src, user, params) - var/metal_amt = round(custom_materials[getmaterialref(/datum/material/iron)]/MINERAL_MATERIAL_AMOUNT) //Replace this shit later - var/glass_amt = round(custom_materials[getmaterialref(/datum/material/glass)]/MINERAL_MATERIAL_AMOUNT) //Replace this shit later + var/metal_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]/MINERAL_MATERIAL_AMOUNT) //Replace this shit later + var/glass_amt = round(custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]/MINERAL_MATERIAL_AMOUNT) //Replace this shit later if(W.tool_behaviour == TOOL_WRENCH && (metal_amt || glass_amt)) to_chat(user, "You dismantle [src].") diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 39c01002a94..1767f4e9ef5 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -201,7 +201,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(src) return // allowing reagents to react after being lit - DISABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags &= ~(NO_REACT) reagents.handle_reactions() icon_state = icon_on item_state = icon_on @@ -227,7 +227,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM icon_state = icon_off item_state = icon_off STOP_PROCESSING(SSobj, src) - ENABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags |= NO_REACT lit = FALSE if(ismob(loc)) var/mob/living/M = loc @@ -817,7 +817,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(!screw) screw = TRUE to_chat(user, "You open the cap on [src].") - ENABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags |= OPENCONTAINER if(obj_flags & EMAGGED) add_overlay("vapeopen_high") else if(super) @@ -827,7 +827,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM else screw = FALSE to_chat(user, "You close the cap on [src].") - DISABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags &= ~(OPENCONTAINER) cut_overlays() if(O.tool_behaviour == TOOL_MULTITOOL) @@ -875,7 +875,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(slot == ITEM_SLOT_MASK) if(!screw) to_chat(user, "You start puffing on the vape.") - DISABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags &= ~(NO_REACT) START_PROCESSING(SSobj, src) else //it will not start if the vape is opened. to_chat(user, "You need to close the cap first!") @@ -883,7 +883,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/vape/dropped(mob/user) . = ..() if(user.get_item_by_slot(ITEM_SLOT_MASK) == src) - ENABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags |= NO_REACT STOP_PROCESSING(SSobj, src) /obj/item/clothing/mask/vape/proc/hand_reagents()//had to rename to avoid duplicate error diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index dad83097f21..d78d4202c0c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -268,11 +268,6 @@ //Medical -/obj/item/circuitboard/computer/cloning - name = "Cloning (Computer Board)" - icon_state = "medical" - build_path = /obj/machinery/computer/cloning - /obj/item/circuitboard/computer/crew name = "Crew Monitoring Console (Computer Board)" icon_state = "medical" @@ -293,11 +288,6 @@ icon_state = "medical" build_path = /obj/machinery/computer/pandemic -/obj/item/circuitboard/computer/prototype_cloning - name = "Prototype Cloning (Computer Board)" - icon_state = "medical" - build_path = /obj/machinery/computer/prototype_cloning - /obj/item/circuitboard/computer/scan_consolenew name = "DNA Machine (Computer Board)" icon_state = "medical" diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 139bccaf922..7dce18edc32 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -654,23 +654,8 @@ else return ..() -/obj/item/circuitboard/machine/clonepod - name = "Clone Pod (Machine Board)" - icon_state = "medical" - build_path = /obj/machinery/clonepod - req_components = list( - /obj/item/stack/cable_coil = 2, - /obj/item/stock_parts/scanning_module = 2, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stack/sheet/glass = 1) - -/obj/item/circuitboard/machine/clonepod/experimental - name = "Experimental Clone Pod (Machine Board)" - icon_state = "medical" - build_path = /obj/machinery/clonepod/experimental - -/obj/item/circuitboard/machine/clonescanner - name = "Cloning Scanner (Machine Board)" +/obj/item/circuitboard/machine/dnascanner + name = "DNA Scanner (Machine Board)" icon_state = "medical" build_path = /obj/machinery/dna_scannernew req_components = list( @@ -748,6 +733,10 @@ /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/glass = 2) +/obj/item/circuitboard/machine/sleeper/party + name = "Party Pod (Machine Board)" + build_path = /obj/machinery/sleeper/party + /obj/item/circuitboard/machine/smoke_machine name = "Smoke Machine (Machine Board)" icon_state = "medical" @@ -769,6 +758,13 @@ /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/capacitor = 1) +/obj/item/circuitboard/machine/medipen_refiller + name = "Medipen Refiller (Machine Board)" + icon_state = "medical" + build_path = /obj/machinery/medipen_refiller + req_components = list( + /obj/item/stock_parts/matter_bin = 1) + /obj/item/circuitboard/machine/techfab/department/medical name = "\improper Departmental Techfab (Machine Board) - Medical" icon_state = "medical" @@ -1176,15 +1172,6 @@ icon_state = "supply" build_path = /obj/machinery/rnd/production/techfab/department/cargo -/obj/item/circuitboard/machine/pump - name = "Portable Liquid Pump (Machine Board)" - icon_state = "supply" - build_path = /obj/machinery/power/liquid_pump - needs_anchored = FALSE - req_components = list( - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/matter_bin = 2) - //Misc diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index cef876142a4..73204a43162 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -73,6 +73,19 @@ icon_state = "soapsyndie" cleanspeed = 5 //faster than mop so it is useful for traitors who want to clean crime scenes +/obj/item/soap/omega + name = "omega soap" + desc = "The most advanced soap known to mankind." + icon_state = "soapomega" + cleanspeed = 3 //Only the truest of mind soul and body get one of these + uses = 301 + +/obj/item/paper/fluff/stations/soap + name = "ancient janitorial poem" + desc = "An old paper that has passed many hands." + info = "The legend of the omega soap

Essence of potato. Juice, not grind.

A lizard's tail, turned into wine.

powder of monkey, to help the workload.

Some Krokodil, because meth would explode.

Nitric acid and Baldium, for organic dissolving.

A cup filled with Hooch, for sinful absolving

Some Bluespace Dust, for removal of stains.

A syringe full of Pump-up, it's security's bane.

Add a can of Space Cola, because we've been paid.

Heat as hot as you can, let the soap be your blade.

Ten units of each regent create a soap that could topple all others." + + /obj/item/soap/suicide_act(mob/user) user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!", forced="soap suicide") user.visible_message("[user] lifts [src] to [user.p_their()] mouth and gnaws on it furiously, producing a thick froth! [user.p_they(TRUE)]'ll never get that BB gun now!") diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index e380eca39de..7ca699371b0 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -23,7 +23,6 @@ var/obj/item/twohanded/shockpaddles/paddles var/obj/item/stock_parts/cell/high/cell var/combat = FALSE //if true, revive through hardsuits, allow for combat shocking - var/grab_ghost = FALSE // Do we pull the ghost back into their body? var/cooldown_duration = 5 SECONDS//how long does it take to recharge /obj/item/defibrillator/get_cell() @@ -305,7 +304,6 @@ var/obj/item/defibrillator/defib var/req_defib = TRUE var/combat = FALSE //If it penetrates armor and gives additional functionality - var/grab_ghost = FALSE var/base_icon_state = "defibpaddles" /obj/item/twohanded/shockpaddles/ComponentInitialize() @@ -441,27 +439,12 @@ do_harm(H, user) return - if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost)) + if(H.can_defib()) H.notify_ghost_cloning("Your heart is being defibrillated!") H.grab_ghost() // Shove them back in their body. - else if(can_defib(H)) - H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) do_help(H, user) -/obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/H) - var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart) - if(H.suiciding || H.hellbound || HAS_TRAIT(H, TRAIT_HUSK)) - return - if((H.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (H.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE)) - return - if(!heart || (heart.organ_flags & ORGAN_FAILING)) - return - var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || BR.suicided) - return - return TRUE - /obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H) if(isliving(H.pulledby)) //CLEAR! var/mob/living/M = H.pulledby @@ -585,18 +568,14 @@ else if (!heart) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." else if (heart.organ_flags & ORGAN_FAILING) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged." + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged, replace or repair and try again." else if(total_burn >= MAX_REVIVE_FIRE_DAMAGE || total_brute >= MAX_REVIVE_BRUTE_DAMAGE || HAS_TRAIT(H, TRAIT_HUSK)) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." - else if(H.get_ghost()) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Tissue damage too severe, repair and try again." else var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) if(BR) if(BR.organ_flags & ORGAN_FAILING) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain tissue is damaged making recovery of patient impossible via defibrillator. Further attempts futile." - if(BR.brain_death) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain damaged beyond point of no return. Further attempts futile." + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is too damaged, repair and try again. " if(BR.suicided || BR.brainmob?.suiciding) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No intelligence pattern can be detected in patient's brain. Further attempts futile." else @@ -620,6 +599,7 @@ user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") playsound(src, 'sound/machines/defib_success.ogg', 50, FALSE) H.set_heartattack(FALSE) + H.grab_ghost() H.revive(full_heal = FALSE, admin_revive = FALSE) H.emote("gasp") H.Jitter(100) diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 76317bf19c4..67ac4f310f1 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -10,10 +10,11 @@ var/datum/song/handheld/song var/instrumentId = "generic" var/instrumentExt = "mid" + var/instrumentRange = 15 /obj/item/instrument/Initialize() . = ..() - song = new(instrumentId, src, instrumentExt) + song = new(instrumentId, src, instrumentExt, instrumentRange) /obj/item/instrument/Destroy() QDEL_NULL(song) @@ -44,6 +45,12 @@ user.set_machine(src) song.interact(user) +/obj/item/instrument/proc/start_playing() + return + +/obj/item/instrument/proc/stop_playing() + return + /obj/item/instrument/violin name = "space violin" desc = "A wooden musical instrument with four strings and a bow. \"The devil went down to space, he was looking for an assistant to grief.\"" @@ -79,6 +86,34 @@ return return changeInstrument(chosen) +/obj/item/instrument/piano_synth/headphones + name = "headphones" + desc = "Unce unce unce unce. Boop!" + icon = 'icons/obj/clothing/accessories.dmi' + lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' + icon_state = "headphones" + item_state = "headphones" + slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD + force = 0 + w_class = WEIGHT_CLASS_SMALL + custom_price = 125 + instrumentRange = 1 + +/obj/item/instrument/piano_synth/headphones/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + RegisterSignal(src, COMSIG_SONG_START, .proc/start_playing) + RegisterSignal(src, COMSIG_SONG_END, .proc/stop_playing) + +/obj/item/instrument/piano_synth/headphones/start_playing() + icon_state = "[initial(icon_state)]_on" + update_icon() + +/obj/item/instrument/piano_synth/headphones/stop_playing() + icon_state = "[initial(icon_state)]" + update_icon() + /obj/item/instrument/banjo name = "banjo" desc = "A 'Mura' brand banjo. It's pretty much just a drum with a neck and strings." @@ -266,7 +301,8 @@ /obj/item/instrument/saxophone, /obj/item/instrument/trombone, /obj/item/instrument/recorder, - /obj/item/instrument/harmonica + /obj/item/instrument/harmonica, + /obj/item/instrument/piano_synth/headphones ) for(var/V in templist) var/atom/A = V diff --git a/code/game/objects/items/devices/pressureplates.dm b/code/game/objects/items/devices/pressureplates.dm index 202bdcede17..60fa1fbadb4 100644 --- a/code/game/objects/items/devices/pressureplates.dm +++ b/code/game/objects/items/devices/pressureplates.dm @@ -1,13 +1,14 @@ - /obj/item/pressure_plate name = "pressure plate" - desc = "An electronic device that triggers when stepped on." - icon = 'icons/obj/device.dmi' + desc = "An electronic device that triggers when stepped on. Ctrl-Click to toggle the pressure plate off and on." + icon = 'icons/obj/puzzle_small.dmi' item_state = "flash" icon_state = "pressureplate" level = 1 + layer = LOW_OBJ_LAYER var/trigger_mob = TRUE var/trigger_item = FALSE + var/specific_item = null var/trigger_silent = FALSE var/sound/trigger_sound = 'sound/effects/pressureplate.ogg' var/obj/item/assembly/signaler/sigdev = null @@ -20,6 +21,7 @@ var/image/tile_overlay = null var/can_trigger = TRUE var/trigger_delay = 10 + var/protected = FALSE /obj/item/pressure_plate/Initialize() . = ..() @@ -35,6 +37,8 @@ . = ..() if(!can_trigger || !active) return + if(trigger_item && !istype(AM, specific_item)) + return if(trigger_mob && isliving(AM)) var/mob/living/L = AM to_chat(L, "You feel something click beneath you!") @@ -62,6 +66,16 @@ sigdev = null return ..() +/obj/item/pressure_plate/CtrlClick(mob/user) + if(protected) + to_chat(user, "You can't quite seem to turn this pressure plate off...") + return + active = !active + if (active == TRUE) + to_chat(user, "You turn [src] on.") + else + to_chat(user, "You turn [src] off.") + /obj/item/pressure_plate/hide(yes) if(yes) invisibility = INVISIBILITY_MAXIMUM diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e99195e8261..8917927b4ee 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -350,12 +350,13 @@ GENE SCANNER else render_list += "Blood level: [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" - var/cyberimp_detect = "" + var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) - cyberimp_detect += "[C.name] is modified with a [CI.name].\n" - if(cyberimp_detect != "") - render_list += "Detected cybernetic modifications:\n[cyberimp_detect]\n" + cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" + if(cyberimp_detect) + render_list += "Detected cybernetic modifications:\n" + render_list += "[cyberimp_detect]\n" SEND_SIGNAL(M, COMSIG_NANITE_SCAN, user, FALSE) to_chat(user, jointext(render_list, ""), trailing_newline = FALSE) // we handled the last
so we don't need handholding diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 7d2da157b3c..92f9b70a089 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -12,7 +12,7 @@ /obj/item/book/granter/proc/turn_page(mob/user) playsound(user, pick('sound/effects/pageturn1.ogg','sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg'), 30, TRUE) - if(do_after(user,50, user)) + if(do_after(user, 50, TRUE, src)) if(remarks.len) to_chat(user, "[pick(remarks)]") else @@ -57,9 +57,9 @@ on_reading_stopped() reading = FALSE return - if(do_after(user,50, user)) + if(do_after(user, 50, TRUE, src)) on_reading_finished(user) - reading = FALSE + reading = FALSE return TRUE ///ACTION BUTTONS/// diff --git a/code/game/objects/items/grenades/antigravity.dm b/code/game/objects/items/grenades/antigravity.dm index cf7dc928ae0..a4bc207be03 100644 --- a/code/game/objects/items/grenades/antigravity.dm +++ b/code/game/objects/items/grenades/antigravity.dm @@ -12,6 +12,6 @@ for(var/turf/T in view(range,src)) T.AddElement(/datum/element/forced_gravity, forced_value) - addtimer(CALLBACK(T, /datum/.proc/RemoveElement, forced_value), duration) + addtimer(CALLBACK(T, /datum/.proc/_RemoveElement, list(forced_value)), duration) qdel(src) diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm index 0222c818e01..fea94ced1c1 100644 --- a/code/game/objects/items/inducer.dm +++ b/code/game/objects/items/inducer.dm @@ -107,6 +107,9 @@ if(istype(A, /obj/item/gun/energy)) to_chat(user, "Error unable to interface with device.") return FALSE + if(istype(A, /obj/item/clothing/suit/space)) + to_chat(user, "Error unable to interface with device.") + return FALSE if(istype(A, /obj)) O = A if(C) @@ -181,3 +184,10 @@ /obj/item/inducer/sci/Initialize() . = ..() update_icon() + +/obj/item/inducer/syndicate + icon_state = "inducer-syndi" + item_state = "inducer-syndi" + desc = "A tool for inductively charging internal power cells. This one has a suspicious colour scheme, and seems to be rigged to transfer charge at a much faster rate." + powertransfer = 2000 + cell_type = /obj/item/stock_parts/cell/super diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 3b40e37ca8f..be7915f67f0 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -376,13 +376,6 @@ title = "Mentoring your Experiments" page_link = "Experimentor" -/obj/item/book/manual/wiki/medical_cloning - name = "Cloning techniques of the 26th century" - icon_state ="bookCloning" - author = "Medical Journal, volume 3" - title = "Cloning techniques of the 26th century" - page_link = "Guide_to_genetics#Cloning" - /obj/item/book/manual/wiki/cooking_to_serve_man name = "To Serve Man" desc = "It's a cookbook!" diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 32f280b385d..77521788db6 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -145,3 +145,62 @@ user.gib() playsound(src, 'sound/items/eatfood.ogg', 50, TRUE, -1) return MANUAL_SUICIDE + +/obj/item/virgin_mary + name = "A picture of the virgin mary" + desc = "A small, cheap icon depicting the virgin mother." + icon = 'icons/obj/blackmarket.dmi' + icon_state = "madonna" + resistance_flags = FLAMMABLE + ///Has this item been used already. + var/used_up = FALSE + ///List of mobs that have already been mobbed. + var/static/list/mob_mobs = list() + + +/obj/item/virgin_mary/attackby(obj/item/W, mob/user, params) + . = ..() + var/ignition_msg = W.ignition_effect(src, user) + if(!ignition_msg) + return + if(resistance_flags & ON_FIRE) + return + user.dropItemToGround(src) + user.visible_message("[user] lights [src] ablaze with [W]!", "You light [src] on fire!") + fire_act() + if(used_up) + return + if(!isliving(user) || !user.mind) //A sentient mob needs to be burning it, ya cheezit. + return + var/mob/living/joe = user + + if(joe in mob_mobs) //Only one nickname fuckhead + to_chat(joe, "You have already been initiated into the mafioso life.") + return + + to_chat(joe, "As you burn the picture, a nickname comes to mind...") + var/nickname = input(joe, "Pick a nickname", "Mafioso Nicknames") as text|null + if(!nickname) + return + var/new_name + var/space_position = findtext(joe.real_name, " ") + if(space_position)//Can we find a space? + new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" + else //Append otherwise + new_name = "[joe.real_name] \"[nickname]\"" + joe.real_name = new_name + used_up = TRUE + mob_mobs += joe + joe.say("My soul will burn like this saint if I betray my familiy. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) + to_chat(joe, "Being inducted into the mafia does not grant antagonist status.") + +/obj/item/virgin_mary/suicide_act(mob/living/user) + user.visible_message("[user] starts saying their Hail Mary's at a terrifying pace! It looks like [user.p_theyre()] trying to enter the afterlife!") + user.say("Hail Mary, full of grace, the Lord is with thee. Blessed are thou amongst women, and blessed is the fruit of thy womb, Jesus. Holy Mary, mother of God, pray for us sinners, now and at the hour of our death. Amen. ", forced = /obj/item/virgin_mary) + addtimer(CALLBACK(src, .proc/manual_suicide, user), 75) + addtimer(CALLBACK(user, /atom/movable/proc/say, "O my Mother, preserve me this day from mortal sin..."), 50) + return MANUAL_SUICIDE + +/obj/item/virgin_mary/proc/manual_suicide(mob/living/user) + user.adjustOxyLoss(200) + user.death(0) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm new file mode 100644 index 00000000000..5e0dbc421a1 --- /dev/null +++ b/code/game/objects/items/puzzle_pieces.dm @@ -0,0 +1,135 @@ +//************** +//*****Keys******************* +//************** ** ** +/obj/item/keycard + name = "security keycard" + desc = "This feels like it belongs to a door." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "keycard" + force = 0 + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + throw_speed = 1 + throw_range = 7 + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/puzzle_id = null + +//Two test keys for use alongside the two test doors. +/obj/item/keycard/cheese + name = "cheese keycard" + desc = "Look, I still don't understand the reference. What the heck is a keyzza?" + color = "#f0da12" + puzzle_id = "cheese" + +/obj/item/keycard/swordfish + name = "titanic keycard" + desc = "Smells like it was at the bottom of a harbor." + color = "#3bbbdb" + puzzle_id = "swordfish" + +//*************** +//*****Doors***** +//*************** + +/obj/machinery/door/keycard + name = "locked door" + desc = "This door only opens when a keycard is swiped. It looks virtually indestructable." + icon = 'icons/obj/doors/doorpuzzle.dmi' + icon_state = "door_closed" + explosion_block = 3 + heat_proof = TRUE + max_integrity = 600 + armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + damage_deflection = 70 + var/puzzle_id = null //Make sure that the key has the same puzzle_id as the keycard door! + +//Standard Expressions to make keycard doors basically un-cheeseable +/obj/machinery/door/keycard/Bumped(atom/movable/AM) + return !density && ..() + +/obj/machinery/door/keycard/emp_act(severity) + return + +/obj/machinery/door/keycard/ex_act(severity, target) + return + +/obj/machinery/door/keycard/try_to_activate_door(mob/user) + add_fingerprint(user) + if(operating) + return + +/obj/machinery/door/keycard/attackby(obj/item/I, mob/user, params) + . = ..() + if(istype(I,/obj/item/keycard)) + var/obj/item/keycard/key = I + if((!puzzle_id || puzzle_id == key.puzzle_id) && density) + to_chat(user, "The door beeps, and slides opens.") + open() + return + else if(puzzle_id != key.puzzle_id) + to_chat(user, "[src] buzzes. This must not be the right key.") + return + else + to_chat(user, "This door doesn't appear to close.") + return + +//Test doors. Gives admins a few doors to use quickly should they so choose. +/obj/machinery/door/keycard/cheese + name = "blue airlock" + desc = "Smells like... pizza?" + puzzle_id = "cheese" + +/obj/machinery/door/keycard/swordfish + name = "blue airlock" + desc = "If nautical nonsense be something you wish." + puzzle_id = "swordfish" + +//************************* +//***Box Pushing Puzzles*** +//************************* +//We're working off a subtype of pressureplates, which should work just a BIT better now. +/obj/structure/holobox + name = "holobox" + desc = "A hard-light box, containing a secure decryption key." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "laserbox" + density = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + +//Uses the pressure_plate settings for a pretty basic custom pattern that waits for a specific item to trigger. Easy enough to retool for mapping purposes or subtypes. +/obj/item/pressure_plate/hologrid + name = "hologrid" + desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on." + icon = 'icons/obj/puzzle_small.dmi' + icon_state = "lasergrid" + anchored = TRUE + trigger_mob = FALSE + trigger_item = TRUE + specific_item = /obj/structure/holobox + removable_signaller = FALSE //Being a pressure plate subtype, this can also use signals. + roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however. + active = TRUE + trigger_delay = 10 + protected = TRUE + resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF + var/reward = /obj/item/reagent_containers/food/snacks/cookie + var/claimed = FALSE + +/obj/item/pressure_plate/hologrid/examine(mob/user) + . = ..() + if(claimed) + . += "This one appears to be spent already." + +/obj/item/pressure_plate/hologrid/trigger() + reward = new reward(loc) + flick("lasergrid_a",src) + icon_state = "lasergrid_full" + +/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM) + . = ..() + if(trigger_item && istype(AM, specific_item) && !claimed) + claimed = TRUE + flick("laserbox_burn", AM) + sleep(15) + qdel(AM) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 9a71ffe16fe..99d8eb402dc 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -12,6 +12,7 @@ var/blink_range = 8 // The teleport range when crushed/thrown at someone. refined_type = /obj/item/stack/sheet/bluespace_crystal grind_results = list(/datum/reagent/bluespace = 20) + scan_state = "rock_BScrystal" /obj/item/stack/ore/bluespace_crystal/refined name = "refined bluespace crystal" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 10ff8274e4f..245f734784e 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -160,6 +160,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2), \ new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), \ + new/datum/stack_recipe("saddle", /obj/item/saddle, 5), \ )) /obj/item/stack/sheet/leather/get_main_recipes() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 832a63fac8c..aa21eb24460 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -52,7 +52,7 @@ mats_per_unit = list() var/in_process_mat_list = custom_materials.Copy() for(var/i in custom_materials) - mats_per_unit[getmaterialref(i)] = in_process_mat_list[i] + mats_per_unit[SSmaterials.GetMaterialRef(i)] = in_process_mat_list[i] custom_materials[i] *= amount . = ..() if(merge) @@ -62,7 +62,7 @@ var/list/temp_recipes = get_main_recipes() recipes = temp_recipes.Copy() if(material_type) - var/datum/material/M = getmaterialref(material_type) //First/main material + var/datum/material/M = SSmaterials.GetMaterialRef(material_type) //First/main material for(var/i in M.categories) switch(i) if(MAT_CATEGORY_RIGID) @@ -236,7 +236,7 @@ if(R.applies_mats && custom_materials && custom_materials.len) var/list/used_materials = list() for(var/i in custom_materials) - used_materials[getmaterialref(i)] = R.req_amount / R.res_amount * (MINERAL_MATERIAL_AMOUNT / custom_materials.len) + used_materials[SSmaterials.GetMaterialRef(i)] = R.req_amount / R.res_amount * (MINERAL_MATERIAL_AMOUNT / custom_materials.len) O.set_custom_materials(used_materials) //START: oh fuck i'm so sorry diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index d1aafe990ab..d7fb0893305 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -508,16 +508,15 @@ for(var/i in 1 to 9) new /obj/item/ammo_box/magazine/smgm45(src) -/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech desc = "A large duffel bag, packed to the brim with various exosuit ammo." -/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax/PopulateContents() - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/incendiary(src) - new /obj/item/mecha_ammo/flashbang(src) - new /obj/item/mecha_ammo/flashbang(src) - new /obj/item/mecha_ammo/flashbang(src) +/obj/item/storage/backpack/duffelbag/syndie/ammo/mech/PopulateContents() + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/mecha_ammo/scattershot(src) + new /obj/item/storage/belt/utility/syndicate(src) /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler desc = "A large duffel bag, packed to the brim with various exosuit ammo." diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 618c33c9f87..1b8d9ce464a 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -111,6 +111,15 @@ new /obj/item/t_scanner(src) new /obj/item/extinguisher/mini(src) +/obj/item/storage/belt/utility/syndicate/PopulateContents() + new /obj/item/screwdriver/nuke(src) + new /obj/item/wrench/combat(src) + new /obj/item/weldingtool/largetank(src) + new /obj/item/crowbar(src) + new /obj/item/wirecutters(src) + new /obj/item/multitool(src) + new /obj/item/inducer/syndicate(src) + /obj/item/storage/belt/medical name = "medical belt" desc = "Can hold various medical equipment." @@ -288,7 +297,8 @@ /obj/item/organ/regenerative_core, /obj/item/wormhole_jaunter, /obj/item/storage/bag/plants, - /obj/item/stack/marker_beacon + /obj/item/stack/marker_beacon, + /obj/item/key/lasso )) @@ -528,7 +538,8 @@ /obj/item/clothing/gloves, /obj/item/melee/flyswatter, /obj/item/assembly/mousetrap, - /obj/item/paint/paint_remover + /obj/item/paint/paint_remover, + /obj/item/twohanded/broom )) /obj/item/storage/belt/janitor/full/PopulateContents() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index e9d2f017d23..93cac7e6b45 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -258,6 +258,7 @@ /obj/item/storage/box/medigels name = "box of medical gels" desc = "A box full of medical gel applicators, with unscrewable caps and precision spray heads." + illustration = "medgel" /obj/item/storage/box/medigels/PopulateContents() for(var/i in 1 to 7) @@ -266,6 +267,7 @@ /obj/item/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors, it seems." + illustration = "dna" /obj/item/storage/box/injectors/PopulateContents() var/static/items_inside = list( @@ -287,7 +289,7 @@ name = "box of flashbulbs" desc = "WARNING: Flashes can cause serious eye damage, protective eyewear is required." icon_state = "secbox" - illustration = "flashbang" + illustration = "flash" /obj/item/storage/box/flashes/PopulateContents() for(var/i in 1 to 6) @@ -296,7 +298,8 @@ /obj/item/storage/box/wall_flash name = "wall-mounted flash kit" desc = "This box contains everything necessary to build a wall-mounted flash. WARNING: Flashes can cause serious eye damage, protective eyewear is required." - illustration = "flashbang" + icon_state = "secbox" + illustration = "flash" /obj/item/storage/box/wall_flash/PopulateContents() var/id = rand(1000, 9999) @@ -315,7 +318,8 @@ /obj/item/storage/box/teargas name = "box of tear gas grenades (WARNING)" desc = "WARNING: These devices are extremely dangerous and can cause blindness and skin irritation." - illustration = "flashbang" + icon_state = "secbox" + illustration = "grenade" /obj/item/storage/box/teargas/PopulateContents() for(var/i in 1 to 7) @@ -324,7 +328,7 @@ /obj/item/storage/box/emps name = "box of emp grenades" desc = "A box with 5 emp grenades." - illustration = "flashbang" + illustration = "emp" /obj/item/storage/box/emps/PopulateContents() for(var/i in 1 to 5) @@ -333,6 +337,7 @@ /obj/item/storage/box/trackimp name = "boxed tracking implant kit" desc = "Box full of scum-bag tracking utensils." + icon_state = "secbox" illustration = "implant" /obj/item/storage/box/trackimp/PopulateContents() @@ -401,6 +406,7 @@ /obj/item/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." + illustration = "drinkglass" /obj/item/storage/box/drinkingglasses/PopulateContents() for(var/i in 1 to 6) @@ -409,6 +415,7 @@ /obj/item/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." + illustration = "condiment" /obj/item/storage/box/condimentbottles/PopulateContents() for(var/i in 1 to 6) @@ -417,6 +424,7 @@ /obj/item/storage/box/cups name = "box of paper cups" desc = "It has pictures of paper cups on the front." + illustration = "cup" /obj/item/storage/box/cups/PopulateContents() for(var/i in 1 to 7) @@ -547,6 +555,7 @@ /obj/item/storage/box/prisoner name = "box of prisoner IDs" desc = "Take away their last shred of dignity, their name." + icon_state = "secbox" illustration = "id" /obj/item/storage/box/prisoner/PopulateContents() @@ -562,6 +571,7 @@ /obj/item/storage/box/seccarts name = "box of PDA security cartridges" desc = "A box full of PDA cartridges used by Security." + icon_state = "secbox" illustration = "pda" /obj/item/storage/box/seccarts/PopulateContents() @@ -572,7 +582,8 @@ /obj/item/storage/box/firingpins name = "box of standard firing pins" desc = "A box full of standard firing pins, to allow newly-developed firearms to operate." - illustration = "id" + icon_state = "secbox" + illustration = "firingpin" /obj/item/storage/box/firingpins/PopulateContents() for(var/i in 1 to 5) @@ -581,7 +592,7 @@ /obj/item/storage/box/firingpins/paywall name = "box of paywall firing pins" desc = "A box full of paywall firing pins, to allow newly-developed firearms to operate behind a custom-set paywall." - illustration = "id" + illustration = "firingpin" /obj/item/storage/box/firingpins/paywall/PopulateContents() for(var/i in 1 to 5) @@ -590,7 +601,7 @@ /obj/item/storage/box/lasertagpins name = "box of laser tag firing pins" desc = "A box full of laser tag firing pins, to allow newly-developed firearms to require wearing brightly coloured plastic armor before being able to be used." - illustration = "id" + illustration = "firingpin" /obj/item/storage/box/lasertagpins/PopulateContents() for(var/i in 1 to 3) @@ -631,6 +642,7 @@ name = "boxed space suit and helmet" desc = "A sleek, sturdy box used to hold replica spacesuits." icon_state = "syndiebox" + illustration = "syndiesuit" /obj/item/storage/box/fakesyndiesuit/PopulateContents() new /obj/item/clothing/head/syndicatefake(src) @@ -738,6 +750,8 @@ /obj/item/storage/box/deputy name = "box of deputy armbands" desc = "To be issued to those authorized to act as deputy of security." + icon_state = "secbox" + illustration = "depband" /obj/item/storage/box/deputy/PopulateContents() for(var/i in 1 to 7) @@ -746,7 +760,7 @@ /obj/item/storage/box/metalfoam name = "box of metal foam grenades" desc = "To be used to rapidly seal hull breaches." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/metalfoam/PopulateContents() for(var/i in 1 to 7) @@ -755,7 +769,7 @@ /obj/item/storage/box/smart_metal_foam name = "box of smart metal foam grenades" desc = "Used to rapidly seal hull breaches. This variety conforms to the walls of its area." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/smart_metal_foam/PopulateContents() for(var/i in 1 to 7) @@ -838,7 +852,7 @@ /obj/item/storage/box/beanbag name = "box of beanbags" desc = "A box full of beanbag shells." - icon_state = "rubbershot_box" + illustration = "rubbershot_box" illustration = null /obj/item/storage/box/beanbag/PopulateContents() @@ -866,6 +880,7 @@ desc = "A sack neatly crafted out of paper." icon_state = "paperbag_None" item_state = "paperbag_None" + illustration = null resistance_flags = FLAMMABLE foldable = null var/design = NODESIGN @@ -1068,6 +1083,7 @@ /obj/item/storage/box/emptysandbags name = "box of empty sandbags" + illustration = "sandbag" /obj/item/storage/box/emptysandbags/PopulateContents() for(var/i in 1 to 7) @@ -1076,6 +1092,7 @@ /obj/item/storage/box/rndboards name = "\proper the liberator's legacy" desc = "A box containing a gift for worthy golems." + illustration = "scicircuit" /obj/item/storage/box/rndboards/PopulateContents() new /obj/item/circuitboard/machine/protolathe(src) @@ -1086,6 +1103,7 @@ /obj/item/storage/box/silver_sulf name = "box of silver sulfadiazine patches" desc = "Contains patches used to treat burns." + illustration = "firepatch" /obj/item/storage/box/silver_sulf/PopulateContents() for(var/i in 1 to 7) @@ -1093,6 +1111,7 @@ /obj/item/storage/box/fountainpens name = "box of fountain pens" + illustration = "fpen" /obj/item/storage/box/fountainpens/PopulateContents() for(var/i in 1 to 7) @@ -1101,7 +1120,7 @@ /obj/item/storage/box/holy_grenades name = "box of holy hand grenades" desc = "Contains several grenades used to rapidly purge heresy." - illustration = "flashbang" + illustration = "grenade" /obj/item/storage/box/holy_grenades/PopulateContents() for(var/i in 1 to 7) @@ -1214,7 +1233,7 @@ /obj/item/storage/box/fireworks name = "box of fireworks" desc = "Contains an assortment of fireworks." - illustration = "flashbang" + illustration = "sparkler" /obj/item/storage/box/fireworks/PopulateContents() for(var/i in 1 to 3) @@ -1237,6 +1256,7 @@ name = "box of firecrackers" desc = "A box filled with illegal firecracker. You wonder who still makes these." icon_state = "syndiebox" + illustration = "firecracker" /obj/item/storage/box/firecrackers/PopulateContents() for(var/i in 1 to 7) @@ -1245,6 +1265,7 @@ /obj/item/storage/box/sparklers name = "box of sparklers" desc = "A box of NT brand sparklers, burns hot even in the cold of space-winter." + illustration = "sparkler" /obj/item/storage/box/sparklers/PopulateContents() for(var/i in 1 to 7) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 11ae3a223a4..f76f2725173 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -460,6 +460,7 @@ new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/neck/chameleon(src) new /obj/item/storage/backpack/chameleon(src) + new /obj/item/storage/belt/chameleon(src) new /obj/item/radio/headset/chameleon(src) new /obj/item/stamp/chameleon(src) new /obj/item/pda/chameleon(src) @@ -515,6 +516,7 @@ new /obj/item/clothing/mask/chameleon/broken(src) new /obj/item/clothing/neck/chameleon/broken(src) new /obj/item/storage/backpack/chameleon/broken(src) + new /obj/item/storage/belt/chameleon/broken(src) new /obj/item/radio/headset/chameleon/broken(src) new /obj/item/stamp/chameleon/broken(src) new /obj/item/pda/chameleon/broken(src) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 00ca681430b..fa395e32a98 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -1,34 +1,52 @@ /obj/item/melee/baton name = "stun baton" desc = "A stun baton for incapacitating people with." + icon_state = "stunbaton" item_state = "baton" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - slot_flags = ITEM_SLOT_BELT + force = 10 - throwforce = 7 - w_class = WEIGHT_CLASS_NORMAL attack_verb = list("beaten") + + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BELT armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) - var/cooldown_check = 0 + throwforce = 7 + var/throw_stun_chance = 35 - var/cooldown = (2.5 SECONDS) - var/stunforce = (5 SECONDS) - var/turned_on = FALSE var/obj/item/stock_parts/cell/cell - var/hitcost = 1000 - var/throw_hit_chance = 35 var/preload_cell_type //if not empty the baton starts with this type of cell - var/convertable = TRUE //if it can converted with a conversion kit + var/cell_hit_cost = 1000 + var/can_remove_cell = TRUE + + var/turned_on = FALSE + var/activate_sound = "sparks" + + var/attack_cooldown_check = 0 SECONDS + var/attack_cooldown = 2.5 SECONDS + var/stun_sound = 'sound/weapons/egloves.ogg' + + var/confusion_amt = 10 + var/stamina_loss_amt = 60 + var/apply_stun_delay = 2 SECONDS + var/stun_time = 5 SECONDS + + var/convertible = TRUE //if it can be converted with a conversion kit /obj/item/melee/baton/get_cell() return cell /obj/item/melee/baton/suicide_act(mob/user) - user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!") - return (FIRELOSS) + if(cell && cell.charge && turned_on) + user.visible_message("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!") + . = (FIRELOSS) + attack(user,user) + else + user.visible_message("[user] is shoving the [name] down their throat! It looks like [user.p_theyre()] trying to commit suicide!") + . = (OXYLOSS) /obj/item/melee/baton/Initialize() . = ..() @@ -48,7 +66,7 @@ return ..() /obj/item/melee/baton/proc/convert(datum/source, obj/item/I, mob/user) - if(istype(I,/obj/item/conversion_kit) && convertable) + if(istype(I,/obj/item/conversion_kit) && convertible) var/turf/T = get_turf(src) var/obj/item/melee/classic_baton/B = new /obj/item/melee/classic_baton (T) B.alpha = 20 @@ -68,7 +86,7 @@ /obj/item/melee/baton/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) ..() //Only mob/living types have stun handling - if(turned_on && prob(throw_hit_chance) && iscarbon(hit_atom)) + if(turned_on && prob(throw_stun_chance) && iscarbon(hit_atom)) baton_effect(hit_atom) /obj/item/melee/baton/loaded //this one starts with a cell pre-installed. @@ -79,11 +97,11 @@ //Note this value returned is significant, as it will determine //if a stun is applied or not . = cell.use(chrgdeductamt) - if(turned_on && cell.charge < hitcost) + if(turned_on && cell.charge < cell_hit_cost) //we're below minimum, turn off turned_on = FALSE update_icon() - playsound(src, "sparks", 75, TRUE, -1) + playsound(src, activate_sound, 75, TRUE, -1) /obj/item/melee/baton/update_icon_state() @@ -107,7 +125,7 @@ if(cell) to_chat(user, "[src] already has a cell!") else - if(C.maxcharge < hitcost) + if(C.maxcharge < cell_hit_cost) to_chat(user, "[src] requires a higher capacity cell.") return if(!user.transferItemToLoc(W, src)) @@ -117,21 +135,27 @@ update_icon() else if(W.tool_behaviour == TOOL_SCREWDRIVER) - if(cell) - cell.update_icon() - cell.forceMove(get_turf(src)) - cell = null - to_chat(user, "You remove the cell from [src].") - turned_on = FALSE - update_icon() + tryremovecell(user) else return ..() +/obj/item/melee/baton/proc/tryremovecell(mob/user) + if(cell && can_remove_cell) + cell.update_icon() + cell.forceMove(get_turf(src)) + cell = null + to_chat(user, "You remove the cell from [src].") + turned_on = FALSE + update_icon() + /obj/item/melee/baton/attack_self(mob/user) - if(cell && cell.charge > hitcost) + toggle_on(user) + +/obj/item/melee/baton/proc/toggle_on(mob/user) + if(cell && cell.charge > cell_hit_cost) turned_on = !turned_on to_chat(user, "[src] is now [turned_on ? "on" : "off"].") - playsound(src, "sparks", 75, TRUE, -1) + playsound(src, activate_sound, 75, TRUE, -1) else turned_on = FALSE if(!cell) @@ -141,14 +165,18 @@ update_icon() add_fingerprint(user) -/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) +/obj/item/melee/baton/proc/clumsy_check(mob/living/carbon/human/user) if(turned_on && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + playsound(src, stun_sound, 75, TRUE, -1) user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \ "You accidentally hit yourself with [src]!") - user.Knockdown(stunforce*3) - deductcharge(hitcost) + user.Knockdown(stun_time*3) + deductcharge(cell_hit_cost) return +/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) + clumsy_check(user) + if(iscyborg(M)) ..() return @@ -161,7 +189,7 @@ if(user.a_intent != INTENT_HARM) if(turned_on) - if(cooldown_check <= world.time) + if(attack_cooldown_check <= world.time) if(baton_effect(M, user)) user.do_attack_animation(M) return @@ -172,34 +200,30 @@ "[user] has prodded you with [src]. Luckily it was off") else if(turned_on) - if(cooldown_check <= world.time) + if(attack_cooldown_check <= world.time) baton_effect(M, user) ..() /obj/item/melee/baton/proc/baton_effect(mob/living/L, mob/user) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that - playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE) - return FALSE + check_shields(L, user) if(iscyborg(loc)) var/mob/living/silicon/robot/R = loc - if(!R || !R.cell || !R.cell.use(hitcost)) + if(!R || !R.cell || !R.cell.use(cell_hit_cost)) return FALSE else - if(!deductcharge(hitcost)) + if(!deductcharge(cell_hit_cost)) return FALSE /// After a target is hit, we do a chunk of stamina damage, along with other effects. /// After a period of time, we then check to see what stun duration we give. L.Jitter(20) - L.confused = max(10, L.confused) + L.confused = max(confusion_amt, L.confused) L.stuttering = max(8, L.stuttering) - L.adjustStaminaLoss(60) + L.adjustStaminaLoss(stamina_loss_amt) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) - addtimer(CALLBACK(src, .proc/apply_stun_effect_end, L), 2 SECONDS) + addtimer(CALLBACK(src, .proc/apply_stun_effect_end, L), apply_stun_delay) if(user) L.lastattacker = user.real_name @@ -208,13 +232,13 @@ "[user] has stunned you with [src]!") log_combat(user, L, "stunned") - playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) + playsound(src, stun_sound, 50, TRUE, -1) if(ishuman(L)) var/mob/living/carbon/human/H = L H.forcesay(GLOB.hit_appends) - cooldown_check = world.time + cooldown + attack_cooldown_check = world.time + attack_cooldown return 1 @@ -222,17 +246,24 @@ /obj/item/melee/baton/proc/apply_stun_effect_end(mob/living/target) var/trait_check = HAS_TRAIT(target, TRAIT_STUNRESISTANCE) //var since we check it in out to_chat as well as determine stun duration if(trait_check) - target.Knockdown(stunforce * 0.1) + target.Knockdown(stun_time * 0.1) else - target.Knockdown(stunforce) + target.Knockdown(stun_time) if(!target.IsKnockdown()) - to_chat(target, "You muscles seize, making you collapse[trait_check ? ", but your body quickly recovers..." : "!"]") + to_chat(target, "Your muscles seize, making you collapse[trait_check ? ", but your body quickly recovers..." : "!"]") /obj/item/melee/baton/emp_act(severity) . = ..() if (!(. & EMP_PROTECT_SELF)) deductcharge(1000 / severity) +/obj/item/melee/baton/proc/check_shields(mob/living/L, mob/user) + if(ishuman(L)) + var/mob/living/carbon/human/H = L + if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE) + return FALSE + //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/cattleprod name = "stunprod" @@ -244,11 +275,11 @@ w_class = WEIGHT_CLASS_BULKY force = 3 throwforce = 5 - stunforce = (5 SECONDS) - hitcost = 2000 - throw_hit_chance = 10 + stun_time = 5 SECONDS + cell_hit_cost = 2000 + throw_stun_chance = 10 slot_flags = ITEM_SLOT_BACK - convertable = FALSE + convertible = FALSE var/obj/item/assembly/igniter/sparkler = 0 /obj/item/melee/baton/cattleprod/Initialize() @@ -273,9 +304,9 @@ force = 5 throwforce = 5 throw_range = 5 - hitcost = 2000 - throw_hit_chance = 99 //Have you prayed today? - convertable = FALSE + cell_hit_cost = 2000 + throw_stun_chance = 99 //Have you prayed today? + convertible = FALSE custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) /obj/item/melee/baton/boomerang/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE) @@ -288,7 +319,7 @@ /obj/item/melee/baton/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(turned_on) var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) - if(ishuman(hit_atom) && !caught && prob(throw_hit_chance))//if they are a carbon and they didn't catch it + if(ishuman(hit_atom) && !caught && prob(throw_stun_chance))//if they are a carbon and they didn't catch it baton_effect(hit_atom) if(thrownby && !caught) sleep(1) diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index e1edbf36983..45ec9dc6df4 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -13,12 +13,12 @@ "You accidentally hit yourself with [src]!") if(do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE))//honk honk SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.Paralyze(stunforce*3) - deductcharge(hitcost) + user.Paralyze(stun_time*3) + deductcharge(cell_hit_cost) else SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.Paralyze(stunforce*3) - deductcharge(hitcost/4) + user.Paralyze(stun_time*3) + deductcharge(cell_hit_cost/4) return else if(turned_on) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index d5962a74570..62b49d8d887 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -126,10 +126,10 @@ . = ..() if(!proximity) return - + if(isOn()) handle_fuel_and_temps(1, user) - + if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist var/mob/living/L = O if(L.IgniteMob()) @@ -145,10 +145,10 @@ . = ..() if(!proximity) return - + if(isOn()) handle_fuel_and_temps(1, user) - + if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist var/mob/living/L = O if(L.IgniteMob()) @@ -281,10 +281,10 @@ status = !status if(status) to_chat(user, "You resecure [src] and close the fuel tank.") - DISABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags &= ~(OPENCONTAINER) else to_chat(user, "[src] can now be attached, modified, and refuelled.") - ENABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags |= OPENCONTAINER add_fingerprint(user) /obj/item/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 800bdf9ea0d..8438c799d00 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -74,3 +74,46 @@ icon = 'icons/obj/items_cyborg.dmi' icon_state = "wrench_cyborg" toolspeed = 0.5 + +/obj/item/wrench/combat + name = "combat wrench" + desc = "It's like a normal wrench but edgier. Can be found on the battlefield." + icon_state = "wrench_combat" + item_state = "wrench_combat" + attack_verb = list("devastated", "brutalized", "committed a war crime against", "obliterated", "humiliated") + tool_behaviour = null + toolspeed = null + var/on = FALSE + +/obj/item/wrench/combat/ComponentInitialize() + . = ..() + AddElement(/datum/element/update_icon_updates_onmob) + +/obj/item/wrench/combat/attack_self(mob/living/user) + if(on) + on = FALSE + force = initial(force) + w_class = initial(w_class) + throwforce = initial(throwforce) + tool_behaviour = initial(tool_behaviour) + toolspeed = initial(toolspeed) + playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE) + to_chat(user, "[src] can now be kept at bay.") + else + on = TRUE + force = 6 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 8 + tool_behaviour = TOOL_WRENCH + toolspeed = 1 + playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE) + to_chat(user, "[src] is now active. Woe onto your enemies!") + update_icon() + +/obj/item/wrench/combat/update_icon_state() + if(on) + icon_state = "[initial(icon_state)]_on" + item_state = "[initial(item_state)]1" + else + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 060ceda6b6d..f370143e489 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -22,6 +22,8 @@ * Snowballs * Clockwork Watches * Toy Daggers + * Squeaky Brain + * Broken Radio */ @@ -1489,3 +1491,34 @@ icon_state = "shell[rand(1,3)]" color = pickweight(possible_colors) setDir(pick(GLOB.cardinals)) + +/obj/item/toy/brokenradio + name = "broken radio" + desc = "An old radio that produces nothing but static when turned on." + icon = 'icons/obj/toy.dmi' + icon_state = "broken_radio" + w_class = WEIGHT_CLASS_SMALL + var/cooldown = 0 + +/obj/item/toy/brokenradio/attack_self(mob/user) + if(cooldown <= world.time) + cooldown = (world.time + 300) + user.visible_message("[user] adjusts the dial on [src].") + sleep(5) + playsound(src, 'sound/items/radiostatic.ogg', 50, FALSE) + else + to_chat(user, "The dial on [src] jams up") + return + +/obj/item/toy/braintoy + name = "squeaky brain" + desc = "A Mr. Monstrous brand toy made to imitate a human brain in smell and texture." + icon = 'icons/obj/surgery.dmi' + icon_state = "brain-old" + var/cooldown = 0 + +/obj/item/toy/braintoy/attack_self(mob/user) + if(cooldown <= world.time) + cooldown = (world.time + 10) + sleep(5) + playsound(src, 'sound/effects/blobattack.ogg', 50, FALSE) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index a3267218453..8ecefff8186 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -487,15 +487,17 @@ name = "explosive lance" var/obj/item/grenade/explosive = null -/obj/item/twohanded/spear/explosive/Initialize(mapload, obj/item/grenade/G) +/obj/item/twohanded/spear/explosive/Initialize(mapload) . = ..() - if (!G) - G = new /obj/item/grenade/iedcasing() //For admin-spawned explosive lances + set_explosive(new /obj/item/grenade/iedcasing()) //For admin-spawned explosive lances + + +/obj/item/twohanded/spear/explosive/proc/set_explosive(obj/item/grenade/G) + if(explosive) + QDEL_NULL(explosive) G.forceMove(src) explosive = G desc = "A makeshift spear with [G] attached to it" - update_icon() - /obj/item/twohanded/spear/explosive/CheckParts(list/parts_list) var/obj/item/grenade/G = locate() in parts_list @@ -507,7 +509,7 @@ icon_prefix = lancePart.icon_prefix parts_list -= G parts_list -= lancePart - Initialize(src.loc, G) + set_explosive(G) qdel(lancePart) ..() @@ -850,3 +852,66 @@ C.change_view(CONFIG_GET(string/default_view)) user.client.pixel_x = 0 user.client.pixel_y = 0 + +/obj/item/twohanded/broom + name = "broom" + desc = "This is my BROOMSTICK! It can be used manually or braced with two hands to sweep items as you move. It has a telescopic handle for compact storage." + icon = 'icons/obj/janitor.dmi' + icon_state = "broom0" + lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' + force = 8 + throwforce = 10 + throw_speed = 3 + throw_range = 7 + w_class = WEIGHT_CLASS_NORMAL + force_unwielded = 8 + force_wielded = 12 + attack_verb = list("swept", "brushed off", "bludgeoned", "whacked") + resistance_flags = FLAMMABLE + +/obj/item/twohanded/broom/update_icon_state() + icon_state = "broom[wielded]" + +/obj/item/twohanded/broom/wield(mob/user) + . = ..() + if(!wielded) + return + to_chat(user, "You brace the [src] against the ground in a firm sweeping stance.") + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/sweep) + +/obj/item/twohanded/broom/unwield(mob/user) + . = ..() + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + +/obj/item/twohanded/broom/afterattack(atom/A, mob/user, proximity) + . = ..() + if(!proximity) + return + sweep(user, A, FALSE) + +/obj/item/twohanded/broom/proc/sweep(mob/user, atom/A, moving = TRUE) + var/turf/target + if (!moving) + if (isturf(A)) + target = A + else + target = A.loc + else + target = user.loc + if (locate(/obj/structure/table) in target.contents) + return + var/i = 0 + for(var/obj/item/garbage in target.contents) + if(!garbage.anchored) + garbage.Move(get_step(target, user.dir), user.dir) + i++ + if(i >= 20) + break + if(i >= 1) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 30, TRUE, -1) + +/obj/item/twohanded/broom/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) //bless you whoever fixes this copypasta + J.put_in_cart(src, user) + J.mybroom=src + J.update_icon() diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 1fb84915e4e..f92a60af330 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -475,7 +475,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/statuebust/Initialize() . = ..() AddComponent(/datum/component/art, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 1000), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 1000)), 0) /obj/item/statuebust/hippocratic name = "hippocrates bust" @@ -519,7 +519,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 var/board_item_type = /obj/vehicle/ridden/scooter/skateboard /obj/item/melee/skateboard/attack_self(mob/user) - new board_item_type(get_turf(user)) + var/obj/vehicle/ridden/scooter/skateboard/S = new board_item_type(get_turf(user))//this probably has fucky interactions with telekinesis but for the record it wasnt my fault + S.buckle_mob(user) qdel(src) /obj/item/melee/skateboard/pro @@ -632,7 +633,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/cockroach, + /mob/living/simple_animal/hostile/cockroach, /obj/item/queen_bee )) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 396a034379f..eebcb395b61 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -108,11 +108,11 @@ /obj/attack_animal(mob/living/simple_animal/M) if(!M.melee_damage_upper && !M.obj_damage) M.emote("custom", message = "[M.friendly_verb_continuous] [src].") - return 0 + return FALSE else - var/play_soundeffect = 1 + var/play_soundeffect = TRUE if(M.environment_smash) - play_soundeffect = 0 + play_soundeffect = FALSE if(M.obj_damage) . = attack_generic(M, M.obj_damage, M.melee_damage_type, "melee", play_soundeffect, M.armour_penetration) else diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 8bec5d3c4c5..916cbe061b1 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -314,7 +314,7 @@ if(remaining_mats) for(var/M=1 to remaining_mats) new stack_type(get_turf(loc)) - else if(custom_materials[getmaterialref(/datum/material/iron)]) + else if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]) new /obj/item/stack/rods(get_turf(loc), 2) qdel(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 6f39b907f0c..81e31dc49b1 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -214,7 +214,7 @@ to_chat(user, "You start adding [G] to [src]...") if(do_after(user, 20, target = src)) G.use(10) - var/obj/structure/displaycase/display = new(src.loc) + var/obj/structure/displaycase/noalert/display = new(src.loc) if(electronics) electronics.forceMove(display) display.electronics = electronics @@ -226,12 +226,10 @@ else return ..() -//The captains display case requiring specops ID access is intentional. -//The lab cage and captains display case do not spawn with electronics, which is why req_access is needed. +//The lab cage and captain's display case do not spawn with electronics, which is why req_access is needed. /obj/structure/displaycase/captain - alert = TRUE start_showpiece_type = /obj/item/gun/energy/laser/captain - req_access = list(ACCESS_CENT_SPECOPS) + req_access = list(ACCESS_CENT_SPECOPS) //this was intentional, presumably to make it slightly harder for caps to grab their gun roundstart /obj/structure/displaycase/labcage name = "lab cage" @@ -239,14 +237,15 @@ start_showpiece_type = /obj/item/clothing/mask/facehugger/lamarr req_access = list(ACCESS_RD) +/obj/structure/displaycase/noalert + alert = FALSE + /obj/structure/displaycase/trophy name = "trophy display case" desc = "Store your trophies of accomplishment in here, and they will stay forever." var/placer_key = "" var/added_roundstart = TRUE var/is_locked = TRUE - - alert = TRUE integrity_failure = 0 openable = FALSE diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e6da6eaf8a0..5f18b4478b9 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -316,7 +316,7 @@ /obj/item/twohanded/required/kirbyplants/Initialize() . = ..() AddComponent(/datum/component/tactical) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, 500), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, 500)), 0) /obj/item/twohanded/required/kirbyplants/random icon = 'icons/obj/flora/_flora.dmi' diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index f823f59f8f5..3f9acdb7ae6 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -178,19 +178,6 @@ density = TRUE deconstructible = FALSE -/obj/structure/fluff/railing - name = "railing" - desc = "Basic railing meant to protect idiots like you from falling." - icon = 'icons/obj/fluff.dmi' - icon_state = "railing" - density = TRUE - anchored = TRUE - deconstructible = FALSE - -/obj/structure/fluff/railing/corner - icon_state = "railing_corner" - density = FALSE - /obj/structure/fluff/beach_towel name = "beach towel" desc = "A towel decorated in various beach-themed designs." diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 26006d1cb7f..bf527d70be6 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -7,10 +7,11 @@ density = TRUE //copypaste sorry var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite - var/obj/item/storage/bag/trash/mybag = null - var/obj/item/mop/mymop = null - var/obj/item/reagent_containers/spray/cleaner/myspray = null - var/obj/item/lightreplacer/myreplacer = null + var/obj/item/storage/bag/trash/mybag + var/obj/item/mop/mymop + var/obj/item/twohanded/broom/mybroom + var/obj/item/reagent_containers/spray/cleaner/myspray + var/obj/item/lightreplacer/myreplacer var/signs = 0 var/const/max_signs = 4 @@ -50,7 +51,12 @@ m.janicart_insert(user, src) else to_chat(user, fail_msg) - + else if(istype(I, /obj/item/twohanded/broom)) + if(!mybroom) + var/obj/item/twohanded/broom/b=I + b.janicart_insert(user,src) + else + to_chat(user, fail_msg) else if(istype(I, /obj/item/storage/bag/trash)) if(!mybag) var/obj/item/storage/bag/trash/t=I @@ -98,6 +104,8 @@ dat += "[mybag.name]
" if(mymop) dat += "[mymop.name]
" + if(mybroom) + dat += "[mybroom.name]
" if(myspray) dat += "[myspray.name]
" if(myreplacer) @@ -125,6 +133,11 @@ user.put_in_hands(mymop) to_chat(user, "You take [mymop] from [src].") mymop = null + if(href_list["broom"]) + if(mybroom) + user.put_in_hands(mybroom) + to_chat(user, "You take [mybroom] from [src].") + mybroom = null if(href_list["spray"]) if(myspray) user.put_in_hands(myspray) @@ -156,6 +169,8 @@ . += "cart_garbage" if(mymop) . += "cart_mop" + if(mybroom) + . += "cart_broom" if(myspray) . += "cart_spray" if(myreplacer) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index 350a560c85b..22c32986b01 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -27,8 +27,8 @@ add_overlay(I) /obj/structure/geyser/process() - if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive and should be avoided in continous - reagents.add_reagent(reagent_id, potency) //processes + if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive + reagents.add_reagent(reagent_id, potency) /obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) if(!_reinforced) @@ -39,12 +39,12 @@ return to_chat(user, "You start vigorously plunging [src]!") - if(do_after(user, 50*P.plunge_mod, target = src) && !activated) + if(do_after(user, 50 * P.plunge_mod, target = src) && !activated) start_chemming() /obj/structure/geyser/random erupting_state = null - var/list/options = list(/datum/reagent/fuel/oil = 2, /datum/reagent/clf3 = 1) //fucking add more + var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) /obj/structure/geyser/random/Initialize() . = ..() @@ -72,3 +72,5 @@ reinforced = TRUE plunge_mod = 0.8 + + custom_premium_price = 1200 diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 27124c24671..bc1e54686c5 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -189,17 +189,17 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an for(var/mob/living/M in compiled) var/mob/living/mob_occupant = get_mob_or_brainmob(M) if(mob_occupant.client && !mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) && !mob_occupant.hellbound) - icon_state = "morgue4" // Cloneable + icon_state = "morgue4" // Revivable if(mob_occupant.stat == DEAD && beeper) if(world.time > next_beep) - playsound(src, 'sound/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Clone them you blind fucks + playsound(src, 'sound/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Revive them you blind fucks next_beep = world.time + beep_cooldown break /obj/item/paper/guides/jobs/medical/morgue name = "morgue memo" - info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.

Red lights mean there's a plain ol' dead body inside.

Yellow lights mean there's non-body objects inside.
Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.

Green lights mean the morgue system detects the body may be able to be cloned.

I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.

- CentCom medical inspector" + info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.

Red lights mean there's a plain ol' dead body inside.

Yellow lights mean there's non-body objects inside.
Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.

Green lights mean the morgue system detects the body may be able to be brought back to life.

I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.

- CentCom medical inspector" /* * Crematorium diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index fa49049e603..83e368b13a2 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -16,15 +16,17 @@ var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension + var/instrumentRange = 15 // how far the sound can be heard var/obj/instrumentObj = null // the associated obj playing the sound var/last_hearcheck = 0 var/list/hearing_mobs -/datum/song/New(dir, obj, ext = "ogg") +/datum/song/New(dir, obj, ext = "ogg", range) tempo = sanitize_tempo(tempo) instrumentDir = dir instrumentObj = obj instrumentExt = ext + instrumentRange = range /datum/song/Destroy() instrumentObj = null @@ -66,7 +68,7 @@ var/turf/source = get_turf(instrumentObj) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) LAZYCLEARLIST(hearing_mobs) - for(var/mob/M in get_hearers_in_view(15, source)) + for(var/mob/M in get_hearers_in_view(instrumentRange, source)) LAZYADD(hearing_mobs, M) last_hearcheck = world.time @@ -104,8 +106,7 @@ var/list/notes = splittext(beat, "/") for(var/note in splittext(notes[1], "-")) if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case - playing = FALSE - hearing_mobs = null + toggle_playing(user, FALSE) return if(!length(note)) continue @@ -138,8 +139,7 @@ else sleep(tempo) repeat-- - hearing_mobs = null - playing = FALSE + toggle_playing(user, FALSE) repeat = 0 updateDialog(user) @@ -270,8 +270,7 @@ tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) else if(href_list["play"]) - playing = TRUE - INVOKE_ASYNC(src, .proc/playsong, usr) + toggle_playing(usr, TRUE) else if(href_list["newline"]) var/newline = html_encode(input("Enter your line: ", instrumentObj.name) as text|null) @@ -299,8 +298,7 @@ lines[num] = content else if(href_list["stop"]) - playing = FALSE - hearing_mobs = null + toggle_playing(usr, FALSE) updateDialog(usr) return @@ -309,6 +307,15 @@ new_tempo = abs(new_tempo) return max(round(new_tempo, world.tick_lag), world.tick_lag) +/datum/song/proc/toggle_playing(user, new_play_state) + playing = new_play_state + if(playing) + INVOKE_ASYNC(src, .proc/playsong, user) + SEND_SIGNAL(instrumentObj, COMSIG_SONG_START) + else + hearing_mobs = null + SEND_SIGNAL(instrumentObj, COMSIG_SONG_END) + // subclass for handheld instruments, like violin /datum/song/handheld @@ -321,7 +328,6 @@ else return TRUE - ////////////////////////////////////////////////////////////////////////// diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm new file mode 100644 index 00000000000..422d7a06524 --- /dev/null +++ b/code/game/objects/structures/railings.dm @@ -0,0 +1,60 @@ +/obj/structure/railing + name = "railing" + desc = "Basic railing meant to protect idiots like you from falling." + icon = 'icons/obj/fluff.dmi' + icon_state = "railing" + density = TRUE + anchored = TRUE + climbable = TRUE + +/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch + icon_state = "railing_corner" + density = FALSE + climbable = FALSE + +/obj/structure/railing/attackby(obj/item/I, mob/living/user, params) + add_fingerprint(user) + + if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP) + if(obj_integrity < max_integrity) + if(!I.tool_start_check(user, amount=0)) + return + + to_chat(user, "You begin repairing [src]...") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + to_chat(user, "You repair [src].") + else + to_chat(user, "[src] is already in good condition!") + return + + if(!(flags_1&NODECONSTRUCT_1)) + if(I.tool_behaviour == TOOL_WRENCH) + to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...") + if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored))) + setAnchored(!anchored) + to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.") + return + +/obj/structure/railing/proc/check_anchored(checked_anchored) + if(anchored == checked_anchored) + return TRUE + +/obj/structure/railing/CanPass(atom/movable/mover, turf/target) + ..() + if(get_dir(loc, target) & dir) + return !density + return TRUE + +/obj/structure/railing/corner/CanPass() + ..() + return TRUE + +/obj/structure/railing/CheckExit(atom/movable/O, turf/target) + ..() + if(get_dir(loc, target) & dir) + return 0 + return 1 + +/obj/structure/railing/corner/CheckExit() + return 1 diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index cdaaba70ed0..38758b381c3 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -82,7 +82,7 @@ /obj/structure/showcase/machinery/cloning_pod name = "cloning pod exhibit" - desc = "Signs describe how cloning pods like these ensure that every Nanotrasen employee can carry out their contracts in full, even in the unlikely event of their catastrophic death. Hopefully they aren't all made of cardboard, like this one." + desc = "Depicts a prototype from a failed attempt at reliable cloning technology. The technology was scrapped after reports of severe mutations, wiggly ear syndrome and spontaneous tail growth. The date 11.11.2558 is engraved on the base." icon = 'icons/obj/machines/cloning.dmi' icon_state = "pod_0" diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index 11b5b51ba0f..548831ea061 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -15,7 +15,7 @@ /obj/structure/statue/Initialize() . = ..() AddComponent(art_type, impressiveness) - addtimer(CALLBACK(src, /datum.proc/AddComponent, /datum/component/beauty, impressiveness * 75), 0) + addtimer(CALLBACK(src, /datum.proc/_AddComponent, list(/datum/component/beauty, impressiveness * 75)), 0) /obj/structure/statue/attackby(obj/item/W, mob/living/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 33cddb13e2c..971909151c4 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -167,6 +167,9 @@ if(istype(I, /obj/item/storage/bag/tray)) var/obj/item/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty + for(var/x in T.contents) + var/obj/item/item = x + AfterPutItemOnTable(item, user) SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) user.visible_message("[user] empties [I] on [src].") return @@ -181,10 +184,13 @@ //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) - return 1 + AfterPutItemOnTable(I, user) + return TRUE else return ..() +/obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) + return /obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) if(!(flags_1 & NODECONSTRUCT_1)) @@ -208,6 +214,36 @@ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS buildstack = null //No buildstack, so generate from mat datums +///Table on wheels +/obj/structure/table/rolling + name = "Rolling table" + desc = "A NT brand \"Rolly poly\" rolling table. It can and will move." + anchored = FALSE + smooth = SMOOTH_FALSE + canSmoothWith = list() + icon = 'icons/obj/smooth_structures/rollingtable.dmi' + icon_state = "rollingtable" + var/list/attached_items = list() + +/obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) + . = ..() + attached_items += I + RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/RemoveItemFromTable) //Listen for the pickup event, unregister on pick-up so we aren't moved + +/obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) + if(newloc != loc) //Did we not move with the table? because that shit's ok + return FALSE + attached_items -= source + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/obj/structure/table/rolling/Moved(atom/OldLoc, Dir) + for(var/mob/M in OldLoc.contents)//Kidnap everyone on top + M.forceMove(loc) + for(var/x in attached_items) + var/atom/movable/AM = x + if(!AM.Move(loc)) + RemoveItemFromTable(AM, AM.loc) + return TRUE /* * Glass tables diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 7a3848c000d..2036ee603e7 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -309,17 +309,15 @@ if(istype(O, /obj/item/melee/baton)) var/obj/item/melee/baton/B = O - if(B.cell) - if(B.cell.charge > 0 && B.turned_on) - flick("baton_active", src) - var/stunforce = B.stunforce - user.Paralyze(stunforce) - user.stuttering = stunforce/20 - B.deductcharge(B.hitcost) - user.visible_message("[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!", \ - "You unwisely attempt to wash [B] while it's still on.") - playsound(src, "sparks", 50, TRUE) - return + if(B.cell && B.cell.charge && B.turned_on) + flick("baton_active", src) + user.Paralyze(B.stun_time) + user.stuttering = B.stun_time/20 + B.deductcharge(B.cell_hit_cost) + user.visible_message("[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!", \ + "You unwisely attempt to wash [B] while it's still on.") + playsound(src, B.stun_sound, 50, TRUE) + return if(istype(O, /obj/item/mop)) O.reagents.add_reagent(dispensedreagent, 5) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 08a435634e9..666ea864260 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -315,13 +315,8 @@ /obj/structure/windoor_assembly/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, - null, - CALLBACK(src, .proc/can_be_rotated), - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, can_be_rotated=CALLBACK(src, .proc/can_be_rotated), after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/structure/windoor_assembly/proc/can_be_rotated(mob/user,rotation_type) if(anchored) diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 9edef593c18..49ef6d4e652 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -17,8 +17,6 @@ var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless var/obj/item/stack/ore/mineralType = null var/mineralAmt = 3 - var/spread = 0 //will the seam spread? - var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles var/last_act = 0 var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner var/defer_change = 0 @@ -31,12 +29,24 @@ transform = M icon = smooth_icon . = ..() - if (mineralType && mineralAmt && spread && spreadChance) + +/turf/closed/mineral/proc/Spread_Vein() + var/spreadChance = initial(mineralType.spreadChance) + if(spreadChance) for(var/dir in GLOB.cardinals) if(prob(spreadChance)) var/turf/T = get_step(src, dir) - if(istype(T, /turf/closed/mineral/random)) - Spread(T) + var/turf/closed/mineral/random/M = T + if(istype(M) && !M.mineralType) + M.Change_Ore(mineralType) + +/turf/closed/mineral/proc/Change_Ore(var/ore_type, random = 0) + if(random) + mineralAmt = rand(1, 5) + if(ispath(ore_type, /obj/item/stack/ore)) //If it has a scan_state, switch to it + var/obj/item/stack/ore/the_ore = ore_type + scan_state = initial(the_ore.scan_state) // I SAID. SWITCH. TO. IT. + mineralType = ore_type // Everything else assumes that this is typed correctly so don't set it to non-ores thanks. /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) if(turf_type) @@ -134,48 +144,50 @@ gets_drilled(null, FALSE) return -/turf/closed/mineral/Spread(turf/T) - T.ChangeTurf(type) - /turf/closed/mineral/random - var/list/mineralSpawnChanceList = list(/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10, - /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, - /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /turf/closed/mineral/bscrystal = 1) + var/list/mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /obj/item/stack/ore/bluespace_crystal = 1) //Currently, Adamantine won't spawn as it has no uses. -Durandan var/mineralChance = 13 - var/display_icon_state = "rock" /turf/closed/mineral/random/Initialize() mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList) - if (display_icon_state) - icon_state = display_icon_state . = ..() if (prob(mineralChance)) var/path = pickweight(mineralSpawnChanceList) - var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) + if(isturf(path)) + var/turf/T = ChangeTurf(path,null,CHANGETURF_IGNORE_AIR) - if(T && ismineralturf(T)) - var/turf/closed/mineral/M = T - M.mineralAmt = rand(1, 5) - M.environment_type = src.environment_type - M.turf_type = src.turf_type - M.baseturfs = src.baseturfs - src = M - M.levelupdate() + T.baseturfs = src.baseturfs + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.turf_type = src.turf_type + M.mineralAmt = rand(1, 5) + M.environment_type = src.environment_type + src = M + M.levelupdate() + else + src = T + T.levelupdate() + + else + Change_Ore(path, 1) + Spread_Vein(path) /turf/closed/mineral/random/no_caves - mineralSpawnChanceList = list(/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10, - /turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11, - /turf/closed/mineral/gibtonite = 4, /turf/closed/mineral/bscrystal = 1) + mineralSpawnChanceList = list(/obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, /obj/item/stack/ore/titanium = 11, + /turf/closed/mineral/gibtonite = 4, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 35, /turf/closed/mineral/diamond = 30, /turf/closed/mineral/gold = 45, /turf/closed/mineral/titanium = 45, - /turf/closed/mineral/silver = 50, /turf/closed/mineral/plasma = 50, /turf/closed/mineral/bscrystal = 20) + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 20) /turf/closed/mineral/random/high_chance/volcanic environment_type = "basalt" @@ -184,18 +196,17 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45, - /turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20) - + /obj/item/stack/ore/uranium = 35, /obj/item/stack/ore/diamond = 30, /obj/item/stack/ore/gold = 45, /obj/item/stack/ore/titanium = 45, + /obj/item/stack/ore/silver = 50, /obj/item/stack/ore/plasma = 50, /obj/item/stack/ore/bluespace_crystal) /turf/closed/mineral/random/low_chance icon_state = "rock_lowchance" mineralChance = 6 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4, - /turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40, - /turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1) + /obj/item/stack/ore/uranium = 2, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 4, /obj/item/stack/ore/titanium = 4, + /obj/item/stack/ore/silver = 6, /obj/item/stack/ore/plasma = 15, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite = 2, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/volcanic @@ -207,15 +218,15 @@ mineralChance = 10 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 5, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 10, /turf/closed/mineral/titanium/volcanic = 11, - /turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40, - /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/closed/mineral/bscrystal/volcanic = 1) + /obj/item/stack/ore/uranium = 5, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 10, /obj/item/stack/ore/titanium = 11, + /obj/item/stack/ore/silver = 12, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 40, + /turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /obj/item/stack/ore/bluespace_crystal = 1) /turf/closed/mineral/random/labormineral mineralSpawnChanceList = list( - /turf/closed/mineral/uranium = 3, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 8, /turf/closed/mineral/titanium = 8, - /turf/closed/mineral/silver = 20, /turf/closed/mineral/plasma = 30, /turf/closed/mineral/iron = 95, + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/iron = 95, /turf/closed/mineral/gibtonite = 2) icon_state = "rock_labor" @@ -227,16 +238,14 @@ initial_gas_mix = LAVALAND_DEFAULT_ATMOS defer_change = 1 mineralSpawnChanceList = list( - /turf/closed/mineral/uranium/volcanic = 3, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 8, /turf/closed/mineral/titanium/volcanic = 8, - /turf/closed/mineral/silver/volcanic = 20, /turf/closed/mineral/plasma/volcanic = 30, /turf/closed/mineral/bscrystal/volcanic = 1, /turf/closed/mineral/gibtonite/volcanic = 2, - /turf/closed/mineral/iron/volcanic = 95) - + /obj/item/stack/ore/uranium = 3, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 8, /obj/item/stack/ore/titanium = 8, + /obj/item/stack/ore/silver = 20, /obj/item/stack/ore/plasma = 30, /obj/item/stack/ore/bluespace_crystal = 1, /turf/closed/mineral/gibtonite/volcanic = 2, + /obj/item/stack/ore/iron = 95) +// Subtypes for mappers placing ores manually. /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron - spreadChance = 20 - spread = 1 scan_state = "rock_Iron" /turf/closed/mineral/iron/volcanic @@ -258,8 +267,6 @@ /turf/closed/mineral/uranium mineralType = /obj/item/stack/ore/uranium - spreadChance = 5 - spread = 1 scan_state = "rock_Uranium" /turf/closed/mineral/uranium/volcanic @@ -272,8 +279,6 @@ /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond - spreadChance = 0 - spread = 1 scan_state = "rock_Diamond" /turf/closed/mineral/diamond/volcanic @@ -295,8 +300,6 @@ /turf/closed/mineral/gold mineralType = /obj/item/stack/ore/gold - spreadChance = 5 - spread = 1 scan_state = "rock_Gold" /turf/closed/mineral/gold/volcanic @@ -309,8 +312,6 @@ /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver - spreadChance = 5 - spread = 1 scan_state = "rock_Silver" /turf/closed/mineral/silver/volcanic @@ -323,8 +324,6 @@ /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium - spreadChance = 5 - spread = 1 scan_state = "rock_Titanium" /turf/closed/mineral/titanium/volcanic @@ -337,8 +336,6 @@ /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma - spreadChance = 8 - spread = 1 scan_state = "rock_Plasma" /turf/closed/mineral/plasma/volcanic @@ -362,16 +359,12 @@ /turf/closed/mineral/bananium mineralType = /obj/item/stack/ore/bananium mineralAmt = 3 - spreadChance = 0 - spread = 0 scan_state = "rock_Bananium" /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_BScrystal" /turf/closed/mineral/bscrystal/volcanic @@ -435,8 +428,6 @@ /turf/closed/mineral/gibtonite mineralAmt = 1 - spreadChance = 0 - spread = 0 scan_state = "rock_Gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 7decbfef3e0..e545e406566 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -11,7 +11,6 @@ desc = "Stylish dark wood." icon_state = "wood" floor_tile = /obj/item/stack/tile/wood - custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.25) broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7") footstep = FOOTSTEP_WOOD barefootstep = FOOTSTEP_WOOD_BAREFOOT diff --git a/code/game/turfs/open/floor/plating/asteroid.dm b/code/game/turfs/open/floor/plating/asteroid.dm index 2f2c03b530e..599a2359557 100644 --- a/code/game/turfs/open/floor/plating/asteroid.dm +++ b/code/game/turfs/open/floor/plating/asteroid.dm @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me return if(is_mining_level(z)) SpawnFlora(T) //No space mushrooms, cacti. - // SpawnTerrain(T) + SpawnTerrain(T) SpawnMonster(T) //Checks for danger area. T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) @@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me new randumb(T) /turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T) - if(prob(2)) + if(prob(1)) if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored)) return var/randumb = pickweight(terrain_spawn_list) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 6c908335668..7130a640f52 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -214,7 +214,7 @@ // Here's hoping it doesn't stay like this for years before we finish conversion to step_ var/atom/firstbump var/canPassSelf = CanPass(mover, src) - if(canPassSelf || CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + if(canPassSelf || (mover.movement_type & UNSTOPPABLE)) for(var/i in contents) if(QDELETED(mover)) return FALSE //We were deleted, do not attempt to proceed with movement. @@ -224,7 +224,7 @@ if(!thing.Cross(mover)) if(QDELETED(mover)) //Mover deleted from Cross/CanPass, do not proceed. return FALSE - if(CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + if((mover.movement_type & UNSTOPPABLE)) mover.Bump(thing) continue else @@ -236,7 +236,7 @@ firstbump = src if(firstbump) mover.Bump(firstbump) - return CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE) + return (mover.movement_type & UNSTOPPABLE) return TRUE /turf/Exit(atom/movable/mover, atom/newloc) @@ -250,7 +250,7 @@ if(!thing.Uncross(mover, newloc)) if(thing.flags_1 & ON_BORDER_1) mover.Bump(thing) - if(!CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)) + if(!(mover.movement_type & UNSTOPPABLE)) return FALSE if(QDELETED(mover)) return FALSE //We were deleted. diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7cef224af7e..a13c0d09737 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -12,7 +12,7 @@ ///////////////////////////////////////////////////////////////////////////////////////////////Panels /datum/admins/proc/show_player_panel(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin - Game" set name = "Show Player Panel" set desc="Edit player (respawn, ban, heal, etc)" @@ -192,7 +192,7 @@ /datum/admins/proc/access_news_network() //MARKER - set category = "Fun" + set category = "Admin - Events" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." @@ -505,7 +505,7 @@ /datum/admins/proc/announce() - set category = "Special Verbs" + set category = "Admin" set name = "Announce" set desc="Announce your desires to the world" if(!check_rights(0)) @@ -520,7 +520,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Announce") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/set_admin_notice() - set category = "Special Verbs" + set category = "Server" set name = "Set Admin Notice" set desc ="Set an announcement that appears to everyone who joins the server. Only lasts this round" if(!check_rights(0)) @@ -636,7 +636,7 @@ /datum/admins/proc/delay() set category = "Server" set desc="Delay the game start" - set name="Delay pre-game" + set name="Delay Pre-Game" var/newtime = input("Set a new time in seconds. Set -1 for indefinite delay.","Set Delay",round(SSticker.GetTimeLeft()/10)) as num|null if(SSticker.current_state > GAME_STATE_PREGAME) @@ -740,7 +740,7 @@ /datum/admins/proc/show_traitor_panel(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin - Game" set desc = "Edit mobs's memory and role" set name = "Show Traitor Panel" diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index c5848a861e4..a35783fa093 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -6,7 +6,7 @@ /client/proc/investigate_show() set name = "Investigate" - set category = "Admin" + set category = "Admin - Game" if(!holder) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a0043ca2b65..95b02f48ae5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -7,7 +7,6 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/ /client/proc/cmd_admin_say, /*admin-only ooc chat*/ /client/proc/hide_verbs, /*hides all our adminverbs*/ - /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ @@ -296,17 +295,6 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/readmin ) -/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs - set name = "Adminverbs - Hide Most" - set category = "Admin" - - verbs.Remove(/client/proc/hide_most_verbs, GLOB.admin_verbs_hideable) - verbs += /client/proc/show_verbs - - to_chat(src, "Most of your adminverbs have been hidden.") - SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide Most Adminverbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /client/proc/hide_verbs() set name = "Adminverbs - Hide All" set category = "Admin" @@ -332,7 +320,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/admin_ghost() - set category = "Admin" + set category = "Admin - Game" set name = "Aghost" if(!holder) return @@ -363,7 +351,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/invisimin() set name = "Invisimin" - set category = "Admin" + set category = "Admin - Game" set desc = "Toggles ghost-like invisibility (Don't abuse this)" if(holder && mob) if(mob.invisibility == INVISIBILITY_OBSERVER) @@ -375,7 +363,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_antagonists() set name = "Check Antagonists" - set category = "Admin" + set category = "Admin - Game" if(holder) holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists.") //for tsar~ @@ -401,14 +389,14 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/game_panel() set name = "Game Panel" - set category = "Admin" + set category = "Admin - Game" if(holder) holder.Game() SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/secrets() set name = "Secrets" - set category = "Admin" + set category = "Admin - Game" if (holder) holder.Secrets() SSblackbox.record_feedback("tally", "admin_verb", 1, "Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -466,7 +454,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() - set category = "Special Verbs" + set category = "Fun" set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -508,7 +496,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() - set category = "Special Verbs" + set category = "Fun" set name = "Drop DynEx Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -607,7 +595,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] gave [key_name_admin(T)] the disease [D].") /client/proc/object_say(obj/O in world) - set category = "Special Verbs" + set category = "Admin - Events" set name = "OSay" set desc = "Makes an object say something." var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null @@ -619,7 +607,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" - set category = "Special Verbs" + set category = "Admin - Events" if (!(holder.rank.rights & R_BUILD)) return if(src.mob) @@ -628,7 +616,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/check_ai_laws() set name = "Check AI Laws" - set category = "Admin" + set category = "Admin - Game" if(holder) src.holder.output_ai_laws() @@ -711,7 +699,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/toggle_AI_interact() set name = "Toggle Admin AI Interact" - set category = "Admin" + set category = "Admin - Game" set desc = "Allows you to interact with most machines as an AI would as a ghost" AI_Interact = !AI_Interact diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm index 64ce5987cfd..7136de65fed 100644 --- a/code/modules/admin/adminmenu.dm +++ b/code/modules/admin/adminmenu.dm @@ -5,7 +5,7 @@ /datum/verbs/menu/Admin/verb/playerpanel() set name = "Player Panel" set desc = "Player Panel" - set category = "Admin" + set category = "Admin - Game" if(usr.client.holder) usr.client.holder.player_panel_new() SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm index b558d609582..1a376ae1116 100644 --- a/code/modules/admin/create_poll.dm +++ b/code/modules/admin/create_poll.dm @@ -1,6 +1,6 @@ /client/proc/create_poll() set name = "Create Poll" - set category = "Special Verbs" + set category = "Admin" if(!check_rights(R_POLL)) return if(!SSdbcore.Connect()) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 2c5283d12b7..bb3c9df152d 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -286,7 +286,7 @@ selectors_used |= query.where_switched combined_refs |= query.select_refs running -= query - if(!CHECK_BITFIELD(query.options, SDQL2_OPTION_DO_NOT_AUTOGC)) + if(!(query.options & SDQL2_OPTION_DO_NOT_AUTOGC)) QDEL_IN(query, 50) if(sequential && waiting_queue.len) finished = FALSE @@ -473,23 +473,23 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null if("select") switch(value) if("force_nulls") - DISABLE_BITFIELD(options, SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS) + options &= ~(SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS) if("proccall") switch(value) if("blocking") - ENABLE_BITFIELD(options, SDQL2_OPTION_BLOCKING_CALLS) + options |= SDQL2_OPTION_BLOCKING_CALLS if("priority") switch(value) if("high") - ENABLE_BITFIELD(options, SDQL2_OPTION_HIGH_PRIORITY) + options |= SDQL2_OPTION_HIGH_PRIORITY if("autogc") switch(value) if("keep_alive") - ENABLE_BITFIELD(options, SDQL2_OPTION_DO_NOT_AUTOGC) + options |= SDQL2_OPTION_DO_NOT_AUTOGC if("sequential") switch(value) if("true") - ENABLE_BITFIELD(options,SDQL2_OPTION_SEQUENTIAL) + options |= SDQL2_OPTION_SEQUENTIAL /datum/SDQL2_query/proc/ARun() INVOKE_ASYNC(src, .proc/Run) @@ -1176,7 +1176,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null char = query_text[i] if(char == "\"") - if(query_text[i + length(char)] == "'") + if((i + length(char) <= len) && query_text[i + length(char)] == "'") word += "\"" i += length(query_text[i + length(char)]) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ea87b445c99..53a64926715 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -113,10 +113,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //Dissasociate ticket /datum/admin_help_tickets/proc/ClientLogout(client/C) if(C.current_ticket) - C.current_ticket.AddInteraction("Client disconnected.") - SSblackbox.LogAhelp(C.current_ticket.id, "Disconnected", "Client disconnected", C.ckey) - C.current_ticket.initiator = null - C.current_ticket = null + var/datum/admin_help/T = C.current_ticket + T.AddInteraction("Client disconnected.") + SSblackbox.LogAhelp(T, "Disconnected", "Client disconnected", C.ckey) + T.initiator = null //Get a ticket given a ckey /datum/admin_help_tickets/proc/CKey2ActiveTicket(ckey) @@ -175,7 +175,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) id = ++ticket_counter opened_at = world.time - name = msg + name = copytext_char(msg, 1, 100) initiator = C initiator_ckey = initiator.ckey @@ -484,10 +484,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) // Used for methods where input via arg doesn't work /client/proc/get_adminhelp() - var/msg = input(src, "Please describe your problem concisely and an admin will help as soon as they're able.", "Adminhelp contents") as text|null + var/msg = input(src, "Please describe your problem concisely and an admin will help as soon as they're able.", "Adminhelp contents") as message|null adminhelp(msg) -/client/verb/adminhelp(msg as text) +/client/verb/adminhelp(msg as message) set category = "Admin" set name = "Adminhelp" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index dab5e8d936d..ad4b527b423 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -1,7 +1,7 @@ /client/proc/jumptoarea(area/A in GLOB.sortedAreas) set name = "Jump to Area" set desc = "Area to jump to" - set category = "Admin" + set category = "Admin - Game" if(!src.holder) to_chat(src, "Only administrators may use this command.") return @@ -28,7 +28,7 @@ /client/proc/jumptoturf(turf/T in world) set name = "Jump to Turf" - set category = "Admin" + set category = "Admin - Game" if(!src.holder) to_chat(src, "Only administrators may use this command.") return @@ -40,7 +40,7 @@ return /client/proc/jumptomob(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin - Game" set name = "Jump to Mob" if(!src.holder) @@ -59,7 +59,7 @@ to_chat(A, "This mob is not located in the game world.") /client/proc/jumptocoord(tx as num, ty as num, tz as num) - set category = "Admin" + set category = "Admin - Game" set name = "Jump to Coordinate" if (!holder) @@ -74,7 +74,7 @@ message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]") /client/proc/jumptokey() - set category = "Admin" + set category = "Admin - Game" set name = "Jump to Key" if(!src.holder) @@ -97,7 +97,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list) - set category = "Admin" + set category = "Admin - Game" set name = "Get Mob" set desc = "Mob to teleport" if(!src.holder) @@ -113,7 +113,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/Getkey() - set category = "Admin" + set category = "Admin - Game" set name = "Get Key" set desc = "Key to teleport" @@ -141,7 +141,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/sendmob(mob/M in sortmobs()) - set category = "Admin" + set category = "Admin - Game" set name = "Send Mob" if(!src.holder) to_chat(src, "Only administrators may use this command.") diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 99347010675..e82692f768a 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -1,5 +1,5 @@ /client/proc/cmd_admin_say(msg as text) - set category = "Special Verbs" + set category = "Admin" set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite set hidden = 1 if(!check_rights(0)) diff --git a/code/modules/admin/verbs/beakerpanel.dm b/code/modules/admin/verbs/beakerpanel.dm index 6bbcf70c521..d280a03fff4 100644 --- a/code/modules/admin/verbs/beakerpanel.dm +++ b/code/modules/admin/verbs/beakerpanel.dm @@ -61,7 +61,7 @@ return container /datum/admins/proc/beaker_panel() - set category = "Debug" + set category = "Admin - Events" set name = "Spawn reagent container" if(!check_rights()) return diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm index 4251dee3a29..520ce8ede8c 100644 --- a/code/modules/admin/verbs/borgpanel.dm +++ b/code/modules/admin/verbs/borgpanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_borgopanel(borgo in GLOB.silicon_mobs) - set category = "Admin" + set category = "Admin - Game" set name = "Show Borg Panel" set desc = "Show borg panel" diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 37c09810ea6..52553b23949 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -1,5 +1,5 @@ /client/proc/dsay(msg as text) - set category = "Special Verbs" + set category = "Admin - Game" set name = "Dsay" set hidden = 1 if(!holder) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e8578b20f31..bfc79c19bcf 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -185,7 +185,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Powernets") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_grantfullaccess(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Debug" set name = "Grant Full Access" if(!SSticker.HasRoundStarted()) @@ -227,7 +227,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that message_admins("[key_name_admin(usr)] has granted [M.key] full access.") /client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin - Game" set name = "Assume direct control" set desc = "Direct intervention" @@ -248,7 +248,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list) - set category = "Admin" + set category = "Admin - Game" set name = "Give direct control" if(!M) @@ -492,7 +492,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that cmd_admin_areatest(FALSE) /client/proc/cmd_admin_dress(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Admin - Events" set name = "Select equipment" if(!(ishuman(M) || isobserver(M))) alert("Invalid mob") diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index cd3109df004..47071282930 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -1,7 +1,7 @@ // Proc taken from yogstation, credit to nichlas0010 for the original /client/proc/fix_air(var/turf/open/T in world) set name = "Fix Air" - set category = "Admin" + set category = "Admin - Game" set desc = "Fixes air in specified radius." if(!holder) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index f4ae19125be..cb9f0c4a98c 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -1,7 +1,7 @@ /client/proc/one_click_antag() set name = "Create Antagonist" set desc = "Auto-create an antagonist of your choice" - set category = "Admin" + set category = "Admin - Events" if(holder) holder.one_click_antag() diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index baa229eb6cb..57da02b7b5c 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -20,7 +20,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin - Events" set name = "Subtle Message" if(!ismob(M)) @@ -46,7 +46,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_headset_message(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin - Events" set name = "Headset Message" admin_headset_message(M) @@ -82,7 +82,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Headset Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_mod_antag_rep(client/C in GLOB.clients, operation) - set category = "Special Verbs" + set category = "null" set name = "Modify Antagonist Reputation" if(!check_rights(R_ADMIN)) @@ -128,7 +128,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Modify Antagonist Reputation") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() - set category = "Special Verbs" + set category = "Admin - Events" set name = "Global Narrate" if(!check_rights(R_ADMIN)) @@ -144,7 +144,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) - set category = "Special Verbs" + set category = "Admin - Events" set name = "Direct Narrate" if(!check_rights(R_ADMIN)) @@ -169,7 +169,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) - set category = "Special Verbs" + set category = "Admin - Events" set name = "Local Narrate" if(!check_rights(R_ADMIN)) @@ -190,7 +190,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Admin - Game" set name = "Godmode" if(!check_rights(R_ADMIN)) return @@ -335,7 +335,7 @@ Works kind of like entering the game with a new character. Character receives a Traitors and the like can also be revived with the previous role mostly intact. /N */ /client/proc/respawn_character() - set category = "Special Verbs" + set category = "Admin - Game" set name = "Respawn Character" set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into." if(!check_rights(R_ADMIN)) @@ -503,7 +503,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return new_character /client/proc/cmd_admin_add_freeform_ai_law() - set category = "Fun" + set category = "Admin - Events" set name = "Add Custom AI law" if(!check_rights(R_ADMIN)) @@ -526,7 +526,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_rejuvenate(mob/living/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Debug" set name = "Rejuvenate" if(!check_rights(R_ADMIN)) @@ -546,7 +546,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() - set category = "Special Verbs" + set category = "Admin - Events" set name = "Create Command Report" if(!check_rights(R_ADMIN)) @@ -572,7 +572,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() - set category = "Special Verbs" + set category = "Admin - Events" set name = "Change Command Name" if(!check_rights(R_ADMIN)) @@ -586,7 +586,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(src)] has changed the Central Command name to: [input]") /client/proc/cmd_admin_delete(atom/A as obj|mob|turf in world) - set category = "Admin" + set category = "Debug" set name = "Delete" if(!check_rights(R_SPAWN|R_DEBUG)) @@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact. admin_delete(A) /client/proc/cmd_admin_list_open_jobs() - set category = "Admin" + set category = "Admin - Game" set name = "Manage Job Slots" if(!check_rights(R_ADMIN)) @@ -604,7 +604,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Fun" set name = "Explosion" if(!check_rights(R_ADMIN)) @@ -640,7 +640,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) - set category = "Special Verbs" + set category = "Fun" set name = "EM Pulse" if(!check_rights(R_ADMIN)) @@ -665,7 +665,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/cmd_admin_gib(mob/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Fun" set name = "Gib" if(!check_rights(R_ADMIN)) @@ -702,7 +702,7 @@ Traitors and the like can also be revived with the previous role mostly intact. mob.gib(1, 1, 1) /client/proc/cmd_admin_check_contents(mob/living/M in GLOB.mob_list) - set category = "Special Verbs" + set category = "Debug" set name = "Check Contents" var/list/L = M.get_contents() @@ -711,7 +711,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_view_range() - set category = "Special Verbs" + set category = "Admin - Game" set name = "Change View Range" set desc = "switches between 1x and custom views" @@ -727,7 +727,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_call_shuttle() - set category = "Admin" + set category = "Admin - Events" set name = "Call Shuttle" if(EMERGENCY_AT_LEAST_DOCKED) @@ -747,7 +747,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return /client/proc/admin_cancel_shuttle() - set category = "Admin" + set category = "Admin - Events" set name = "Cancel Shuttle" if(!check_rights(0)) return @@ -813,7 +813,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/admin_change_sec_level() - set category = "Special Verbs" + set category = "Admin - Events" set name = "Set Security Level" set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" @@ -830,7 +830,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" - set category = "Fun" + set category = "Admin - Events" set popup_menu = 0 if(!check_rights(R_DEBUG)) return @@ -848,7 +848,7 @@ Traitors and the like can also be revived with the previous role mostly intact. SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Nuke", "[N.timing]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_combo_hud() - set category = "Admin" + set category = "Admin - Game" set name = "Toggle Combo HUD" set desc = "Toggles the Admin Combo HUD (antag, sci, med, eng)" @@ -883,7 +883,7 @@ Traitors and the like can also be revived with the previous role mostly intact. /client/proc/run_weather() - set category = "Fun" + set category = "Admin - Events" set name = "Run Weather" set desc = "Triggers a weather on the z-level you choose." diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm index a53a5d04c62..438c1b9185a 100644 --- a/code/modules/admin/verbs/reestablish_db_connection.dm +++ b/code/modules/admin/verbs/reestablish_db_connection.dm @@ -1,5 +1,5 @@ /client/proc/reestablish_db_connection() - set category = "Special Verbs" + set category = "Server" set name = "Reestablish DB Connection" if (!CONFIG_GET(flag/sql_enabled)) to_chat(usr, "The Database is not enabled!") diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index cf11034f85d..0b9bb0fabca 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_shuttlepanel() - set category = "Admin" + set category = "Admin - Events" set name = "Shuttle Manipulator" set desc = "Opens the shuttle manipulator UI." diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index d2cd1e7eafd..1bf4b6f0a63 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -1,5 +1,5 @@ /client/proc/triple_ai() - set category = "Fun" + set category = "Admin - Events" set name = "Create AI Triumvirate" if(SSticker.current_state > GAME_STATE_PREGAME) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 2a1d4c7a6ff..79d7379b8bf 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -69,10 +69,10 @@ lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target.AddComponent(arglist(lst)) + target._AddComponent(lst) else datumname = "element" - target.AddElement(arglist(lst)) + target._AddElement(lst) log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") if(href_list[VV_HK_CALLPROC]) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 574520bce26..f7d82891c9d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -110,9 +110,6 @@ if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE)) to_chat(user, "AUTHENTICATION FAILURE. ACCESS DENIED.") return FALSE - if(!user.onSyndieBase()) - to_chat(user, "[src] is out of range! It can only be used at your base!") - return FALSE return TRUE diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 0d1c50ed83c..6018b497931 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -17,7 +17,7 @@ actions_types = list(/datum/action/item_action/hands_free/activate) allowed = list( /obj/item/abductor, - /obj/item/abductor/baton, + /obj/item/melee/baton/abductor, /obj/item/melee/baton, /obj/item/gun/energy, /obj/item/restraints/handcuffs @@ -142,12 +142,12 @@ lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' -/obj/item/abductor/proc/AbductorCheck(mob/user) +/obj/item/proc/AbductorCheck(mob/user) if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING)) return TRUE if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING)) return TRUE - to_chat(user, "You can't figure how this works!") + to_chat(user, "You can't figure out how this works!") return FALSE /obj/item/abductor/proc/ScientistCheck(mob/user) @@ -436,22 +436,46 @@ Congratulations! You are now trained for invasive xenobiology research!"} #define BATON_PROBE 3 #define BATON_MODES 4 -/obj/item/abductor/baton +/obj/item/melee/baton/abductor name = "advanced baton" desc = "A quad-mode baton used for incapacitation and restraining of specimens." - var/mode = BATON_STUN + + icon = 'icons/obj/abductor.dmi' + lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi' icon_state = "wonderprodStun" item_state = "wonderprod" - slot_flags = ITEM_SLOT_BELT - force = 7 - w_class = WEIGHT_CLASS_NORMAL - actions_types = list(/datum/action/item_action/toggle_mode) -/obj/item/absductor/baton/ComponentInitialize() + force = 7 + + w_class = WEIGHT_CLASS_NORMAL + slot_flags = ITEM_SLOT_BELT + + actions_types = list(/datum/action/item_action/toggle_mode) + convertible = FALSE + + attack_cooldown = 0 SECONDS + confusion_amt = 0 + stamina_loss_amt = 0 + apply_stun_delay = 0 SECONDS + stun_time = 14 SECONDS + + preload_cell_type = /obj/item/stock_parts/cell/infinite //Any sufficiently advanced technology is indistinguishable from magic + activate_sound = null + can_remove_cell = FALSE + + var/mode = BATON_STUN + + var/sleep_time = 2 MINUTES + var/time_to_cuff = 3 SECONDS + +/obj/item/melee/baton/abductor/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_updates_onmob) -/obj/item/abductor/baton/proc/toggle(mob/living/user=usr) +/obj/item/melee/baton/abductor/proc/toggle(mob/living/user=usr) + if(!AbductorCheck(user)) + return mode = (mode+1)%BATON_MODES var/txt switch(mode) @@ -464,10 +488,12 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(BATON_PROBE) txt = "probing" + if(!turned_on) + toggle_on(user) to_chat(usr, "You switch the baton to [txt] mode.") update_icon() -/obj/item/abductor/baton/update_icon_state() +/obj/item/melee/baton/abductor/update_icon_state() switch(mode) if(BATON_STUN) icon_state = "wonderprodStun" @@ -482,12 +508,20 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "wonderprodProbe" item_state = "wonderprodProbe" -/obj/item/abductor/baton/attack(mob/target, mob/living/user) +/obj/item/melee/baton/abductor/attack(mob/target, mob/living/user) if(!AbductorCheck(user)) return + if(!deductcharge(cell_hit_cost)) + to_chat(user, "[src] [cell ? "is out of charge" : "does not have a power source installed"].") + return FALSE + + if(!turned_on) + toggle_on(user) + if(iscyborg(target)) - ..() + if(BATON_STUN) + ..() return if(!isliving(target)) @@ -497,45 +531,34 @@ Congratulations! You are now trained for invasive xenobiology research!"} user.do_attack_animation(L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(H, 'sound/weapons/genhit.ogg', 50, TRUE) - return FALSE + check_shields(L, user) switch (mode) if(BATON_STUN) - StunAttack(L,user) + ..() if(BATON_SLEEP) SleepAttack(L,user) if(BATON_CUFF) CuffAttack(L,user) if(BATON_PROBE) ProbeAttack(L,user) + return -/obj/item/abductor/baton/attack_self(mob/living/user) +/obj/item/melee/baton/abductor/apply_stun_effect_end(mob/living/target) + StunAttack(target) + +/obj/item/melee/baton/abductor/proc/StunAttack(mob/living/L) + L.Paralyze(stun_time) + +/obj/item/melee/baton/abductor/attack_self(mob/living/user) toggle(user) -/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user) +/obj/item/melee/baton/abductor/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + turned_on = FALSE + ..() - L.lastattacker = user.real_name - L.lastattackerckey = user.ckey - - L.Paralyze(140) - L.apply_effect(EFFECT_STUTTER, 7) - SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) - - L.visible_message("[user] has stunned [L] with [src]!", \ - "[user] has stunned you with [src]!") - playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) - - if(ishuman(L)) - var/mob/living/carbon/human/H = L - H.forcesay(GLOB.hit_appends) - - log_combat(user, L, "stunned") - -/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user) +/obj/item/melee/baton/abductor/proc/SleepAttack(mob/living/L,mob/living/user) + playsound(src, stun_sound, 50, TRUE, -1) if(L.incapacitated(TRUE, TRUE)) if(L.anti_magic_check(FALSE, FALSE, TRUE)) to_chat(user, "The specimen's tinfoil protection is interfering with the sleep inducement!") @@ -545,8 +568,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} return L.visible_message("[user] has induced sleep in [L] with [src]!", \ "You suddenly feel very drowsy!") - playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) - L.Sleeping(1200) + L.Sleeping(sleep_time) log_combat(user, L, "put to sleep") else if(L.anti_magic_check(FALSE, FALSE, TRUE, 0)) @@ -559,7 +581,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.visible_message("[user] tried to induce sleep in [L] with [src]!", \ "You suddenly feel drowsy!") -/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user) +/obj/item/melee/baton/abductor/proc/CuffAttack(mob/living/L,mob/living/user) if(!iscarbon(L)) return var/mob/living/carbon/C = L @@ -568,7 +590,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message("[user] begins restraining [C] with [src]!", \ "[user] begins shaping an energy field around your hands!") - if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) + if(do_mob(user, C, time_to_cuff) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())) if(!C.handcuffed) C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C) C.update_handcuffed() @@ -579,7 +601,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} else to_chat(user, "[C] doesn't have two hands...") -/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user) +/obj/item/melee/baton/abductor/proc/ProbeAttack(mob/living/L,mob/living/user) L.visible_message("[user] probes [L] with [src]!", \ "[user] probes you!") @@ -609,7 +631,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "cuff" // Needs sprite lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - breakouttime = 450 + breakouttime = 45 SECONDS trashtype = /obj/item/restraints/handcuffs/energy/used flags_1 = NONE @@ -624,17 +646,18 @@ Congratulations! You are now trained for invasive xenobiology research!"} S.start() . = ..() -/obj/item/abductor/baton/examine(mob/user) +/obj/item/melee/baton/abductor/examine(mob/user) . = ..() - switch(mode) - if(BATON_STUN) - . += "The baton is in stun mode." - if(BATON_SLEEP) - . += "The baton is in sleep inducement mode." - if(BATON_CUFF) - . += "The baton is in restraining mode." - if(BATON_PROBE) - . += "The baton is in probing mode." + if(AbductorCheck(user)) + switch(mode) + if(BATON_STUN) + . += "The baton is in stun mode." + if(BATON_SLEEP) + . += "The baton is in sleep inducement mode." + if(BATON_CUFF) + . += "The baton is in restraining mode." + if(BATON_PROBE) + . += "The baton is in probing mode." /obj/item/radio/headset/abductor name = "alien headset" diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index 42e9fa19a32..b3e4f89a7e0 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -34,7 +34,7 @@ name = "Abductor Agent" head = /obj/item/clothing/head/helmet/abductor suit = /obj/item/clothing/suit/armor/abductor/vest - suit_store = /obj/item/abductor/baton + suit_store = /obj/item/melee/baton/abductor belt = /obj/item/storage/belt/military/abductor/full backpack_contents = list( @@ -59,7 +59,7 @@ name = "Abductor Scientist (w/ agent gear)" head = /obj/item/clothing/head/helmet/abductor suit = /obj/item/clothing/suit/armor/abductor/vest - suit_store = /obj/item/abductor/baton + suit_store = /obj/item/melee/baton/abductor belt = /obj/item/storage/belt/military/abductor/full backpack_contents = list( diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index b1cd2c8ff71..a9f31b8ecc6 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/abductor.dmi' icon_state = "gland" status = ORGAN_ROBOTIC + organ_flags = NONE beating = TRUE var/true_name = "baseline placebo referencer" var/cooldown_low = 300 diff --git a/code/modules/antagonists/abductor/equipment/glands/slime.dm b/code/modules/antagonists/abductor/equipment/glands/slime.dm index 406ed8d5fb5..30a13107595 100644 --- a/code/modules/antagonists/abductor/equipment/glands/slime.dm +++ b/code/modules/antagonists/abductor/equipment/glands/slime.dm @@ -13,9 +13,9 @@ owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) /obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special = 0) - ..() owner.faction -= "slime" owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND) + ..() /obj/item/organ/heart/gland/slime/activate() to_chat(owner, "You feel nauseated!") diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index c6b4e6e26ad..e2f0534203f 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -104,7 +104,7 @@ else if(href_list["dispense"]) switch(href_list["dispense"]) if("baton") - Dispense(/obj/item/abductor/baton,cost=2) + Dispense(/obj/item/melee/baton/abductor,cost=2) if("helmet") Dispense(/obj/item/clothing/head/helmet/abductor) if("silencer") diff --git a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm index 649ca4d44c4..67f47a4b806 100644 --- a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm +++ b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm @@ -34,5 +34,5 @@ /datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O) reac_volume = ..() M.apply_damage(0.6*reac_volume, BRUTE) - if(M) + if(!QDELETED(M)) M.apply_damage(0.6*reac_volume, BURN) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index e0ec4cfab7f..740f9d04e65 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -476,6 +476,8 @@ clothing_flags = STOPSPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) //No armor at all. + actions_types = list() + cell = null /obj/item/clothing/suit/space/changeling/Initialize() . = ..() @@ -484,10 +486,15 @@ loc.visible_message("[loc.name]\'s flesh rapidly inflates, forming a bloated mass around [loc.p_their()] body!", "We inflate our flesh, creating a spaceproof suit!", "You hear organic matter ripping and tearing!") START_PROCESSING(SSobj, src) +// seal the cell door +/obj/item/clothing/suit/space/changeling/toggle_spacesuit_cell(mob/user) + return + /obj/item/clothing/suit/space/changeling/process() if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.reagents.add_reagent(/datum/reagent/medicine/salbutamol, REAGENTS_METABOLISM) + H.adjust_bodytemperature(temperature_setting - H.bodytemperature) // force changelings to normal temp step mode played badly /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index a4a454506f7..2db1a422246 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -260,7 +260,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", owner.current.forceMove(A) A.oldform = owner.current owner.transfer_to(A) - A.set_name() + A.set_devil_name() give_appropriate_spells() form = TRUE_DEVIL update_hud() @@ -473,7 +473,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", H.forceMove(A) A.oldform = H owner.transfer_to(A, TRUE) - A.set_name() + A.set_devil_name() if(SOULVALUE >= ARCH_THRESHOLD && ascendable) A.convert_to_archdevil() else diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 7b1770440c1..db65cc40a4d 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -45,7 +45,7 @@ health = maxHealth icon_state = "arch_devil" -/mob/living/carbon/true_devil/proc/set_name() +/mob/living/carbon/true_devil/proc/set_devil_name() var/datum/antagonist/devil/devilinfo = mind.has_antag_datum(/datum/antagonist/devil) name = devilinfo.truename real_name = name diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 4ac85175861..7d48e3f4d89 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -10,6 +10,7 @@ roundend_category = "clown operatives" antagpanel_category = "ClownOp" nukeop_outfit = /datum/outfit/syndicate/clownop/leader + challengeitem = /obj/item/nuclear_challenge/clownops /datum/antagonist/nukeop/leader/clownop/give_alias() title = pick("Head Honker", "Slipmaster", "Clown King", "Honkbearer") diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index db541ccbeb5..a4acc3492fd 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -154,6 +154,7 @@ nukeop_outfit = /datum/outfit/syndicate/leader always_new_team = TRUE var/title + var/challengeitem = /obj/item/nuclear_challenge /datum/antagonist/nukeop/leader/memorize_code() ..() @@ -179,7 +180,14 @@ owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0) to_chat(owner, "You are the Syndicate [title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.") to_chat(owner, "If you feel you are not up to this task, give your ID to another operative.") - to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + if(!CONFIG_GET(flag/disable_warops)) + to_chat(owner, "In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.") + var/obj/item/dukinuki = new challengeitem + var/mob/living/carbon/human/H = owner.current + if(!istype(H)) + dukinuki.forceMove(H.drop_location()) + else + H.put_in_hands(dukinuki, TRUE) owner.announce_objectives() addtimer(CALLBACK(src, .proc/nuketeam_name_assign), 1) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 4b27def09e7..8c046970f43 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -310,9 +310,6 @@ if(prob(50)) new /obj/effect/temp_visual/revenant(thing.loc) thing.emag_act(null) - else - if(!istype(thing, /obj/machinery/clonepod)) //I hate everything but mostly the fact there's no better way to do this without just not affecting it at all - thing.emp_act(EMP_HEAVY) for(var/mob/living/silicon/robot/S in T) //Only works on cyborgs, not AI playsound(S, 'sound/machines/warning-buzzer.ogg', 50, TRUE) new /obj/effect/temp_visual/revenant(S.loc) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index ef315af4726..d2b20af0832 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -193,7 +193,7 @@ /obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item if(custom_materials) - if(custom_materials[getmaterialref(/datum/material/iron)] || custom_materials[getmaterialref(/datum/material/glass)]) + if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)]) return 1 return ..() diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm index 526646d975d..8c993da7dc5 100644 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ b/code/modules/antagonists/valentines/heartbreaker.dm @@ -15,5 +15,5 @@ . = ..() /datum/antagonist/heartbreaker/greet() - to_chat(owner, "You didn't get a date! They're all having fun without you! you'll show them though...") + to_chat(owner, "You didn't get a date! They're all having fun without you! You'll show them though...") owner.announce_objectives() diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 3dddae32abc..eb31d9faf27 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -16,9 +16,8 @@ /obj/item/assembly_holder/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags) /obj/item/assembly_holder/IsAssemblyHolder() return TRUE diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 811fccf0e05..8099d18fb93 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -4,7 +4,10 @@ icon_state = "infrared" custom_materials = list(/datum/material/iron=1000, /datum/material/glass=500) is_position_sensitive = TRUE - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + var/ui_x = 225 + var/ui_y = 110 var/on = FALSE var/visible = FALSE var/maxlength = 8 @@ -12,8 +15,6 @@ var/olddir = 0 var/turf/listeningTo var/hearing_range = 3 - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' /obj/item/assembly/infra/Initialize() . = ..() @@ -22,13 +23,8 @@ /obj/item/assembly/infra/ComponentInitialize() . = ..() - AddComponent( - /datum/component/simple_rotation, - ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS, - null, - null, - CALLBACK(src,.proc/after_rotation) - ) + var/static/rotation_flags = ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_FLIP | ROTATION_VERBS + AddComponent(/datum/component/simple_rotation, rotation_flags, after_rotation=CALLBACK(src,.proc/after_rotation)) /obj/item/assembly/infra/proc/after_rotation() refreshBeam() @@ -45,7 +41,7 @@ /obj/item/assembly/infra/activate() if(!..()) - return FALSE//Cooldown check + return FALSE //Cooldown check on = !on refreshBeam() update_icon() @@ -183,54 +179,53 @@ return return refreshBeam() -/obj/item/assembly/infra/ui_interact(mob/user)//TODO: change this this to the wire control panel - . = ..() - if(is_secured(user)) - user.set_machine(src) - var/dat = "Infrared Laser" - dat += "
Status: [on ? "On" : "Off"]" - dat += "
Visibility: [visible ? "Visible" : "Invisible"]" - dat += "

Refresh" - dat += "

Close" - user << browse(dat, "window=infra") - onclose(user, "infra") - return - -/obj/item/assembly/infra/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=infra") - onclose(usr, "infra") - return - - if(href_list["state"]) - on = !(on) - update_icon() - refreshBeam() - if(href_list["visible"]) - visible = !(visible) - update_icon() - refreshBeam() - if(href_list["close"]) - usr << browse(null, "window=infra") - return - if(usr) - attack_self(usr) - /obj/item/assembly/infra/setDir() . = ..() refreshBeam() +/obj/item/assembly/infra/ui_status(mob/user) + if(is_secured(user)) + return ..() + return UI_CLOSE + +/obj/item/assembly/infra/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "infrared_emitter", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/assembly/infra/ui_data(mob/user) + var/list/data = list() + data["on"] = on + data["visible"] = visible + return data + +/obj/item/assembly/infra/ui_act(action, params) + if(..()) + return + + switch(action) + if("power") + on = !on + . = TRUE + if("visibility") + visible = !visible + . = TRUE + + update_icon() + refreshBeam() + /***************************IBeam*********************************/ /obj/effect/beam/i_beam name = "infrared beam" icon = 'icons/obj/projectiles.dmi' icon_state = "ibeam" - var/obj/item/assembly/infra/master anchored = TRUE density = FALSE pass_flags = PASSTABLE|PASSGLASS|PASSGRILLE|LETPASSTHROW + var/obj/item/assembly/infra/master /obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj) if(istype(AM, /obj/effect/beam)) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index be75a725c17..648a015d168 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -4,15 +4,15 @@ icon_state = "prox" custom_materials = list(/datum/material/iron=800, /datum/material/glass=200) attachable = TRUE - + drop_sound = 'sound/items/handling/component_drop.ogg' + pickup_sound = 'sound/items/handling/component_pickup.ogg' + var/ui_x = 250 + var/ui_y = 185 var/scanning = FALSE var/timing = FALSE var/time = 10 var/sensitivity = 1 var/hearing_range = 3 - drop_sound = 'sound/items/handling/component_drop.ogg' - pickup_sound = 'sound/items/handling/component_pickup.ogg' - /obj/item/assembly/prox_sensor/Initialize() . = ..() @@ -29,7 +29,7 @@ /obj/item/assembly/prox_sensor/activate() if(!..()) - return FALSE//Cooldown check + return FALSE //Cooldown check if(!scanning) timing = !timing else @@ -44,7 +44,6 @@ else proximity_monitor.SetHost(src,src) - /obj/item/assembly/prox_sensor/toggle_secure() secured = !secured if(!secured) @@ -59,8 +58,6 @@ update_icon() return secured - - /obj/item/assembly/prox_sensor/HasProximity(atom/movable/AM as mob|obj) if (istype(AM, /obj/effect/beam)) return @@ -78,7 +75,6 @@ next_activate = world.time + 30 return TRUE - /obj/item/assembly/prox_sensor/process() if(!timing) return @@ -114,49 +110,48 @@ holder.update_icon() return -/obj/item/assembly/prox_sensor/ui_interact(mob/user)//TODO: Change this to the wires thingy - . = ..() +/obj/item/assembly/prox_sensor/ui_status(mob/user) if(is_secured(user)) - var/second = time % 60 - var/minute = (time - second) / 60 - var/dat = "Proximity Sensor" - if(!scanning) - dat += "
[(timing ? "Arming" : "Not Arming")] [minute]:[second]" - dat += "
- - + +" - dat += "
Armed":"1'>Unarmed (Movement sensor active when armed!)"]" - dat += "
Detection range: - [sensitivity] +" - dat += "

Refresh" - dat += "

Close" - user << browse(dat, "window=prox") - onclose(user, "prox") + return ..() + return UI_CLOSE + +/obj/item/assembly/prox_sensor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "proximity_sensor", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/item/assembly/prox_sensor/ui_data(mob/user) + var/list/data = list() + var/time_left = time + data["seconds"] = round(time_left % 60) + data["minutes"] = round((time_left - data["seconds"]) / 60) + data["timing"] = timing + data["scanning"] = scanning + data["sensitivity"] = sensitivity + return data + +/obj/item/assembly/prox_sensor/ui_act(action, params) + if(..()) return - -/obj/item/assembly/prox_sensor/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src, BE_CLOSE)) - usr << browse(null, "window=prox") - onclose(usr, "prox") - return - - if(href_list["sense"]) - sensitivity_change(((href_list["sense"] == "up") ? 1 : -1)) - - if(href_list["scanning"]) - toggle_scan(text2num(href_list["scanning"])) - - if(href_list["time"]) - timing = text2num(href_list["time"]) - update_icon() - - if(href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 600) - - if(href_list["close"]) - usr << browse(null, "window=prox") - return - - if(usr) - attack_self(usr) + switch(action) + if("scanning") + toggle_scan(!scanning) + . = TRUE + if("sense") + var/value = text2num(params["range"]) + if(value) + sensitivity_change(value) + . = TRUE + if("time") + timing = !timing + update_icon() + . = TRUE + if("input") + var/value = text2num(params["adjust"]) + if(value) + var/newtime = round(time+value) + time = CLAMP(newtime, 0, 600) + . = TRUE diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index 7acd8625d45..dcea095d3cd 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -55,16 +55,3 @@ /datum/gas_mixture/immutable/space/remove_ratio() return copy() //we're always empty, so we can just return a copy. - - -//used by cloners -/datum/gas_mixture/immutable/cloner - initial_temperature = T20C - -/datum/gas_mixture/immutable/cloner/garbage_collect() - ..() - ADD_GAS(/datum/gas/nitrogen, gases) - gases[/datum/gas/nitrogen][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD - -/datum/gas_mixture/immutable/cloner/heat_capacity() - return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 9a6ff97e3f1..5c684e7b1c3 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -43,7 +43,7 @@ return if(QDELETED(src) || QDELETED(user)) return - var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") + var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be revived!)",,"Yes","No") if(ghost_role == "No" || !loc) return log_game("[key_name(user)] became [mob_name]") diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 73c3eea8d80..4df8fbf32f8 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -30,7 +30,7 @@ active = TRUE locked = TRUE - state = 2 + welded = TRUE /obj/machinery/power/emitter/energycannon/RefreshParts() return diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 4c492abc8d1..b560aa8e13b 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -12,7 +12,7 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" set desc = "Configure and launch a Centcom supplypod full of whatever your heart desires!" - set category = "Admin" + set category = "Admin - Events" var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum plaunch.ui_interact(usr)//datum has a tgui component, here we open the window diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index 09ce7dd6832..fa0281c621b 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -14,10 +14,10 @@ if(!isitem(O)) return 0 var/obj/item/I = O - if(!(getmaterialref(material_id) in I.custom_materials)) + if(!(SSmaterials.GetMaterialRef(material_id) in I.custom_materials)) return 0 - var/amount = I.custom_materials[getmaterialref(material_id)] + var/amount = I.custom_materials[SSmaterials.GetMaterialRef(material_id)] if(istype(I, /obj/item/stack/ore)) amount *= 0.8 // Station's ore redemption equipment is really goddamn good. diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 79834ac103d..276882e0f64 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1452,12 +1452,13 @@ /datum/supply_pack/service/janitor name = "Janitorial Supplies Crate" - desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, spray cleaner, rag, and trash bag." + desc = "Fight back against dirt and grime with Nanotrasen's Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, broom, spray cleaner, rag, and trash bag." cost = 1000 contains = list(/obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, /obj/item/mop, + /obj/item/twohanded/broom, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, /obj/item/clothing/suit/caution, @@ -1715,11 +1716,9 @@ /datum/supply_pack/organic/exoticseeds name = "Exotic Seeds Crate" - desc = "Any entrepreneuring botanist's dream. Contains fourteen different seeds, including three replica-pod seeds and two mystery seeds!" + desc = "Any entrepreneuring botanist's dream. Contains fourteen different seeds, including one replica-pod seed and two mystery seeds!" cost = 1500 contains = list(/obj/item/seeds/nettle, - /obj/item/seeds/replicapod, - /obj/item/seeds/replicapod, /obj/item/seeds/replicapod, /obj/item/seeds/plump, /obj/item/seeds/liberty, @@ -2367,6 +2366,22 @@ /obj/item/vending_refill/wardrobe/law_wardrobe) crate_name = "security department supply crate" +/datum/supply_pack/costumes_toys/mafia + name = "Cosa Nostra Starter Pack" + desc = "This crate contains everything you need to set up your own ethnicity-based racketeering operation." + cost = 1000 + contains = list() + contraband = TRUE + +/datum/supply_pack/costumes_toys/mafia/fill(obj/structure/closet/crate/C) + for(var/i in 1 to 4) + new /obj/effect/spawner/lootdrop/mafia_outfit(C) + new /obj/item/virgin_mary(C) + if(prob(30)) //Not all mafioso have mustaches, some people also find this item annoying. + new /obj/item/clothing/mask/fakemoustache/italian(C) + if(prob(10)) //A little extra sugar every now and then to shake things up. + new /obj/item/switchblade(C) + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Miscellaneous /////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index f153623ad24..1e363479a64 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -275,10 +275,10 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if(matches) if(C) message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)].") - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)].") + log_admin_private("Notice: [key_name(src)] has the same [matches] as [key_name(C)].") else message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(C)] (no longer logged in). ") - log_access("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") + log_admin_private("Notice: [key_name(src)] has the same [matches] as [key_name(C)] (no longer logged in).") if(GLOB.player_details[ckey]) player_details = GLOB.player_details[ckey] diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 2116081f132..6b7d8abcba3 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -102,13 +102,13 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") /client/proc/set_ooc(newColor as color) set name = "Set Player OOC Color" set desc = "Modifies player OOC Color" - set category = "Fun" + set category = "Server" GLOB.OOC_COLOR = sanitize_ooccolor(newColor) /client/proc/reset_ooc() set name = "Reset Player OOC Color" set desc = "Returns player OOC Color to default" - set category = "Fun" + set category = "Server" GLOB.OOC_COLOR = null /client/verb/colorooc() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 7397ac2ac5c..d6e1353b753 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -40,7 +40,7 @@ /obj/item/clothing/Initialize() - if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) + if((clothing_flags & VOICEBOX_TOGGLABLE)) actions_types += /datum/action/item_action/toggle_voice_box . = ..() if(ispath(pocket_storage_component_path)) diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 49954956000..1c7a66e3616 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -39,36 +39,3 @@ item_state = "spacepods" strip_delay = 100 //air pods don't fall out custom_premium_price = 1800 - -/obj/item/clothing/ears/headphones - name = "headphones" - desc = "Unce unce unce unce. Boop!" - icon = 'icons/obj/clothing/accessories.dmi' - icon_state = "headphones" - item_state = "headphones" - slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK //Fluff item, put it whereever you want! - actions_types = list(/datum/action/item_action/toggle_headphones) - var/headphones_on = FALSE - custom_price = 125 - -/obj/item/clothing/ears/headphones/Initialize() - . = ..() - update_icon() - -/obj/item/clothing/ears/headphones/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/ears/headphones/update_icon_state() - icon_state = "[initial(icon_state)]_[headphones_on? "on" : "off"]" - item_state = "[initial(item_state)]_[headphones_on? "on" : "off"]" - -/obj/item/clothing/ears/headphones/proc/toggle(owner) - headphones_on = !headphones_on - update_icon() - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.update_inv_ears() - H.update_inv_neck() - H.update_inv_head() - to_chat(owner, "You turn the music [headphones_on? "on. Untz Untz Untz!" : "off."]") diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 20b859af05f..6becb3f9abe 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -296,6 +296,12 @@ ..() user.cure_blind("blindfold_[REF(src)]") +/obj/item/clothing/glasses/trickblindfold + name = "blindfold" + desc = "A see-through blindfold perfect for cheating at games like pin the stun baton on the clown." + icon_state = "trickblindfold" + item_state = "blindfold" + /obj/item/clothing/glasses/blindfold/white name = "blind personnel blindfold" desc = "Indicates that the wearer suffers from blindness." diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 67eb8435656..e4ea0fba14d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -12,6 +12,53 @@ custom_price = 1200 custom_premium_price = 1200 +/obj/item/toy/sprayoncan + name = "spray-on insulation applicator" + desc = "What is the number one problem facing our station today?" + icon = 'icons/obj/clothing/gloves.dmi' + icon_state = "sprayoncan" + +/obj/item/toy/sprayoncan/afterattack(atom/target, mob/living/carbon/user, proximity) + if(iscarbon(target) && proximity) + var/mob/living/carbon/C = target + var/mob/living/carbon/U = user + var/success = C.equip_to_slot_if_possible(new /obj/item/clothing/gloves/color/yellow/sprayon, ITEM_SLOT_GLOVES, TRUE, TRUE) + if(success) + if(C == user) + C.visible_message("[U] sprays their hands with glittery rubber!") + else + C.visible_message("[U] sprays glittery rubber on the hands of [C]!") + else + C.visible_message("The rubber fails to stick to [C]'s hands!") + + qdel(src) + +/obj/item/clothing/gloves/color/yellow/sprayon + desc = "How're you gonna get 'em off, nerd?" + name = "spray-on insulated gloves" + icon_state = "sprayon" + item_state = "sprayon" + permeability_coefficient = 0 + resistance_flags = ACID_PROOF + var/shocks_remaining = 10 + +/obj/item/clothing/gloves/color/yellow/sprayon/Initialize() + .=..() + ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT) + +/obj/item/clothing/gloves/color/yellow/sprayon/equipped(mob/user, slot) + . = ..() + RegisterSignal(user, COMSIG_LIVING_SHOCK_PREVENTED, .proc/Shocked) + +/obj/item/clothing/gloves/color/yellow/sprayon/proc/Shocked() + shocks_remaining-- + if(shocks_remaining < 0) + qdel(src) //if we run out of uses, the gloves crumble away into nothing, just like my dreams after working with .dm + +/obj/item/clothing/gloves/color/yellow/sprayon/dropped() + .=..() + qdel(src) //loose nodrop items bad + /obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly." name = "budget insulated gloves" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 69dbbcbd3a2..ac1c8c53727 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -97,6 +97,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF /obj/item/clothing/head/hardhat/weldhat name = "welding hard hat" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 06aa84ec612..2738563313e 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -319,7 +319,7 @@ item_state = "rus_ushanka" body_parts_covered = HEAD cold_protection = HEAD - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT armor = list("melee" = 25, "bullet" = 20, "laser" = 20, "energy" = 30, "bomb" = 20, "bio" = 50, "rad" = 20, "fire" = -10, "acid" = 50) //LightToggle diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index ca690f9273a..edcc706e5ba 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -208,6 +208,16 @@ desc = "A really cool hat if you're a mobster. A really lame hat if you're not." pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/fedora +/obj/item/clothing/head/fedora/white + name = "white fedora" + icon_state = "fedora_white" + item_state = "fedora_white" + +/obj/item/clothing/head/fedora/beige + name = "beige fedora" + icon_state = "fedora_beige" + item_state = "fedora_beige" + /obj/item/clothing/head/fedora/suicide_act(mob/user) if(user.gender == FEMALE) return 0 diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index d456879f582..b9a5f32479e 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -321,7 +321,6 @@ if(paranoia) QDEL_NULL(paranoia) paranoia = new() - paranoia.clonable = FALSE user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC) to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ") diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index ce35025577b..c61c5d78cf6 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -10,9 +10,9 @@ var/adjusted_flags = null /obj/item/clothing/mask/attack_self(mob/user) - if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) - TOGGLE_BITFIELD(clothing_flags, VOICEBOX_DISABLED) - var/status = !CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED) + if((clothing_flags & VOICEBOX_TOGGLABLE)) + clothing_flags ^= (VOICEBOX_DISABLED) + var/status = !(clothing_flags & VOICEBOX_DISABLED) to_chat(user, "You turn the voice box in [src] [status ? "on" : "off"].") /obj/item/clothing/mask/equipped(mob/M, slot) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 3252b63e640..51528c016a3 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -80,7 +80,7 @@ modifies_speech = TRUE /obj/item/clothing/mask/pig/handle_speech(datum/source, list/speech_args) - if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + if(!(clothing_flags & VOICEBOX_DISABLED)) speech_args[SPEECH_MESSAGE] = pick("Oink!","Squeeeeeeee!","Oink Oink!") /obj/item/clothing/mask/pig/cursed @@ -106,7 +106,7 @@ modifies_speech = TRUE /obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak - if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + if(!(clothing_flags & VOICEBOX_DISABLED)) if(prob(5)) //sometimes, the angry spirit finds others words to speak. speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!") else @@ -135,7 +135,7 @@ modifies_speech = TRUE /obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args) - if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + if(!(clothing_flags & VOICEBOX_DISABLED)) speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!") /obj/item/clothing/mask/cowmask/cursed @@ -159,7 +159,7 @@ clothing_flags = VOICEBOX_TOGGLABLE /obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args) - if(!CHECK_BITFIELD(clothing_flags, VOICEBOX_DISABLED)) + if(!(clothing_flags & VOICEBOX_DISABLED)) speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") /obj/item/clothing/mask/horsehead/cursed diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 01bbfe414d5..fb1ab806dcb 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -76,9 +76,6 @@ if(!(M.failed_last_breath || M.losebreath)) lung_strength = "healthy" - if(M.stat == DEAD && heart && world.time - M.timeofdeath < DEFIB_TIME_LIMIT * 10) - heart_strength = "a faint, fluttery" - var/diagnosis = (body_part == BODY_ZONE_CHEST ? "You hear [heart_strength] pulse and [lung_strength] respiration." : "You faintly hear [heart_strength] pulse.") user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [M]'s [body_part]. [diagnosis]") return diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 1cbc765a642..1dbb155a269 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -1,3 +1,5 @@ +#define THERMAL_REGULATOR_COST 18 // the cost per tick for the thermal regulator + //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. // Meaning the the suit is defined directly after the corrisponding helmet. Just like below! /obj/item/clothing/head/helmet/space @@ -37,9 +39,177 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 50, "fire" = 80, "acid" = 70) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 equip_delay_other = 80 resistance_flags = NONE + actions_types = list(/datum/action/item_action/toggle_spacesuit) + var/temperature_setting = BODYTEMP_NORMAL /// The default temperature setting + var/obj/item/stock_parts/cell/cell = /obj/item/stock_parts/cell/high /// If this is a path, this gets created as an object in Initialize. + var/cell_cover_open = FALSE /// Status of the cell cover on the suit + var/thermal_on = FALSE /// Status of the thermal regulator + +/obj/item/clothing/suit/space/Initialize(mapload) + . = ..() + if(ispath(cell)) + cell = new cell(src) + +/// Start Processing on the space suit when it is worn to heat the wearer +/obj/item/clothing/suit/space/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_OCLOTHING) // Check that the slot is valid + START_PROCESSING(SSobj, src) + +// On removal stop processing, save battery +/obj/item/clothing/suit/space/dropped(mob/user) + . = ..() + STOP_PROCESSING(SSobj, src) + var/mob/living/carbon/human/human = user + if(istype(human)) + human.update_spacesuit_hud_icon("0") + +// Space Suit temperature regulation and power usage +/obj/item/clothing/suit/space/process() + var/mob/living/carbon/human/user = src.loc + if(!user || !ishuman(user) || !(user.wear_suit == src)) + return + if(!cell) + user.update_spacesuit_hud_icon("missing") + else + var/cell_percent = cell.charge / cell.maxcharge + if(cell_percent > 0.6) + user.update_spacesuit_hud_icon("high") + else if(cell_percent > 0.20) + user.update_spacesuit_hud_icon("mid") + else if(cell_percent > 0.01 && cell.charge > THERMAL_REGULATOR_COST) + user.update_spacesuit_hud_icon("low") + else + user.update_spacesuit_hud_icon("empty") + + if(thermal_on && cell.charge >= THERMAL_REGULATOR_COST) + user.adjust_bodytemperature((temperature_setting - user.bodytemperature), use_steps=TRUE, capped=FALSE) + cell.charge -= THERMAL_REGULATOR_COST + +// Clean up the cell on destroy +/obj/item/clothing/suit/space/Destroy() + if(cell) + QDEL_NULL(cell) + var/mob/living/carbon/human/human = src.loc + if(istype(human)) + human.update_spacesuit_hud_icon("0") + STOP_PROCESSING(SSobj, src) + return ..() + +// Clean up the cell on destroy +/obj/item/clothing/suit/space/handle_atom_del(atom/A) + if(A == cell) + cell = null + thermal_on = FALSE + return ..() + +// support for items that interact with the cell +/obj/item/clothing/suit/space/get_cell() + return cell + +// Show the status of the suit and the cell +/obj/item/clothing/suit/space/examine(mob/user) + . = ..() + if(!in_range(src, user) && !isobserver(user)) + return + + . += "The thermal regulator is [thermal_on ? "on" : "off"] and the temperature is set to \ + [round(temperature_setting-T0C,0.1)] °C ([round(temperature_setting*1.8-459.67,0.1)] °F)" + . += "The power meeter shows [cell ? "[round(cell.charge / cell.maxcharge * 100)]%" : "!invalid!"] charge remaining." + if(cell_cover_open) + . += "The cell cover is open exposing the cell and setting knobs." + if(!cell) + . += "The slot for a cell is empty." + else + . += "\The [cell] is firmly in place." + +// object handling for accessing features of the suit +/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_CROWBAR) + toggle_spacesuit_cell(user) + return + else if(cell_cover_open && I.tool_behaviour == TOOL_SCREWDRIVER) + var/range_low = 20 // Default min temp c + var/range_high = 45 // default max temp c + if(obj_flags & EMAGGED) + range_low = -20 // emagged min temp c + range_high = 120 // emagged max temp c + + var/deg_c = input(user, "What temperature would you like to set the thermal regulator to? \ + ([range_low]-[range_high] degrees celcius)") as null|num + if(deg_c && deg_c >= range_low && deg_c <= range_high) + temperature_setting = round(T0C + deg_c, 0.1) + to_chat(user, "You see the readout change to [deg_c] c.") + return + else if(cell_cover_open && istype(I, /obj/item/stock_parts/cell)) + if(cell) + to_chat(user, "[src] already has a cell installed.") + return + if(user.transferItemToLoc(I, src)) + cell = I + to_chat(user, "You successfully install \the [cell] into [src].") + return + return ..() + +/// Open the cell cover when ALT+Click on the suit +/obj/item/clothing/suit/space/AltClick(mob/living/user) + . = ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + toggle_spacesuit_cell(user) + +/// Remove the cell whent he cover is open on CTRL+Click +/obj/item/clothing/suit/space/CtrlClick(mob/living/user) + if(istype(user) && user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + if(cell_cover_open && cell) + remove_cell(user) + return + return ..() + +// Remove suit when using the suit on its self +/obj/item/clothing/suit/space/attack_self(mob/user) + remove_cell(user) + +/// Remove the cell from the suit if the over is open +/obj/item/clothing/suit/space/proc/remove_cell(mob/user) + if(cell_cover_open && cell) + user.visible_message("[user] removes \the [cell] from [src]!", \ + "You remove [cell].") + cell.add_fingerprint(user) + user.put_in_hands(cell) + cell = null + +/// Toggle the space suit's cell cover +/obj/item/clothing/suit/space/proc/toggle_spacesuit_cell(mob/user) + cell_cover_open = !cell_cover_open + to_chat(user, "You [cell_cover_open ? "open" : "close"] the cell cover on \the [src].") + +/// Toggle the space suit's thermal regulator status +/obj/item/clothing/suit/space/proc/toggle_spacesuit(mob/user) + thermal_on = !thermal_on + min_cold_protection_temperature = thermal_on ? SPACE_SUIT_MIN_TEMP_PROTECT : SPACE_SUIT_MIN_TEMP_PROTECT_OFF + to_chat(user, "You turn [thermal_on ? "on" : "off"] the thermal regulator on \the [src].") + +// let emags override the temperature settings +/obj/item/clothing/suit/space/emag_act(mob/user) + if(!(obj_flags & EMAGGED)) + obj_flags |= EMAGGED + user.visible_message("You emag [src], overwriting thermal regulator restrictions.") + log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], overwriting thermal regulator restrictions.") + playsound(src, "sparks", 50, TRUE) + +// zap the cell if we get hit with an emp +/obj/item/clothing/suit/space/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_CONTENTS) + return + if(cell) + cell.emp_act(severity) + +#undef THERMAL_REGULATOR_COST diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 7889c0a7cd4..b400d9f7806 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -23,7 +23,7 @@ desc = "An advanced spacesuit equipped with time-bluespace teleportation and anti-compression technology." icon_state = "chronosuit" item_state = "chronosuit" - actions_types = list(/datum/action/item_action/toggle) + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle) armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 90, "rad" = 90, "fire" = 100, "acid" = 1000) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) @@ -166,6 +166,7 @@ finish_chronowalk(user, to_turf) /obj/item/clothing/suit/space/chronos/process() + . = ..() if(activated) var/mob/living/carbon/human/user = src.loc if(user && ishuman(user) && (user.wear_suit == src)) @@ -178,8 +179,6 @@ camera.remove_target_ui() else new_camera(user) - else - STOP_PROCESSING(SSobj, src) /obj/item/clothing/suit/space/chronos/proc/activate() if(!activating && !activated && !teleporting) @@ -199,7 +198,6 @@ to_chat(user, "\[ ok \] Starting ui display driver") to_chat(user, "\[ ok \] Initializing chronowalk4-view") new_camera(user) - START_PROCESSING(SSobj, src) activated = 1 else to_chat(user, "\[ fail \] Mounting /dev/helm") diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index ca9c2e1a720..37274476003 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -1,3 +1,6 @@ +/// How much damage you take from an emp when wearing a hardsuit +#define HARDSUIT_EMP_BURN 2 // a very orange number + //Baseline hardsuits /obj/item/clothing/head/helmet/space/hardsuit name = "hardsuit helmet" @@ -101,7 +104,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet - actions_types = list(/datum/action/item_action/toggle_helmet) + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle_helmet) var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit var/obj/item/tank/jetpack/suit/jetpack = null var/hardsuit_type @@ -134,7 +137,7 @@ jetpack = I to_chat(user, "You successfully install the jetpack into [src].") return - else if(I.tool_behaviour == TOOL_SCREWDRIVER) + else if(!cell_cover_open && I.tool_behaviour == TOOL_SCREWDRIVER) if(!jetpack) to_chat(user, "[src] has no jetpack installed.") return @@ -165,7 +168,6 @@ new /obj/item/light/bulb/broken(drop_location()) return ..() - /obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) ..() if(jetpack) @@ -185,6 +187,18 @@ if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. return 1 +/// Burn the person inside the hard suit just a little, the suit got really hot for a moment +/obj/item/clothing/suit/space/emp_act(severity) + . = ..() + var/mob/living/carbon/human/user = src.loc + if(istype(user)) + user.apply_damage(HARDSUIT_EMP_BURN, BURN, spread_damage=TRUE) + to_chat(user, "You feel \the [src] heat up from the EMP burning you slightly.") + + // Chance to scream + if (user.stat < UNCONSCIOUS && prob(10)) + user.emote("scream") + //Engineering /obj/item/clothing/head/helmet/space/hardsuit/engine name = "engineering hardsuit helmet" @@ -247,6 +261,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/super //Mining hardsuit /obj/item/clothing/head/helmet/space/hardsuit/mining @@ -373,6 +388,7 @@ allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/hyper //Elite Syndie suit /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite @@ -403,6 +419,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF + cell = /obj/item/stock_parts/cell/bluespace /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug @@ -453,6 +470,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard + cell = /obj/item/stock_parts/cell/hyper /obj/item/clothing/suit/space/hardsuit/wizard/Initialize() . = ..() @@ -529,8 +547,7 @@ /obj/item/hand_tele, /obj/item/aicard) armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 20, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd - - + cell = /obj/item/stock_parts/cell/super //Security hardsuit /obj/item/clothing/head/helmet/space/hardsuit/security @@ -570,6 +587,7 @@ armor = list("melee" = 45, "bullet" = 25, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 100, "rad" = 50, "fire" = 95, "acid" = 95) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit + cell = /obj/item/stock_parts/cell/super //SWAT MKII /obj/item/clothing/head/helmet/space/hardsuit/swat @@ -597,6 +615,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat +// SWAT and Captain get EMP Protection /obj/item/clothing/suit/space/hardsuit/swat/Initialize() . = ..() allowed = GLOB.security_hardsuit_allowed @@ -614,6 +633,7 @@ icon_state = "caparmor" item_state = "capspacesuit" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat/captain + cell = /obj/item/stock_parts/cell/super //Clown /obj/item/clothing/head/helmet/space/hardsuit/clown @@ -726,8 +746,6 @@ s.start() owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- - if(recharge_rate) - START_PROCESSING(SSobj, src) if(current_charges <= 0) owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" @@ -737,16 +755,15 @@ /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() - STOP_PROCESSING(SSobj, src) return ..() /obj/item/clothing/suit/space/hardsuit/shielded/process() - if(world.time > recharge_cooldown && current_charges < max_charges) + . = ..() + if(recharge_rate && world.time > recharge_cooldown && current_charges < max_charges) current_charges = CLAMP((current_charges + recharge_rate), 0, max_charges) playsound(loc, 'sound/magic/charge.ogg', 50, TRUE) if(current_charges == max_charges) playsound(loc, 'sound/machines/ding.ogg', 50, TRUE) - STOP_PROCESSING(SSobj, src) shield_state = "[shield_on]" if(ishuman(loc)) var/mob/living/carbon/human/C = loc @@ -887,3 +904,5 @@ strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() + +#undef HARDSUIT_EMP_BURN diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index aff8f601fe7..ce4b4213dc9 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -42,6 +42,7 @@ Contains: resistance_flags = FIRE_PROOF | ACID_PROOF helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad dog_fashion = /datum/dog_fashion/back/deathsquad + cell = /obj/item/stock_parts/cell/bluespace //NEW SWAT suit /obj/item/clothing/suit/space/swat @@ -186,6 +187,12 @@ Contains: strip_delay = 130 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + cell = /obj/item/stock_parts/cell/bluespace + +// ERT suit's gets EMP Protection +/obj/item/clothing/suit/space/hardsuit/ert/Initialize() + . = ..() + AddComponent(/datum/component/empprotection, EMP_PROTECT_CONTENTS) //ERT Security /obj/item/clothing/head/helmet/space/hardsuit/ert/sec @@ -426,3 +433,4 @@ Contains: armor = list("melee" = 60, "bullet" = 40, "laser" = 40, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF + cell = /obj/item/stock_parts/cell/hyper diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 94c6154d7c7..a227fdd5fe1 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -159,6 +159,8 @@ /obj/item/clothing/head/helmet/space/plasmaman/prisoner name = "prisoner's plasma envirosuit helmet" desc = "A plasmaman containment helmet for prisoners." + icon_state = "prisoner_envirohelm" + item_state = "prisoner_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/medical name = "medical doctor's plasma envirosuit helmet" diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 9c9950e06c8..e1c40d2c011 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -14,7 +14,7 @@ w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) armor = list("melee" = 40, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 80, "acid" = 85) - + cell = /obj/item/stock_parts/cell/hyper //Green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 206402a4360..e38c0d11f57 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -766,3 +766,9 @@ icon_state = "capformal" item_state = "capspacesuit" armor = list("melee" = 25, "bullet" = 15, "laser" = 25, "energy" = 35, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) + +/obj/item/clothing/suit/hawaiian + name = "hawaiian overshirt" + desc = "A cool shirt for chilling on the beach." + icon_state = "hawaiian_blue" + item_state = "hawaiian_blue" diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 5c0312ce926..e728709f046 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -118,3 +118,9 @@ desc = "A white suit and jacket with a blue shirt. You wanna play rough? OKAY!" icon_state = "white_suit" item_state = "white_suit" + +/obj/item/clothing/under/suit/beige + name = "beige suit" + desc = "An excellent light colored suit, experts in the field stress that it should not to be confused with the inferior tan suit." + icon_state = "beige_suit" + item_state = "beige_suit" diff --git a/code/modules/discord/accountlink.dm b/code/modules/discord/accountlink.dm index 1dbac09a3e7..72ce0c1f442 100644 --- a/code/modules/discord/accountlink.dm +++ b/code/modules/discord/accountlink.dm @@ -1,6 +1,6 @@ // Verb to link discord accounts to BYOND accounts /client/verb/linkdiscord() - set category = "Special Verbs" + set category = "OOC" set name = "Link Discord Account" set desc = "Link your discord account to your BYOND account." diff --git a/code/modules/discord/toggle_notify.dm b/code/modules/discord/toggle_notify.dm index 5eb1492f757..87cb63d0508 100644 --- a/code/modules/discord/toggle_notify.dm +++ b/code/modules/discord/toggle_notify.dm @@ -1,6 +1,6 @@ // Verb to toggle restart notifications /client/verb/notify_restart() - set category = "Special Verbs" + set category = "OOC" set name = "Notify Restart" set desc = "Notifies you on Discord when the server restarts." diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 47e52a08fbf..b0357e2e4bc 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -251,7 +251,7 @@ holder.obj_integrity = holder.max_integrity /datum/spacevine_mutation/woodening/on_hit(obj/structure/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage) - if(I.get_sharpness()) + if(I && I.get_sharpness()) . = expected_damage * 0.5 else . = expected_damage diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm index 98656db35f9..d947d76d33c 100644 --- a/code/modules/events/vent_clog.dm +++ b/code/modules/events/vent_clog.dm @@ -44,7 +44,7 @@ var/cockroaches = prob(33) ? 3 : 0 while(cockroaches) - new /mob/living/simple_animal/cockroach(get_turf(vent)) + new /mob/living/simple_animal/hostile/cockroach(get_turf(vent)) cockroaches-- CHECK_TICK @@ -95,7 +95,7 @@ R.my_atom = vent R.add_reagent(/datum/reagent/consumable/ethanol/beer, reagentsAmount) - R.create_foam(200) + R.create_foam(/datum/effect_system/foam_spread,200) CHECK_TICK /datum/round_event/vent_clog/plasma_decon/announce() diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 8c98ba1dd68..b2719c03a78 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -10,7 +10,7 @@ for(var/obj/item/I in world) CHECK_TICK - if(!(I.flags_1 & INITIALIZED_1)) + if(!(I.flags_1 & INITIALIZED_1) || QDELETED(I)) continue I.AddComponent(/datum/component/fantasy) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 09c12ce8e3d..fc146281b6e 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -8,7 +8,7 @@ icon_state = null lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi' - reagent_flags = OPENCONTAINER + reagent_flags = OPENCONTAINER | DUNKABLE var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. possible_transfer_amounts = list(5,10,15,20,25,30,50) volume = 50 @@ -284,6 +284,7 @@ if(cap_on) spillable = FALSE add_overlay(cap_overlay, TRUE) + update_icon() /obj/item/reagent_containers/food/drinks/waterbottle/examine(mob/user) . = ..() @@ -328,11 +329,19 @@ return FALSE . = ..() -/obj/item/reagent_containers/food/drinks/waterbottle/attack(mob/M, mob/user, obj/target) - if(cap_on && reagents.total_volume && istype(M)) - to_chat(user, "You must remove the cap before you can do that!") +/obj/item/reagent_containers/food/drinks/waterbottle/attack(mob/target, mob/user, def_zone) + if(!target) return - . = ..() + + if(user.a_intent != INTENT_HARM) + if(cap_on && reagents.total_volume && istype(target)) + to_chat(user, "You must remove the cap before you can do that!") + return + + return ..() + + if(!cap_on) + SplashReagents(target) /obj/item/reagent_containers/food/drinks/waterbottle/afterattack(obj/target, mob/user, proximity) if(cap_on && (target.is_refillable() || target.is_drainable() || (reagents.total_volume && user.a_intent == INTENT_HARM))) @@ -615,7 +624,7 @@ /obj/item/reagent_containers/food/drinks/soda_cans/proc/open_soda(mob/user) to_chat(user, "You pull back the tab of \the [src] with a satisfying pop.") //Ahhhhhhhh - ENABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags |= OPENCONTAINER playsound(src, "can_open", 50, TRUE) spillable = TRUE @@ -658,7 +667,7 @@ /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry name = "Sol Dry" desc = "Maybe this will help your tummy feel better. Maybe not." - icon_state = "ginger_ale" + icon_state = "sol_dry" list_reagents = list(/datum/reagent/consumable/sol_dry = 30) foodtype = SUGAR diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 0c79f436033..037a64f3480 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -5,7 +5,6 @@ /// the parent to the exclusion list in code/__HELPERS/unsorted.dm's /// get_random_food proc. //////////////////////////////////////////////////////////////////////////////// -#define STOP_SERVING_BREAKFAST (15 MINUTES) /obj/item/reagent_containers/food possible_transfer_amounts = list() @@ -46,5 +45,3 @@ if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time - -#undef STOP_SERVING_BREAKFAST diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index da427e9a69a..919ad88748b 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -45,7 +45,6 @@ All foods are distributed among various categories. Use common sense. var/eatverb var/dried_type = null var/dry = 0 - var/dunkable = FALSE // for dunkable food, make true var/dunk_amount = 10 // how much reagent is transferred per dunk var/cooked_type = null //for microwave cooking. path of the resulting item after microwaving var/filling_color = "#FFFFFF" //color to use when added to custom food. @@ -332,21 +331,6 @@ All foods are distributed among various categories. Use common sense. M.emote("me", 1, "[sattisfaction_text]") qdel(src) -/obj/item/reagent_containers/food/snacks/afterattack(obj/item/reagent_containers/M, mob/user, proximity) - . = ..() - if(!dunkable || !proximity) - return - if(istype(M, /obj/item/reagent_containers/glass) || istype(M, /obj/item/reagent_containers/food/drinks)) //you can dunk dunkable snacks into beakers or drinks - if(!M.is_drainable()) - to_chat(user, "[M] is unable to be dunked in!") - return - if(M.reagents.trans_to(src, dunk_amount, transfered_by = user)) //if reagents were transfered, show the message - to_chat(user, "You dunk \the [src] into \the [M].") - return - if(!M.reagents.total_volume) - to_chat(user, "[M] is empty!") - else - to_chat(user, "[src] is full!") // //////////////////////////////////////////////Store//////////////////////////////////////// /// All the food items that can store an item inside itself, like bread or cake. diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index e6ddfcf3795..8f49b5286e6 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -5,7 +5,10 @@ slices_num = 5 tastes = list("bread" = 10) foodtype = GRAIN - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/store/bread/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/breadslice icon = 'icons/obj/food/burgerbread.dmi' @@ -16,7 +19,10 @@ slot_flags = ITEM_SLOT_HEAD customfoodfilling = 0 //to avoid infinite bread-ception foodtype = GRAIN - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/breadslice/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/store/bread/plain name = "bread" diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index b2447460cf4..694fbd55fff 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -6,7 +6,7 @@ /obj/item/reagent_containers/food/snacks/icecreamsandwich name = "icecream sandwich" desc = "Portable Ice-cream in its own packaging." - icon = 'icons/obj/food/food.dmi' + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "icecreamsandwich" bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/ice = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/ice = 2) @@ -16,6 +16,7 @@ /obj/item/reagent_containers/food/snacks/spacefreezy name = "space freezy" desc = "The best icecream in space." + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "spacefreezy" bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/bluecherryjelly = 5, /datum/reagent/consumable/nutriment/vitamin = 4) @@ -26,6 +27,7 @@ /obj/item/reagent_containers/food/snacks/sundae name = "sundae" desc = "A classic dessert." + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "sundae" bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 1) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 5, /datum/reagent/consumable/nutriment/vitamin = 2) @@ -36,6 +38,7 @@ /obj/item/reagent_containers/food/snacks/honkdae name = "honkdae" desc = "The clown's favorite dessert." + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "honkdae" bonus_reagents = list(/datum/reagent/consumable/nutriment = 2, /datum/reagent/consumable/nutriment/vitamin = 2) list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/banana = 10, /datum/reagent/consumable/nutriment/vitamin = 4) @@ -50,7 +53,7 @@ /obj/item/reagent_containers/food/snacks/snowcones //We use this as a base for all other snowcones name = "flavorless snowcone" desc = "It's just shaved ice. Still fun to chew on." - icon = 'icons/obj/food/snowcones.dmi' + icon = 'icons/obj/food/frozen_treats.dmi' icon_state = "flavorless_sc" trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups bonus_reagents = list(/datum/reagent/water = 10) //Base line will allways give water @@ -188,3 +191,81 @@ icon_state = "rainbow_sc" list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/laughter = 25) tastes = list("ice" = 1, "water" = 1, "sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3) + +/obj/item/reagent_containers/food/snacks/popsicle + name = "bug popsicle" + desc = "Mmmm, this should not exist." + icon = 'icons/obj/food/frozen_treats.dmi' + icon_state = "popsicle_stick_s" + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 4) + tastes = list("beetlejuice") + trash = /obj/item/popsicle_stick + w_class = WEIGHT_CLASS_SMALL + var/overlay_state = "creamsicle_o" //This is the edible part of the popsicle. + var/bite_states = 4 //This value value is used for correctly setting the bitesize to ensure every bite changes the sprite. Do not set to zero. + foodtype = DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/popsicle/Initialize() + . = ..() + bitesize = reagents.total_volume / bite_states + +/obj/item/reagent_containers/food/snacks/popsicle/update_overlays() + . = ..() + if(bitecount) + . += "[initial(overlay_state)]_[min(bitecount, 3)]" + else + . += initial(overlay_state) + +/obj/item/reagent_containers/food/snacks/popsicle/On_Consume(mob/living/eater) + . = ..() + update_icon() + +/obj/item/popsicle_stick + name = "popsicle stick" + icon = 'icons/obj/food/frozen_treats.dmi' + icon_state = "popsicle_stick" + desc = "This humble little stick usually carries a frozen treat, at the moment it seems freed from this atlassian burden." + custom_materials = list(/datum/material/wood=20) + w_class = WEIGHT_CLASS_TINY + force = 0 + +/obj/item/reagent_containers/food/snacks/popsicle/creamsicle_orange + name = "orange creamsicle" + desc = "A classic orange creamsicle. A sunny frozen treat." + list_reagents = list(/datum/reagent/consumable/orangejuice = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 4) + bonus_reagents = list(/datum/reagent/consumable/orangejuice = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 4) + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/popsicle/creamsicle_berry + name = "berry creamsicle" + desc = "A vibrant berry creamsicle. A berry good frozen treat." + list_reagents = list(/datum/reagent/consumable/berryjuice = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 4) + bonus_reagents = list(/datum/reagent/consumable/berryjuice = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 2, /datum/reagent/consumable/sugar = 4) + overlay_state = "creamsicle_m" + foodtype = FRUIT | DAIRY | SUGAR + +/obj/item/reagent_containers/food/snacks/popsicle/jumbo + name = "jumbo icecream" + desc = "A luxurius icecream covered in rich chocolate. It seems smaller than you remember it being." + list_reagents = list(/datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 3, /datum/reagent/consumable/sugar = 4) + bonus_reagents = list(/datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 3, /datum/reagent/consumable/sugar = 2) + overlay_state = "jumbo" + +/obj/item/reagent_containers/food/snacks/popsicle/nogga_black + name = "nogga black" + desc = "A salty licorice icecream recently reintroduced due to all the records of the controversy being lost to time. Those who cannot remember the past are doomed to repeat it." + list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 1, /datum/reagent/consumable/sugar = 4) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 1, /datum/reagent/consumable/sugar = 4) + tastes = list("salty liquorice") + overlay_state = "nogga_black" + +/obj/item/reagent_containers/food/snacks/cornuto + name = "cornuto" + w_class = WEIGHT_CLASS_SMALL + icon = 'icons/obj/food/frozen_treats.dmi' + icon_state = "cornuto" + desc = "A neapolitan vanilla and chocolate icecream cone. It menaces with a sprinkling of caramelized nuts." + tastes = list("chopped hazelnuts", "waffle") + list_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 4, /datum/reagent/consumable/sugar = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/hot_coco = 4, /datum/reagent/consumable/cream = 2, /datum/reagent/consumable/vanilla = 4, /datum/reagent/consumable/sugar = 1) + foodtype = DAIRY | SUGAR diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 202bb9edf85..f2ebbc43db0 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -131,8 +131,9 @@ name = "salami" desc = "A slice of cured salami." icon_state = "salami" + filling_color = "#CD4122" list_reagents = list(/datum/reagent/consumable/nutriment = 1) - tastes = list("meat" = 1) + tastes = list("meat" = 1, "smoke" = 1) foodtype = MEAT /obj/item/reagent_containers/food/snacks/rawkhinkali diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index b16846f613a..8e93b8b4782 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -98,7 +98,10 @@ filling_color = "#FFD700" tastes = list("fries" = 3, "salt" = 1) foodtype = VEGETABLES | GRAIN | FRIED - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/fries/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/tatortot name = "tator tot" @@ -108,7 +111,10 @@ filling_color = "FFD700" tastes = list("potato" = 3, "valids" = 1) foodtype = FRIED | VEGETABLES - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/tatortot/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/soydope name = "soy dope" @@ -130,7 +136,10 @@ filling_color = "#FFD700" tastes = list("fries" = 3, "cheese" = 1) foodtype = VEGETABLES | GRAIN | DAIRY - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/cheesyfries/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/badrecipe name = "burned mess" @@ -149,7 +158,10 @@ filling_color = "#FFA500" tastes = list("carrots" = 3, "salt" = 1) foodtype = VEGETABLES - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/carrotfries/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/candiedapple name = "candied apple" @@ -620,7 +632,7 @@ /obj/item/reagent_containers/food/snacks/canned/proc/open_can(mob/user) to_chat(user, "You pull back the tab of \the [src].") playsound(user.loc, 'sound/items/foodcanopen.ogg', 50) - ENABLE_BITFIELD(reagents.flags, OPENCONTAINER) + reagents.flags |= OPENCONTAINER spillable = TRUE /obj/item/reagent_containers/food/snacks/canned/attack_self(mob/user) diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index d7269b64c02..fd589a3ffb1 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -13,7 +13,6 @@ filling_color = "#D2691E" tastes = list("donut" = 1) foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST - dunkable = TRUE var/decorated_icon = "donut_homer" var/is_decorated = FALSE var/extra_reagent = null @@ -24,6 +23,10 @@ if(prob(30)) decorate_donut() +/obj/item/reagent_containers/food/snacks/donut/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) + /obj/item/reagent_containers/food/snacks/donut/proc/decorate_donut() if(is_decorated || !decorated_icon) return @@ -546,7 +549,10 @@ filling_color = "#F0E68C" tastes = list("cookie" = 1) foodtype = GRAIN | SUGAR - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/cookie/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/fortunecookie name = "fortune cookie" @@ -639,7 +645,10 @@ filling_color = "#CD853F" tastes = list("sweetness" = 1) foodtype = GRAIN | JUNKFOOD | SUGAR - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/sugarcookie/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/chococornet name = "chocolate cornet" @@ -660,7 +669,10 @@ filling_color = "#D2691E" tastes = list("cookie" = 2, "oat" = 1) foodtype = GRAIN - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/oatmealcookie/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/raisincookie name = "raisin cookie" @@ -671,7 +683,10 @@ filling_color = "#F0E68C" tastes = list("cookie" = 1, "raisins" = 1) foodtype = GRAIN | FRUIT - dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/raisincookie/Initialize() + . = ..() + AddElement(/datum/element/dunkable, 10) /obj/item/reagent_containers/food/snacks/cherrycupcake name = "cherry cupcake" diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 72fc79754fd..58b7ede754b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -310,8 +310,8 @@ for(var/obj/item/O in ingredients) O.microwave_act(src) if(O.custom_materials && length(O.custom_materials)) - if(O.custom_materials[getmaterialref(/datum/material/iron)]) - metal += O.custom_materials[getmaterialref(/datum/material/iron)] + if(O.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]) + metal += O.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] if(metal) spark() diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 6ae06346636..3d2bf21ac37 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -28,7 +28,7 @@ /obj/machinery/processor/proc/process_food(datum/food_processor_process/recipe, atom/movable/what) if (recipe.output && loc && !QDELETED(src)) - for(var/i = 0, i < rating_amount, i++) + for(var/i = 0, i < (rating_amount * recipe.multiplier), i++) new recipe.output(drop_location()) if (ismob(what)) var/mob/themob = what diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index cc63ff43b5f..4ed027dcdd2 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -3,6 +3,7 @@ var/output var/time = 40 var/required_machine = /obj/machinery/processor + var/multiplier = 1 //This multiplies the number of products produced per object processed. /datum/food_processor_process/meat input = /obj/item/reagent_containers/food/snacks/meat/slab @@ -52,3 +53,8 @@ input = /mob/living/simple_animal/slime output = null required_machine = /obj/machinery/processor/slime + +/datum/food_processor_process/towercap + input = /obj/item/grown/log + output = /obj/item/popsicle_stick + multiplier = 3 diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index 4c055ff2951..aec81e1785f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -46,6 +46,18 @@ result = /obj/item/reagent_containers/food/snacks/honkdae subcategory = CAT_ICE +/datum/crafting_recipe/food/cornuto + name = "Cornuto" + reqs = list( + /obj/item/reagent_containers/food/snacks/pastrybase = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 1, + /datum/reagent/consumable/cream = 4, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/sugar = 4 + ) + result = /obj/item/reagent_containers/food/snacks/cornuto + subcategory = CAT_ICE + //////////////////////////SNOW CONES/////////////////////// /datum/crafting_recipe/food/flavorless_sc @@ -229,3 +241,61 @@ ) result = /obj/item/reagent_containers/food/snacks/snowcones/rainbow subcategory = CAT_ICE + +//////////////////////////POPSICLES/////////////////////// + +// This section includes any frozen treat served on a stick. +//////////////////////////////////////////////////////////// + +/datum/crafting_recipe/food/orange_popsicle + name = "Orange popsicle" + reqs = list( + /obj/item/popsicle_stick = 1, + /datum/reagent/consumable/orangejuice = 4, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 2, + /datum/reagent/consumable/sugar = 2 + ) + result = /obj/item/reagent_containers/food/snacks/popsicle/creamsicle_orange + subcategory = CAT_ICE + +/datum/crafting_recipe/food/berry_popsicle + name = "Berry popsicle" + reqs = list( + /obj/item/popsicle_stick = 1, + /datum/reagent/consumable/berryjuice = 4, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 2, + /datum/reagent/consumable/sugar = 2 + ) + result = /obj/item/reagent_containers/food/snacks/popsicle/creamsicle_berry + subcategory = CAT_ICE + +/datum/crafting_recipe/food/jumbo + name = "Jumbo icecream" + reqs = list( + /obj/item/popsicle_stick = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 1, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 3, + /datum/reagent/consumable/sugar = 2 + ) + result = /obj/item/reagent_containers/food/snacks/popsicle/jumbo + subcategory = CAT_ICE + +/datum/crafting_recipe/food/nogga_black + name = "Nogga black" + reqs = list( + /obj/item/popsicle_stick = 1, + /datum/reagent/consumable/blumpkinjuice = 4, //natural source of ammonium chloride + /datum/reagent/consumable/sodiumchloride = 2, + /datum/reagent/consumable/ice = 2, + /datum/reagent/consumable/cream = 2, + /datum/reagent/consumable/vanilla = 2, + /datum/reagent/consumable/sugar = 2 + ) + result = /obj/item/reagent_containers/food/snacks/popsicle/nogga_black + subcategory = CAT_ICE diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 2d620e1d81b..11d7acdbe71 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -194,7 +194,7 @@ dat += "x5" if(ispath(D.build_path, /obj/item/stack)) dat += "x10" - dat += "([D.materials[getmaterialref(/datum/material/biomass)]/efficiency])
" + dat += "([D.materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]/efficiency])
" dat += "" else dat += "
No container inside, please insert container.
" @@ -236,14 +236,14 @@ menustat = "void" /obj/machinery/biogenerator/proc/check_cost(list/materials, multiplier = 1, remove_points = TRUE) - if(materials.len != 1 || materials[1] != getmaterialref(/datum/material/biomass)) + if(materials.len != 1 || materials[1] != SSmaterials.GetMaterialRef(/datum/material/biomass)) return FALSE - if (materials[getmaterialref(/datum/material/biomass)]*multiplier/efficiency > points) + if (materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency > points) menustat = "nopoints" return FALSE else if(remove_points) - points -= materials[getmaterialref(/datum/material/biomass)]*multiplier/efficiency + points -= materials[SSmaterials.GetMaterialRef(/datum/material/biomass)]*multiplier/efficiency update_icon() updateUsrDialog() return TRUE diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 2de01eb8544..f0f3f12ffb6 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -56,12 +56,12 @@ /obj/structure/fermenting_barrel/attack_hand(mob/user) open = !open if(open) - DISABLE_BITFIELD(reagents.flags, DRAINABLE) - ENABLE_BITFIELD(reagents.flags, REFILLABLE) + reagents.flags &= ~(DRAINABLE) + reagents.flags |= REFILLABLE to_chat(user, "You open [src], letting you fill it.") else - ENABLE_BITFIELD(reagents.flags, DRAINABLE) - DISABLE_BITFIELD(reagents.flags, REFILLABLE) + reagents.flags |= DRAINABLE + reagents.flags &= ~(REFILLABLE) to_chat(user, "You close [src], letting you draw from its tap.") update_icon() diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index a561a82fe4a..eb6a4c965b8 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -99,13 +99,13 @@ if(..()) if(prob(50)) user.Paralyze(100) - to_chat(user, "You are stunned by the Deathnettle as you try picking it up!") + to_chat(user, "You are stunned by [src] as you try picking it up!") /obj/item/reagent_containers/food/snacks/grown/nettle/death/attack(mob/living/carbon/M, mob/user) if(!..()) return if(isliving(M)) - to_chat(M, "You are stunned by the powerful acid of the Deathnettle!") + to_chat(M, "You are stunned by the powerful acid of [src]!") log_combat(user, M, "attacked", src) M.adjust_blurriness(force/7) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index d435a9a7d3f..c902f18f391 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1,3 +1,5 @@ +#define TRAY_NAME_UPDATE name = myseed ? "[initial(name)] ([myseed.plantname])" : initial(name) + /obj/machinery/hydroponics name = "hydroponics tray" icon = 'icons/obj/hydroponics/equipment.dmi' @@ -90,7 +92,6 @@ return connected - /obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables. if(!myseed) return ..() @@ -388,12 +389,7 @@ pestlevel = 0 // Reset update_icon() visible_message("The [oldPlantName] is overtaken by some [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) - + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutate(lifemut = 2, endmut = 5, productmut = 1, yieldmut = 2, potmut = 25, wrmut = 2, wcmut = 5, traitmut = 0) // Mutates the current seed if(!myseed) @@ -427,12 +423,7 @@ sleep(5) // Wait a while update_icon() visible_message("[oldPlantName] suddenly mutates into [myseed.plantname]!") - name = "hydroponics tray ([myseed.plantname])" - if(myseed.product) - desc = initial(myseed.product.desc) - else - desc = initial(desc) - + TRAY_NAME_UPDATE /obj/machinery/hydroponics/proc/mutateweed() // If the weeds gets the mutagent instead. Mind you, this pretty much destroys the old plant if( weedlevel > 5 ) @@ -452,6 +443,7 @@ sleep(5) // Wait a while update_icon() visible_message("The mutated weeds in [src] spawn some [myseed.plantname]!") + TRAY_NAME_UPDATE else to_chat(usr, "The few weeds in [src] seem to react, but only for a moment...") @@ -797,15 +789,7 @@ to_chat(user, "You plant [O].") dead = 0 myseed = O - name = "hydroponics tray ([myseed.plantname])" - if(!myseed.productdesc) //we haven't changed our produce's description - if(myseed.product) - myseed.productdesc = initial(myseed.product.desc) - else if(myseed.desc) - myseed.productdesc = myseed.desc - else - myseed.productdesc = "A fascinating specimen." - desc = myseed.productdesc + TRAY_NAME_UPDATE age = 1 plant_health = myseed.endurance lastcycle = world.time @@ -907,8 +891,7 @@ qdel(myseed) myseed = null update_icon() - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE else if(user) examine(user) @@ -926,8 +909,7 @@ qdel(myseed) myseed = null dead = 0 - name = initial(name) - desc = initial(desc) + TRAY_NAME_UPDATE 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./// @@ -970,6 +952,7 @@ desc = "A patch of dirt." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "soil" + gender = PLURAL circuit = null density = FALSE use_power = NO_POWER_USE diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index a7cec2c2a55..bfa336e2c27 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -132,17 +132,17 @@ /proc/get_all_accesses() return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, - ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD, - ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, - ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, - ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, - ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, - ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, + ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_RD, + ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_CHEMISTRY, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_MAINT_TUNNELS, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, + ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, + ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, + ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, + ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, - ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_PHARMACY, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) + ACCESS_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_PHARMACY, ACCESS_RC_ANNOUNCE, + ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK) /proc/get_all_centcom_access() return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_MEDICAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE, ACCESS_CENT_TELEPORTER, ACCESS_CENT_CAPTAIN) @@ -170,7 +170,7 @@ if(2) //security return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_MECH_SECURITY, ACCESS_HOS) if(3) //medbay - return list(ACCESS_MEDICAL, ACCESS_CLONING, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_CMO, ACCESS_PHARMACY) + return list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_CMO, ACCESS_PHARMACY) if(4) //research return list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_GENETICS, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_MECH_SCIENCE, ACCESS_MINISAT, ACCESS_RD, ACCESS_NETWORK) if(5) //engineering and maintenance @@ -321,8 +321,6 @@ return "Weapon Permit" if(ACCESS_NETWORK) return "Network Access" - if(ACCESS_CLONING) - return "Cloning Room" if(ACCESS_MECH_MINING) return "Mining Mech Access" if(ACCESS_MECH_MEDICAL) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 1c519a0716a..e9368382b5d 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -13,7 +13,7 @@ outfit = /datum/outfit/job/chemist - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_PHARMACY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_PHARMACY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 012715ffe26..d257958989d 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -18,10 +18,10 @@ outfit = /datum/outfit/job/cmo - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_PHARMACY, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE, ACCESS_MECH_MEDICAL, ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS) paycheck = PAYCHECK_COMMAND diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 24dcb487b58..e46a74ff814 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -7,14 +7,14 @@ total_positions = 2 spawn_positions = 2 supervisors = "the research director" - selection_color = "#ffeef0" + selection_color = "#ffeeff" exp_type = EXP_TYPE_CREW exp_requirements = 60 outfit = /datum/outfit/job/geneticist - access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) - minimal_access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE) + minimal_access = list(ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 4a76250f0eb..63c0d2376c3 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -11,8 +11,8 @@ outfit = /datum/outfit/job/doctor - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_PHARMACY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_PHARMACY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_PHARMACY) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 61fbfacee25..ebdcdf9e71d 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -11,8 +11,8 @@ outfit = /datum/outfit/job/paramedic - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) - minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS, ACCESS_EVA, ACCESS_ENGINE, ACCESS_CARGO, ACCESS_HYDROPONICS, ACCESS_RESEARCH) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 290c3d11c58..2d5a8d1b031 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -4,7 +4,7 @@ department_head = list("The Security Team") department_flag = CIVILIAN faction = "Station" - total_positions = 2 + total_positions = 0 spawn_positions = 2 supervisors = "the security team" diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index a1cb6240825..af1b50da708 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S accessory = /obj/item/clothing/accessory/armband/engine if(SEC_DEPT_MEDICAL) ears = /obj/item/radio/headset/headset_sec/alt/department/med - dep_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING) + dep_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY) destination = /area/security/checkpoint/medical spawn_point = locate(/obj/effect/landmark/start/depsec/medical) in GLOB.department_security_spawns accessory = /obj/item/clothing/accessory/armband/medblue diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index a3bb23b05f9..d2da4cce80b 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -13,7 +13,7 @@ outfit = /datum/outfit/job/virologist - access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM) + access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_GENETICS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MECH_MEDICAL, ACCESS_MINERAL_STOREROOM) paycheck = PAYCHECK_MEDIUM paycheck_department = ACCOUNT_MED diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index b00b2795049..15917aef063 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -145,14 +145,6 @@ else icon_state = "book-5" -/obj/structure/bookcase/manuals/medical - name = "medical manuals bookcase" - -/obj/structure/bookcase/manuals/medical/Initialize() - . = ..() - new /obj/item/book/manual/wiki/medical_cloning(src) - update_icon() - /obj/structure/bookcase/manuals/engineering name = "engineering manuals bookcase" diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index cb5c534bde6..dfa98dbe7d0 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -187,7 +187,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) if(target_type && !istype(A,target_type)) continue var/cargs = build_args() - A.AddComponent(arglist(cargs)) + A._AddComponent(cargs) qdel(src) return diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 64151c75585..d3c53644096 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -204,7 +204,7 @@ new /obj/item/dnainjector/wackymut(src) if(91) for(var/i in 1 to 30) - new /mob/living/simple_animal/cockroach(src) + new /mob/living/simple_animal/hostile/cockroach(src) if(92) new /obj/item/katana(src) if(93) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index e9f08a780ef..ca3ace93d2f 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -70,13 +70,9 @@ /obj/item/clothing/suit/space/hostile_environment/Initialize() . = ..() AddComponent(/datum/component/spraycan_paintable) - START_PROCESSING(SSobj, src) - -/obj/item/clothing/suit/space/hostile_environment/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() /obj/item/clothing/suit/space/hostile_environment/process() + . = ..() var/mob/living/carbon/C = loc if(istype(C) && prob(2)) //cursed by bubblegum if(prob(15)) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index e755393d1e3..386fb930a44 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -110,9 +110,6 @@ go_inert() return ..() -/obj/item/organ/regenerative_core/prepare_eat() - return null - /*************************Legion core********************/ /obj/item/organ/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 20536442b0e..78bc44263bc 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -86,7 +86,7 @@ proximity_monitor = new(src, 1) AddComponent(/datum/component/material_container, list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace), INFINITY, TRUE, /obj/item/stack) stored_research = new /datum/techweb/specialized/autounlocking/smelter - selected_material = getmaterialref(/datum/material/iron) + selected_material = SSmaterials.GetMaterialRef(/datum/material/iron) /obj/machinery/mineral/processing_unit/Destroy() CONSOLE = null diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 92aadd3ca04..0f2b8d70613 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -15,14 +15,20 @@ GLOBAL_LIST_EMPTY(silo_access_logs) /obj/machinery/ore_silo/Initialize(mapload) . = ..() - AddComponent(/datum/component/material_container, - list(/datum/material/iron, /datum/material/glass, /datum/material/silver, /datum/material/gold, /datum/material/diamond, /datum/material/plasma, /datum/material/uranium, /datum/material/bananium, /datum/material/titanium, /datum/material/bluespace, /datum/material/plastic), - INFINITY, - FALSE, - /obj/item/stack, - null, - null, - TRUE) + var/static/list/materials_list = list( + /datum/material/iron, + /datum/material/glass, + /datum/material/silver, + /datum/material/gold, + /datum/material/diamond, + /datum/material/plasma, + /datum/material/uranium, + /datum/material/bananium, + /datum/material/titanium, + /datum/material/bluespace, + /datum/material/plastic, + ) + AddComponent(/datum/component/material_container, materials_list, INFINITY, allowed_types=/obj/item/stack, _disable_attackby=TRUE) if (!GLOB.ore_silo_default && mapload && is_station_level(z)) GLOB.ore_silo_default = src diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 8003d039757..990492992a7 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -7,6 +7,8 @@ icon_state = "mining" density = TRUE circuit = /obj/item/circuitboard/machine/mining_equipment_vendor + ui_x = 425 + ui_y = 600 var/icon_deny = "mining-deny" var/obj/item/card/id/inserted_id var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces. @@ -71,57 +73,95 @@ src.equipment_path = path src.cost = cost +/obj/machinery/mineral/equipment_vendor/Initialize() + . = ..() + build_inventory() + +/obj/machinery/mineral/equipment_vendor/proc/build_inventory() + for(var/p in prize_list) + var/datum/data/mining_equipment/M = p + GLOB.vending_products[M.equipment_path] = 1 + /obj/machinery/mineral/equipment_vendor/update_icon_state() if(powered()) icon_state = initial(icon_state) else icon_state = "[initial(icon_state)]-off" -/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user) - . = ..() - var/list/dat = list() - dat += "
Equipment point cost list:
" +/obj/machinery/mineral/equipment_vendor/ui_base_html(html) + var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/vending) + . = replacetext(html, "", assets.css_tag()) + +/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/vending) + assets.send(user) + ui = new(user, src, ui_key, "mining_vendor", name, ui_x, ui_y, master_ui, state) + ui.open() + +/obj/machinery/mineral/equipment_vendor/ui_static_data(mob/user) + . = list() + .["product_records"] = list() for(var/datum/data/mining_equipment/prize in prize_list) - dat += "" - dat += "
[prize.equipment_name][prize.cost]Purchase
" + var/list/product_data = list( + path = replacetext(replacetext("[prize.equipment_path]", "/obj/item/", ""), "/", "-"), + name = prize.equipment_name, + price = prize.cost, + ref = REF(prize) + ) + .["product_records"] += list(product_data) - var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350) - popup.set_content(dat.Join()) - popup.open() - return +/obj/machinery/mineral/equipment_vendor/ui_data(mob/user) + . = list() + var/mob/living/carbon/human/H + var/obj/item/card/id/C + if(ishuman(user)) + H = user + C = H.get_idcard(TRUE) + if(C) + .["user"] = list() + .["user"]["points"] = C.mining_points + if(C.registered_account) + .["user"]["name"] = C.registered_account.account_holder + if(C.registered_account.account_job) + .["user"]["job"] = C.registered_account.account_job.title + else + .["user"]["job"] = "No Job" -/obj/machinery/mineral/equipment_vendor/Topic(href, href_list) +/obj/machinery/mineral/equipment_vendor/ui_act(action, params) if(..()) return - if(!href_list["purchase"]) - return - var/mob/M = usr - var/obj/item/card/id/I = M.get_idcard(TRUE) - if(!istype(I)) - to_chat(usr, "Error: An ID is required!") - flick(icon_deny, src) - return - var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) in prize_list - if (!prize || !(prize in prize_list)) - to_chat(usr, "Error: Invalid choice!") - flick(icon_deny, src) - return - if(prize.cost > I.mining_points) - to_chat(usr, "Error: Insufficient points for [prize.equipment_name] on [I]!") - flick(icon_deny, src) - return - I.mining_points -= prize.cost - to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") - new prize.equipment_path(loc) - SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) - updateUsrDialog() + + switch(action) + if("purchase") + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(!istype(I)) + to_chat(usr, "Error: An ID is required!") + flick(icon_deny, src) + return + var/datum/data/mining_equipment/prize = locate(params["ref"]) in prize_list + if(!prize || !(prize in prize_list)) + to_chat(usr, "Error: Invalid choice!") + flick(icon_deny, src) + return + if(prize.cost > I.mining_points) + to_chat(usr, "Error: Insufficient points for [prize.equipment_name] on [I]!") + flick(icon_deny, src) + return + I.mining_points -= prize.cost + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + new prize.equipment_path(loc) + SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) + . = TRUE /obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/mining_voucher)) RedeemVoucher(I, user) return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) - updateUsrDialog() return if(default_deconstruction_crowbar(I)) return @@ -170,7 +210,6 @@ circuit = /obj/item/circuitboard/machine/mining_equipment_vendor/golem /obj/machinery/mineral/equipment_vendor/golem/Initialize() - . = ..() desc += "\nIt seems a few selections have been added." prize_list += list( new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/mining, 250), @@ -182,6 +221,7 @@ new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700), new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) ) + return ..() /**********************Mining Equipment Vendor Items**************************/ diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index be28e4980af..c01d5f2d7c6 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -31,7 +31,7 @@ /datum/material/plastic, /datum/material/runite ), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack) - chosen = getmaterialref(chosen) + chosen = SSmaterials.GetMaterialRef(chosen) /obj/machinery/mineral/mint/process() diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index d6460dc37c1..a380ae10720 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -19,6 +19,8 @@ var/mine_experience = 5 //How much experience do you get for mining this ore? novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going var/list/stack_overlays + var/scan_state = "" //Used by mineral turfs for their scan overlay. + var/spreadChance = 0 //Also used by mineral turfs for spreading veins /obj/item/stack/ore/update_overlays() . = ..() @@ -74,6 +76,8 @@ custom_materials = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/uranium mine_experience = 6 + scan_state = "rock_Uranium" + spreadChance = 5 /obj/item/stack/ore/iron name = "iron ore" @@ -84,6 +88,8 @@ custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/metal mine_experience = 1 + scan_state = "rock_Iron" + spreadChance = 20 /obj/item/stack/ore/glass name = "sand pile" @@ -139,6 +145,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma mine_experience = 5 + scan_state = "rock_Plasma" + spreadChance = 8 /obj/item/stack/ore/plasma/welder_act(mob/living/user, obj/item/I) to_chat(user, "You can't hit a high enough temperature to smelt [src] properly!") @@ -154,6 +162,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 3 custom_materials = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/silver + scan_state = "rock_Silver" + spreadChance = 5 /obj/item/stack/ore/gold name = "gold ore" @@ -164,6 +174,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 5 custom_materials = list(/datum/material/gold=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/gold + scan_state = "rock_Gold" + spreadChance = 5 /obj/item/stack/ore/diamond name = "diamond ore" @@ -174,6 +186,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/diamond=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/diamond mine_experience = 10 + scan_state = "rock_Diamond" /obj/item/stack/ore/bananium name = "bananium ore" @@ -184,6 +197,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/bananium mine_experience = 15 + scan_state = "rock_Bananium" /obj/item/stack/ore/titanium name = "titanium ore" @@ -194,6 +208,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/titanium mine_experience = 3 + scan_state = "rock_Titanium" + spreadChance = 5 /obj/item/stack/ore/slag name = "slag" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 7fd559381ae..fc70e23645c 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -153,6 +153,10 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 10) /mob/dead/observer/Destroy() + // Update our old body's medhud since we're abandoning it + if(mind && mind.current) + mind.current.med_hud_set_status() + GLOB.ghost_images_default -= ghostimage_default QDEL_NULL(ghostimage_default) @@ -355,6 +359,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return can_reenter_corpse = FALSE + // Update med huds + var/mob/living/carbon/current = mind.current + current.med_hud_set_status() // Disassociates observer mind from the body mind mind = null diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 37b1283bb99..4542de9ae0d 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -1,3 +1,5 @@ +#define BLOOD_DRIP_RATE_MOD 90 //Greater number means creating blood drips more often while bleeding + /**************************************************** BLOOD SYSTEM ****************************************************/ @@ -101,11 +103,12 @@ /mob/living/carbon/proc/bleed(amt) if(blood_volume) blood_volume = max(blood_volume - amt, 0) - if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean - if(amt >= 10) - add_splatter_floor(src.loc) - else - add_splatter_floor(src.loc, 1) + if (prob(sqrt(amt)*BLOOD_DRIP_RATE_MOD)) + if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean + if(amt >= 10) + add_splatter_floor(src.loc) + else + add_splatter_floor(src.loc, 1) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod @@ -280,8 +283,7 @@ var/obj/effect/decal/cleanable/blood/B = locate() in T if(!B) B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) - if (B.bloodiness < MAX_SHOE_BLOODINESS) //add more blood, up to a limit - B.bloodiness += BLOOD_AMOUNT_PER_DECAL + B.bloodiness = min((B.bloodiness + BLOOD_AMOUNT_PER_DECAL),MAX_SHOE_BLOODINESS) B.transfer_mob_blood_dna(src) //give blood info to the blood decal. if(temp_blood_DNA) B.add_blood_DNA(temp_blood_DNA) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index 203ca0e874d..9aa037be739 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -60,7 +60,7 @@ newbrain.brainmob = null brainmob.forceMove(src) brainmob.container = src - var/fubar_brain = newbrain.brain_death && newbrain.suicided && brainmob.suiciding //brain is damaged beyond repair or from a suicider + var/fubar_brain = newbrain.suicided || brainmob.suiciding //brain is from a suicider if(!fubar_brain && !(newbrain.organ_flags & ORGAN_FAILING)) // the brain organ hasn't been beaten to death, nor was from a suicider. brainmob.set_stat(CONSCIOUS) //we manually revive the brain mob GLOB.dead_mob_list -= brainmob @@ -240,7 +240,7 @@ if(user) to_chat(user, "\The [src] indicates that their mind has no will to live!") return FALSE - if(B.stat == DEAD || brain?.brain_death) + if(B.stat == DEAD) if(user) to_chat(user, "\The [src] indicates that the brain is dead!") return FALSE diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 39464265edb..94771bcdcbf 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -13,13 +13,12 @@ ///The brain's organ variables are significantly more different than the other organs, with half the decay rate for balance reasons, and twice the maxHealth decay_factor = STANDARD_ORGAN_DECAY / 2 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise - maxHealth = BRAIN_DAMAGE_DEATH + maxHealth = BRAIN_DAMAGE_DEATH low_threshold = 45 high_threshold = 120 var/suicided = FALSE var/mob/living/brain/brainmob = null - var/brain_death = FALSE //if the brainmob was intentionally killed by attacking the brain after removal, or by severe braindamage var/decoy_override = FALSE //if it's a fake brain with no brainmob assigned. Feedback messages will be faked as if it does have a brainmob. See changelings & dullahans. //two variables necessary for calculating whether we get a brain trauma or not var/damage_delta = 0 @@ -69,10 +68,6 @@ transfer_identity(C) C.update_hair() -/obj/item/organ/brain/prepare_eat(mob/living/carbon/human/H) - if(iszombie(H))//braaaaaains... otherwise, too important to eat. - ..() - /obj/item/organ/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s brain" if(brainmob || decoy_override) @@ -90,10 +85,7 @@ brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) if(HAS_TRAIT(L, TRAIT_BADDNA)) - brainmob.status_traits[TRAIT_BADDNA] = L.status_traits[TRAIT_BADDNA] - var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) - if(ZI) - brainmob.set_species(ZI.old_species) //For if the brain is cloned + LAZYSET(brainmob.status_traits, TRAIT_BADDNA, L.status_traits[TRAIT_BADDNA]) if(L.mind && L.mind.current) L.mind.transfer_to(brainmob) to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a brain.") @@ -106,7 +98,7 @@ if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent(/datum/reagent/medicine/mannitol)) //attempt to heal the brain . = TRUE //don't do attack animation. - if(brain_death || brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing + if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing to_chat(user, "[src] is far too damaged, there's nothing else we can do for it!") return @@ -120,41 +112,33 @@ return user.visible_message("[user] pours the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.", "You pour the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.") - setOrganDamage(damage - (0.05 * maxHealth)) //heals a small amount, and by using "setorgandamage", we clear the failing variable if that was up + var/healby = O.reagents.get_reagent_amount(/datum/reagent/medicine/mannitol) + setOrganDamage(damage - healby*2) //heals 2 damage per unit of mannitol, and by using "setorgandamage", we clear the failing variable if that was up O.reagents.clear_reagents() return if(brainmob) //if we aren't trying to heal the brain, pass the attack onto the brainmob. O.attack(brainmob, user) //Oh noooeeeee - if(O.force != 0 && !(O.item_flags & NOBLUDGEON)) - setOrganDamage(maxHealth) //fails the brain as the brain was attacked, they're pretty fragile. + if(O.force != 0 && !(O.item_flags & NOBLUDGEON)) + setOrganDamage(maxHealth) //fails the brain as the brain was attacked, they're pretty fragile. + visible_message("[user] hits [src] with [O]!") + to_chat(user, "You hit [src] with [O]!") /obj/item/organ/brain/examine(mob/user) . = ..() - if(suicided) . += "It's started turning slightly grey. They must not have been able to handle the stress of it all." - else if(brainmob) - if(brainmob.get_ghost(FALSE, TRUE)) - if(brain_death || brainmob.health <= HEALTH_THRESHOLD_DEAD) - . += "It's lifeless and severely damaged." - else if(organ_flags & ORGAN_FAILING) - . += "It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some mannitol." - else - . += "You can feel the small spark of life still left in this one." - else if(organ_flags & ORGAN_FAILING) - . += "It seems particularly lifeless and is rather damaged... You may be able to restore it with some mannitol incase it becomes functional again later." + return + if((brainmob && (brainmob.client || brainmob.get_ghost())) || decoy_override) + if(organ_flags & ORGAN_FAILING) + . += "It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some mannitol." + else if(damage >= BRAIN_DAMAGE_DEATH*0.5) + . += "You can feel the small spark of life still left in this one, but it's got some bruises. You may be able to restore it with some mannitol." else - . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later." + . += "You can feel the small spark of life still left in this one." else - if(decoy_override) - if(organ_flags & ORGAN_FAILING) - . += "It seems particularly lifeless and is rather damaged... You may be able to restore it with some mannitol incase it becomes functional again later." - else - . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later." - else - . += "This one is completely devoid of life." + . += "This one is completely devoid of life." /obj/item/organ/brain/attack(mob/living/carbon/C, mob/user) if(!istype(C)) @@ -203,7 +187,6 @@ if(damage >= BRAIN_DAMAGE_DEATH) //rip to_chat(owner, "The last spark of life in your brain fizzles out...") owner.death() - brain_death = TRUE /obj/item/organ/brain/check_damage_thresholds(mob/M) . = ..() diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 971747b7443..ff4b85bdcf5 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -20,7 +20,7 @@ else if(istype(loc, /obj/item/organ/brain)) BR = loc if(BR) - BR.brain_death = TRUE //beaten to a pulp + BR.damage = BRAIN_DAMAGE_DEATH //beaten to a pulp /mob/living/brain/proc/handle_emp_damage() if(emp_damage) diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index bbe28e6ccc2..49b9dcf4299 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -90,7 +90,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) if(user.suiciding) //if they suicided, they're out forever. to_chat(user, "[src] fizzles slightly. Sadly it doesn't take those who suicided!") return - var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No") + var/posi_ask = alert("Become a [name]? (Warning, You can no longer be revived, and all past lives will be forgotten!)","Are you positive?","Yes","No") if(posi_ask == "No" || QDELETED(src)) return if(brainmob.suiciding) //clear suicide status if the old occupant suicided. diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 3c095a08a9e..a5cae32230a 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -124,6 +124,9 @@ Des: Removes all infected images from the alien. to_chat(src, "You begin to evolve!") visible_message("[src] begins to twist and contort!") new_xeno.setDir(dir) + if(numba && unique_name) + new_xeno.numba = numba + new_xeno.set_name() if(!alien_name_regex.Find(name)) new_xeno.name = name new_xeno.real_name = real_name diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 371bdd1c8dc..606c596828d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -114,3 +114,8 @@ if(breath && breath.total_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) ..() + +/mob/living/carbon/alien/humanoid/set_name() + if(numba) + name = "[name] ([numba])" + real_name = name diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 7e0967840a6..4e63cbcacf1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/alienqueen.dmi' status_flags = 0 ventcrawler = VENTCRAWLER_NONE //pull over that ass too fat - unique_name = 0 pixel_x = -16 bubble_icon = "alienroyal" mob_size = MOB_SIZE_LARGE diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 5f59ee1cd89..290df6982a9 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,5 +1,6 @@ /obj/item/organ/alien icon_state = "xgibmid2" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/list/alien_powers = list() /obj/item/organ/alien/Initialize() @@ -24,11 +25,6 @@ M.RemoveAbility(P) ..() -/obj/item/organ/alien/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - /obj/item/organ/alien/plasmavessel name = "plasma vessel" @@ -37,17 +33,13 @@ zone = BODY_ZONE_CHEST slot = "plasmavessel" alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10) var/storedPlasma = 100 var/max_plasma = 250 var/heal_rate = 5 var/plasma_rate = 10 -/obj/item/organ/alien/plasmavessel/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) - return S - /obj/item/organ/alien/plasmavessel/large name = "large plasma vessel" icon_state = "plasma_large" diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 6090f5b35fa..a8904eef6a8 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -4,6 +4,7 @@ name = "alien embryo" icon = 'icons/mob/alien.dmi' icon_state = "larva0_dead" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/stage = 0 var/bursting = FALSE @@ -16,11 +17,6 @@ if(prob(10)) AttemptGrow(0) -/obj/item/organ/body_egg/alien_embryo/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - /obj/item/organ/body_egg/alien_embryo/on_life() . = ..() switch(stage) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c9b79815d49..a49afbec01c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -137,7 +137,7 @@ if(start_T && end_T) log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") - else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) + else if(!(I.item_flags & ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) thrown_thing = I dropItemToGround(I, silent = TRUE) @@ -746,6 +746,10 @@ if(hud_used && hud_used.internals) hud_used.internals.icon_state = "internal[internal_state]" +/mob/living/carbon/proc/update_spacesuit_hud_icon(cell_state = "empty") + if(hud_used && hud_used.spacesuit) + hud_used.spacesuit.icon_state = "spacesuit_[cell_state]" + /mob/living/carbon/update_stat() if(status_flags & GODMODE) return @@ -796,9 +800,6 @@ for(var/O in internal_organs) var/obj/item/organ/organ = O organ.setOrganDamage(0) - var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) - if(B) - B.brain_death = FALSE for(var/thing in diseases) var/datum/disease/D = thing if(D.severity != DISEASE_SEVERITY_POSITIVE) @@ -824,6 +825,19 @@ if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling))) return 0 +/mob/living/carbon/proc/can_defib() + var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK)) + return + if((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE)) + return + if(!heart || (heart.organ_flags & ORGAN_FAILING)) + return + var/obj/item/organ/brain/BR = getorgan(/obj/item/organ/brain) + if(QDELETED(BR) || (BR.organ_flags & ORGAN_FAILING) || BR.suicided) + return + return TRUE + /mob/living/carbon/harvest(mob/living/user) if(QDELETED(src)) return diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 96c3a597f77..5f17532aa62 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -267,7 +267,26 @@ else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) + + // Warm them up with hugs + share_bodytemperature(M) + if(bodytemperature > M.bodytemperature) + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, src) // Hugger got a warm hug + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) // Reciver always gets a mood for being hugged + else + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, M) // You got a warm hug + + // Let people know if they hugged someone really warm or really cold + if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + to_chat(src, "It feels like [M] is over heating as they hug you.") + else if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + to_chat(src, "It feels like [M] is freezing as they hug you.") + + if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + to_chat(M, "It feels like [src] is over heating as you hug them.") + else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + to_chat(M, "It feels like [src] is freezing as you hug them.") + if(HAS_TRAIT(M, TRAIT_FRIENDLY)) var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) if (mood.sanity >= SANITY_GREAT) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index e20c5627613..2152b9d2a82 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -43,6 +43,8 @@ if(is_devil(src)) INVOKE_ASYNC(is_devil(src), /datum/antagonist/devil.proc/beginResurrectionCheck, src) + to_chat(src, "You have died. Barring complete bodyloss, you can in most cases be revived by other players. If you do not wish to be brought back, use the \"Do Not Resuscitate\" verb in the ghost tab.") + /mob/living/carbon/human/proc/makeSkeleton() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) set_species(/datum/species/skeleton) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index d07ef430c26..20f188715b9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -319,10 +319,10 @@ var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in internal_organs) if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) - cyberimp_detect += "[name] is modified with a [CI.name]." + cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" if(cyberimp_detect) - . += "Detected cybernetic modifications:" - . += cyberimp_detect + . += "Detected cybernetic modifications:" + . += "[cyberimp_detect]" if(R) var/health_r = R.fields["p_stat"] . += "\[[health_r]\]" @@ -332,7 +332,8 @@ if(R) . += "\[Medical evaluation\]
" if(traitstring) - . += "Detected physiological traits:\n[traitstring]" + . += "Detected physiological traits:" + . += "[traitstring]" if(HAS_TRAIT(user, TRAIT_SECURITY_HUD)) if(!user.stat && user != src) @@ -345,6 +346,7 @@ . += "Criminal status: \[[criminal]\]" . += jointext(list("Security record: \[View\]", + "\[Add citation\]", "\[Add crime\]", "\[View comment log\]", "\[Add comment\]"), "") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 8919f21fdd7..d3adf774032 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -431,6 +431,38 @@ to_chat(usr, "Notes: [R.fields["notes"]]") return + if(href_list["add_citation"]) + var/maxFine = CONFIG_GET(number/maxfine) + var/t1 = stripped_input("Please input citation crime:", "Security HUD", "", null) + var/fine = FLOOR(input("Please input citation fine, up to [maxFine]:", "Security HUD", 50) as num|null, 1) + if(!R || !t1 || !fine || !allowed_access) + return + if(!H.canUseHUD()) + return + if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) + return + if(fine < 0) + to_chat(usr, "You're pretty sure that's not how money works.") + return + fine = min(fine, maxFine) + + var/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, station_time_timestamp(), fine) + for (var/obj/item/pda/P in GLOB.PDAs) + if(P.owner == R.fields["name"]) + var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." + var/datum/signal/subspace/messaging/pda/signal = new(src, list( + "name" = "Security Citation", + "job" = "Citation Server", + "message" = message, + "targets" = list("[P.owner] ([P.ownjob])"), + "automated" = 1 + )) + signal.send_to_receivers() + usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) + GLOB.data_core.addCitation(R.fields["id"], crime) + investigate_log("New Citation: [t1] Fine: [fine] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + return + if(href_list["add_crime"]) switch(alert("What crime would you like to add?","Security HUD","Minor Crime","Major Crime","Cancel")) if("Minor Crime") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5998a8d3a01..65a15feea84 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -210,7 +210,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1, thermal_protection) //See proc/get_heat_protection_flags(temperature) for the description of this proc. /mob/living/carbon/human/proc/get_cold_protection_flags(temperature) @@ -271,7 +271,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return min(1, thermal_protection) /mob/living/carbon/human/handle_random_events() //Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 4c2b8d092d7..4f6710c77d7 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -86,7 +86,7 @@ var/say_starter = "Say \"" //" if(findtextEx(temp, say_starter, 1, length(say_starter) + 1) && length(temp) > length(say_starter)) //case sensitive means - temp = trim_left(copytext(temp, length(say_starter + 1))) + temp = trim_left(copytext(temp, length(say_starter) + 1)) temp = replacetext(temp, ";", "", 1, 2) //general radio while(trim_left(temp)[1] == ":") //dept radio again (necessary) temp = copytext_char(trim_left(temp), 3) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e80dc5d94c7..902b8d6246c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1617,55 +1617,21 @@ GLOBAL_LIST_EMPTY(roundstart_races) // ENVIRONMENT HANDLERS // ////////////////////////// -/// Handle the environment for species +/** + * Enviroment handler for species + * + * vars: + * * environment The environment gas mix + * * H The mob we will stabilize + */ /datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H) var/areatemp = H.get_temperature(environment) - var/natural = 0 // Body temperature stability have the body try and normalize on it's own if(H.stat != DEAD) // If you are dead your body does not stabilize naturally - natural = natural_bodytemperature_stabilization(H) + natural_bodytemperature_stabilization(environment, H) - /// Get the mobs thermal protection and environmental change - var/thermal_protection = 1 // The inverse of the amount of protection - var/environment_change = 0 // The amount of change the from the enviroment - var/natural_change = 0 // The amount that natural stabilization changes after applying thermal protection - - if(areatemp > H.bodytemperature) // It is hot here - thermal_protection -= H.get_heat_protection(areatemp) // Get the thermal protection of the mob - environment_change = min(thermal_protection * (areatemp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, \ - BODYTEMP_HEATING_MAX) - - if(H.bodytemperature < bodytemp_normal) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - - else // It is cold here - thermal_protection -= H.get_cold_protection(areatemp) // Get the thermal protection of the mob - - if(!H.on_fire) // If we are on fire ignore local temperature in cold areas - if(H.bodytemperature < bodytemp_normal) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - // How much the environment cools the mob with thermal protection - environment_change = max(thermal_protection * (areatemp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, \ - BODYTEMP_COOLING_MAX) - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - // How much the environment cools the mob with thermal protection - // Extra calculation for hardsuits to bleed off heat - environment_change = max((thermal_protection * (areatemp - H.bodytemperature) + bodytemp_normal - \ - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX) - - // Apply the temperature changes, combining natual and enviromental changes - H.adjust_bodytemperature(natural_change + environment_change) + if(!H.on_fire || areatemp > H.bodytemperature) // If we are not on fire or the area is hotter + H.adjust_bodytemperature((areatemp - H.bodytemperature), use_insulation=TRUE, use_steps=TRUE) /// Handle the body temperature status effects for the species /// Traits for resitance to heat or cold are handled here. @@ -1776,31 +1742,61 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2) -/// Used to stabilize the body temperature back to normal on living mobs -/// Returns the amount of degrees kelvin to change the body temperature -/datum/species/proc/natural_bodytemperature_stabilization(mob/living/carbon/human/H) +/** + * Used to stabilize the body temperature back to normal on living mobs + * + * vars: + * * environment The environment gas mix + * * H The mob we will stabilize + */ +/datum/species/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + var/areatemp = H.get_temperature(environment) var/body_temp = H.bodytemperature // Get current body temperature var/body_temperature_difference = bodytemp_normal - body_temp + var/natural_change = 0 // We are very cold, increate body temperature if(body_temp <= bodytemp_cold_damage_limit) - return max((body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ + natural_change = max((body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ bodytemp_autorecovery_min) // we are cold, reduce the minimum increment and do not jump over the difference - if(body_temp > bodytemp_cold_damage_limit && body_temp < bodytemp_normal) - return max(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(body_temp > bodytemp_cold_damage_limit && body_temp < bodytemp_normal) + natural_change = max(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ min(body_temperature_difference, bodytemp_autorecovery_min / 4)) // We are hot, reduce the minimum increment and do not jump below the difference - if(body_temp > bodytemp_normal && body_temp <= bodytemp_heat_damage_limit) - return min(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(body_temp > bodytemp_normal && body_temp <= bodytemp_heat_damage_limit) + natural_change = min(body_temperature_difference * H.metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ max(body_temperature_difference, -(bodytemp_autorecovery_min / 4))) // We are very hot, reduce the body temperature - if(body_temp >= bodytemp_heat_damage_limit) - return min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -bodytemp_autorecovery_min) + else if(body_temp >= bodytemp_heat_damage_limit) + natural_change = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -bodytemp_autorecovery_min) + var/thermal_protection = H.get_insulation_protection(body_temp + natural_change) + if(areatemp > body_temp) // It is hot here + if(body_temp < bodytemp_normal) + // Our bodytemp is below normal we are cold, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + else // It is cold here + if(!H.on_fire) // If on fire ignore ignore local temperature in cold areas + if(body_temp < bodytemp_normal) + // Our bodytemp is below normal, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + + // Apply the natural stabilization changes + H.adjust_bodytemperature(natural_change) ////////// // FIRE // diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index d0831543da4..283fc02fb96 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -30,8 +30,8 @@ bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 10) /// Lizards are cold blooded and do not stabilize body temperature naturally -/datum/species/lizard/natural_bodytemperature_stabilization(mob/living/carbon/human/H) - return 0 +/datum/species/lizard/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + return /datum/species/lizard/random_name(gender,unique,lastname) if(unique) diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index cf361d73d80..c522874c8ea 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -37,8 +37,8 @@ changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN /// Zombies do not stabilize body temperature they are the walking dead and are cold blooded -/datum/species/zombie/natural_bodytemperature_stabilization(mob/living/carbon/human/H) - return 0 +/datum/species/zombie/natural_bodytemperature_stabilization(datum/gas_mixture/environment, mob/living/carbon/human/H) + return /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 99374cbedf9..83709a8cc4d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -557,66 +557,77 @@ All effects don't start immediately, but rather get worse over time; the rate is /// Base carbon environment handler, adds natural stabilization /mob/living/carbon/handle_environment(datum/gas_mixture/environment) var/areatemp = get_temperature(environment) - var/natural = 0 // Have the body regulate it's own temperature if(stat != DEAD) // If you are dead your body does not stabilize naturally - natural = natural_bodytemperature_stabilization() + natural_bodytemperature_stabilization(environment) - /// Get the mobs thermal protection and environmental change - var/thermal_protection = 1 // The inverse of the amount of protection - var/environment_change = 0 // The amount of change the from the enviroment - var/natural_change = 0 // The amount that natural stabilization changes after applying thermal protection + if(!on_fire || areatemp > bodytemperature) // If we are not on fire or the area is hotter + adjust_bodytemperature((areatemp - bodytemperature), use_insulation=TRUE, use_steps=TRUE) - if(areatemp > bodytemperature) // It is hot here - thermal_protection -= get_heat_protection(areatemp) // Get the thermal protection of the mob - environment_change = min(thermal_protection * (areatemp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX) - if(bodytemperature < BODYTEMP_NORMAL) - // Our bodytemp is below normal we are cold, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - else // It is cold here - thermal_protection -= get_cold_protection(areatemp) // Get the thermal protection of the mob - if(!on_fire) // If on fire ignore ignore local temperature in cold areas - environment_change = max(thermal_protection * (areatemp - bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX) - if(bodytemperature < BODYTEMP_NORMAL) - // Our bodytemp is below normal, insulation helps us retain body heat - // and will reduce the heat we lose to the environment - natural_change = (thermal_protection + 1) * natural - else - // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat - // but will reduce the amount of heat we get from the environment - natural_change = (1 / (thermal_protection + 1)) * natural - - // Apply the temperature changes, combining natual and enviromental changes - adjust_bodytemperature(natural_change + environment_change) - -/// Used to stabilize the body temperature back to normal on living mobs -/// Returns the amount of degrees kelvin to change the body temperature -/mob/living/carbon/proc/natural_bodytemperature_stabilization() +/** + * Used to stabilize the body temperature back to normal on living mobs + * + * vars: + * * environment The environment gas mix + */ +/mob/living/carbon/proc/natural_bodytemperature_stabilization(datum/gas_mixture/environment) + var/areatemp = get_temperature(environment) var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature + var/natural_change = 0 // We are very cold, increate body temperature if(bodytemperature <= BODYTEMP_COLD_DAMAGE_LIMIT) - return max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ + natural_change = max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), \ BODYTEMP_AUTORECOVERY_MINIMUM) // we are cold, reduce the minimum increment and do not jump over the difference - if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < BODYTEMP_NORMAL) - return max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT && bodytemperature < BODYTEMP_NORMAL) + natural_change = max(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ min(body_temperature_difference, BODYTEMP_AUTORECOVERY_MINIMUM / 4)) // We are hot, reduce the minimum increment and do not jump below the difference - if(bodytemperature > BODYTEMP_NORMAL && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT) - return min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ + else if(bodytemperature > BODYTEMP_NORMAL && bodytemperature <= BODYTEMP_HEAT_DAMAGE_LIMIT) + natural_change = min(body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR, \ max(body_temperature_difference, -(BODYTEMP_AUTORECOVERY_MINIMUM / 4))) // We are very hot, reduce the body temperature - if(bodytemperature >= BODYTEMP_HEAT_DAMAGE_LIMIT) - return min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) + else if(bodytemperature >= BODYTEMP_HEAT_DAMAGE_LIMIT) + natural_change = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) + + var/thermal_protection = 1 - get_insulation_protection(areatemp) // invert the protection + if(areatemp > bodytemperature) // It is hot here + if(bodytemperature < BODYTEMP_NORMAL) + // Our bodytemp is below normal we are cold, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + else // It is cold here + if(!on_fire) // If on fire ignore ignore local temperature in cold areas + if(bodytemperature < BODYTEMP_NORMAL) + // Our bodytemp is below normal, insulation helps us retain body heat + // and will reduce the heat we lose to the environment + natural_change = (thermal_protection + 1) * natural_change + else + // Our bodytemp is above normal and sweating, insulation hinders out ability to reduce heat + // but will reduce the amount of heat we get from the environment + natural_change = (1 / (thermal_protection + 1)) * natural_change + + // Apply the natural stabilization changes + adjust_bodytemperature(natural_change) + +/** + * Get the insulation that is appropriate to the temperature you're being exposed to. + * All clothing, natural insulation, and traits are combined returning a single value. + * + * required temperature The Temperature that you're being exposed to + * + * return the percentage of protection as a value from 0 - 1 +**/ +/mob/living/carbon/proc/get_insulation_protection(temperature) + return (temperature > bodytemperature) ? get_heat_protection(temperature) : get_cold_protection(temperature) /// This returns the percentage of protection from heat as a value from 0 - 1 /// temperature is the temperature you're being exposed to @@ -628,6 +639,51 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/proc/get_cold_protection(temperature) return cold_protection +/** + * Have two mobs share body heat between each other. + * Account for the insulation and max temperature change range for the mob + * + * vars: + * * M The mob/living/carbon that is sharing body heat + */ +/mob/living/carbon/proc/share_bodytemperature(mob/living/carbon/M) + var/temp_diff = bodytemperature - M.bodytemperature + if(temp_diff > 0) // you are warm share the heat of life + M.adjust_bodytemperature(temp_diff, use_insulation=TRUE, use_steps=TRUE) // warm up the giver + adjust_bodytemperature((temp_diff * -1), use_insulation=TRUE, use_steps=TRUE) // cool down the reciver + + else // they are warmer leech from them + adjust_bodytemperature(temp_diff, use_insulation=TRUE, use_steps=TRUE) // warm up the reciver + M.adjust_bodytemperature((temp_diff * -1), use_insulation=TRUE, use_steps=TRUE) // cool down the giver + +/** + * Adjust the body temperature of a mob + * expanded for carbon mobs allowing the use of insulation and change steps + * + * vars: + * * amount The amount of degrees to change body temperature by + * * min_temp (optional) The minimum body temperature after adjustment + * * max_temp (optional) The maximum body temperature after adjustment + * * use_insulation (optional) modifies the amount based on the amount of insulation the mob has + * * use_steps (optional) Use the body temp divisors and max change rates + * * capped (optional) default True used to cap step mode + */ +/mob/living/carbon/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE, capped=TRUE) + // apply insulation to the amount of change + if(use_insulation) + amount *= (1 - get_insulation_protection(bodytemperature + amount)) + + // Use the bodytemp divisors to get the change step, with max step size + if(use_steps) + amount = (amount > 0) ? (amount / BODYTEMP_HEAT_DIVISOR) : (amount / BODYTEMP_COLD_DIVISOR) + // Clamp the results to the min and max step size + if(capped) + amount = (amount > 0) ? min(amount, BODYTEMP_HEATING_MAX) : max(amount, BODYTEMP_COOLING_MAX) + + if(bodytemperature >= min_temp && bodytemperature <= max_temp) + bodytemperature = CLAMP(bodytemperature + amount,min_temp,max_temp) + + ///////// //LIVER// ///////// diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index ee2806461e3..a43a514d468 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -340,7 +340,7 @@ // attack with weapon if we have one if(Weapon) - L.attackby(Weapon, src) + Weapon.melee_attack_chain(src, L) else L.attack_paw(src) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 0452cebe784..9abedd67d49 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -77,7 +77,7 @@ slow += (health_deficiency / 25) add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/monkey_health_speedmod, TRUE, slow) -/mob/living/carbon/monkey/adjust_bodytemperature(amount) +/mob/living/carbon/monkey/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY, use_insulation=FALSE, use_steps=FALSE) . = ..() var/slow = 0 if (bodytemperature < 283.222) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 4af4fb07fa9..a135d3dc70c 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -73,8 +73,6 @@ update_mobility() med_hud_set_health() med_hud_set_status() - if(!gibbed && !QDELETED(src)) - addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1) stop_pulling() . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index be9b9f78022..0f8985d3664 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,8 +1,7 @@ /mob/living/Initialize() . = ..() if(unique_name) - name = "[name] ([rand(1, 1000)])" - real_name = name + set_name() var/datum/atom_hud/data/human/medical/advanced/medhud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] medhud.add_to_hud(src) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) @@ -502,30 +501,26 @@ var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll switch(healthpercent) if(100 to INFINITY) - livingdoll.icon_state = "living0" + severity = 0 if(80 to 100) - livingdoll.icon_state = "living1" severity = 1 if(60 to 80) - livingdoll.icon_state = "living2" severity = 2 if(40 to 60) - livingdoll.icon_state = "living3" severity = 3 if(20 to 40) - livingdoll.icon_state = "living4" severity = 4 if(1 to 20) - livingdoll.icon_state = "living5" severity = 5 else - livingdoll.icon_state = "living6" severity = 6 + livingdoll.icon_state = "living[severity]" if(!livingdoll.filtered) livingdoll.filtered = TRUE var/icon/mob_mask = icon(icon, icon_state) if(mob_mask.Height() > world.icon_size || mob_mask.Width() > world.icon_size) - mob_mask = icon('icons/mob/screen_gen.dmi', "megasprite") //swap to something that fits if they wont + var/health_doll_icon_state = health_doll_icon ? health_doll_icon : "megasprite" + mob_mask = icon('icons/mob/screen_gen.dmi', health_doll_icon_state) //swap to something generic if they have no special doll UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask)) livingdoll.filters += filter(type="drop_shadow", size = -1) if(severity > 0) @@ -1298,6 +1293,11 @@ /mob/living/proc/mob_pickup(mob/living/L) return +/mob/living/proc/set_name() + numba = rand(1, 1000) + name = "[name] ([numba])" + real_name = name + /mob/living/proc/mob_try_pickup(mob/living/user) if(!ishuman(user)) return diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6b811d3da22..3e7dbf13cae 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -71,9 +71,11 @@ var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob. var/bubble_icon = "default" //what icon the mob uses for speechbubbles + var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi var/last_bumped = 0 var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666) + var/numba = 0 //the id a mob gets when it's created var/list/butcher_results = null //these will be yielded from butchering with a probability chance equal to the butcher item's effectiveness var/list/guaranteed_butcher_results = null //these will always be yielded from butchering diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 409fcc3a3d4..4177109d16c 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -114,6 +114,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( else if(message_mode || saymode) message = copytext_char(message, 3) message = trim_left(message) + if(!message) + return if(message_mode == MODE_ADMIN) if(client) client.cmd_admin_say(message) @@ -196,7 +198,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(language) var/datum/language/L = GLOB.language_datum_instances[language] spans |= L.spans - + if(message_mode == MODE_SING) #if DM_VERSION < 513 var/randomnote = "~" @@ -259,19 +261,20 @@ GLOBAL_LIST_INIT(department_radio_keys, list( eavesdrop_range = EAVESDROP_EXTRA_RANGE var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() - for(var/_M in GLOB.player_list) - var/mob/M = _M - if(M.stat != DEAD) //not dead, not important - continue - if(!client) //client is so that ghosts don't have to listen to mice - continue - if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing - if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + if(client) //client is so that ghosts don't have to listen to mice + for(var/_M in GLOB.player_list) + var/mob/M = _M + if(QDELETED(M)) //Some times nulls and deleteds stay in this list. This is a workaround to prevent ic chat breaking for everyone when they do. + continue //Remove if underlying cause (likely byond issue) is fixed. See TG PR #49004. + if(M.stat != DEAD) //not dead, not important continue - if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off - continue - listening |= M - the_dead[M] = TRUE + if(get_dist(M, src) > 7 || M.z != z) //they're out of range of normal hearing + if(eavesdropping_modes[message_mode] && !(M.client.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off + continue + if(!(M.client.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off + continue + listening |= M + the_dead[M] = TRUE var/eavesdropping var/eavesrendered diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8b1b83db40e..0260e2ce78a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -686,7 +686,7 @@ if("Animal") var/list/icon_list = list( "bear" = 'icons/mob/animal.dmi', - "carp" = 'icons/mob/animal.dmi', + "carp" = 'icons/mob/carp.dmi', "chicken" = 'icons/mob/animal.dmi', "corgi" = 'icons/mob/pets.dmi', "cow" = 'icons/mob/animal.dmi', diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index fb3dfdb2152..0e3c5bfa5d9 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -83,8 +83,8 @@ if(is_type_in_list(S, list(/obj/item/stack/sheet/metal, /obj/item/stack/rods, /obj/item/stack/tile/plasteel))) if(S.custom_materials && custom_materials.len) - if(S.custom_materials[getmaterialref(/datum/material/iron)]) - S.cost = S.custom_materials[getmaterialref(/datum/material/iron)] * 0.25 + if(S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]) + S.cost = S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] * 0.25 S.source = get_or_create_estorage(/datum/robot_energy_storage/metal) else if(istype(S, /obj/item/stack/sheet/glass)) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 64d235b3cdb..ba7fde151a9 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -299,7 +299,7 @@ target_types += /obj/effect/decal/cleanable/trail_holder if(pests) - target_types += /mob/living/simple_animal/cockroach + target_types += /mob/living/simple_animal/hostile/cockroach target_types += /mob/living/simple_animal/mouse if(drawn) @@ -333,7 +333,7 @@ playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6) A.acid_act(75, 10) target = null - else if(istype(A, /mob/living/simple_animal/cockroach) || istype(A, /mob/living/simple_animal/mouse)) + else if(istype(A, /mob/living/simple_animal/hostile/cockroach) || istype(A, /mob/living/simple_animal/mouse)) var/mob/living/simple_animal/M = target if(!M.stat) visible_message("[src] smashes [target] with its mop!") diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm deleted file mode 100644 index 288e642b36d..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_animal/cockroach - name = "cockroach" - desc = "This station is just crawling with bugs." - icon_state = "cockroach" - icon_dead = "cockroach" - health = 1 - maxHealth = 1 - turns_per_move = 5 - loot = list(/obj/effect/decal/cleanable/insectguts) - 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 - mob_biotypes = MOB_ORGANIC|MOB_BUG - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "splats" - response_harm_simple = "splat" - speak_emote = list("chitters") - density = FALSE - ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN - verb_say = "chitters" - verb_ask = "chitters inquisitively" - verb_exclaim = "chitters loudly" - verb_yell = "chitters loudly" - var/squish_chance = 50 - del_on_death = 1 - -/mob/living/simple_animal/cockroach/death(gibbed) - if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. - return - ..() - -/mob/living/simple_animal/cockroach/Crossed(var/atom/movable/AM) - if(ismob(AM)) - if(isliving(AM)) - var/mob/living/A = AM - if(A.mob_size > MOB_SIZE_SMALL && !(A.movement_type & FLYING)) - if(prob(squish_chance)) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(HAS_TRAIT(H, TRAIT_PACIFISM)) - H.visible_message("[src] avoids getting crushed.", "You avoid crushing [src]!") - return - A.visible_message("[A] crushes [src].", "You crushed [src].") - adjustBruteLoss(1) //kills a normal cockroach - else - visible_message("[src] avoids getting crushed.") - else - if(isstructure(AM)) - if(prob(squish_chance)) - AM.visible_message("[src] was crushed under [AM].") - adjustBruteLoss(1) - else - visible_message("[src] avoids getting crushed.") - -/mob/living/simple_animal/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. - return diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 52360540c29..65e802c7f48 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -169,6 +169,7 @@ D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) D.set_vehicle_dir_layer(EAST, OBJ_LAYER) D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + D.drive_verb = "ride" /mob/living/simple_animal/cow/Life() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index c03041a1781..7aaf339d185 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -26,7 +26,7 @@ gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. + var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/hostile/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. /mob/living/simple_animal/hostile/lizard/CanAttack(atom/the_target)//Can we actually attack a possible target? if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index a5e8c9c7fef..428ebf0f31c 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -132,6 +132,7 @@ icon_state = "alienq" icon_living = "alienq" icon_dead = "alienq_dead" + health_doll_icon = "alienq" bubble_icon = "alienroyal" move_to_delay = 4 maxHealth = 400 diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 7bf7214d737..ca65386c6ae 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -152,6 +152,7 @@ icon_living = "megacarp" icon_dead = "megacarp_dead" icon_gib = "megacarp_gib" + health_doll_icon = "megacarp" maxHealth = 20 health = 20 pixel_x = -16 diff --git a/code/modules/mob/living/simple_animal/hostile/glockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm similarity index 75% rename from code/modules/mob/living/simple_animal/hostile/glockroach.dm rename to code/modules/mob/living/simple_animal/hostile/cockroach.dm index 495c6df2b42..11eb42c25b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/glockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -1,16 +1,7 @@ -/obj/projectile/glockroachbullet - damage = 10 //same damage as a hivebot - damage_type = BRUTE - -/obj/item/ammo_casing/glockroach - name = "0.9mm bullet casing" - desc = "A... 0.9mm bullet casing? What?" - projectile_type = /obj/projectile/glockroachbullet - -/mob/living/simple_animal/hostile/glockroach //copypasted from cockroach.dm so i could use the shooting code in hostile.dm - name = "glockroach" - desc = "HOLY SHIT, THAT COCKROACH HAS A GUN!" - icon_state = "glockroach" +/mob/living/simple_animal/hostile/cockroach + name = "cockroach" + desc = "This station is just crawling with bugs." + icon_state = "cockroach" icon_dead = "cockroach" health = 1 maxHealth = 1 @@ -28,25 +19,49 @@ response_harm_simple = "splat" speak_emote = list("chitters") density = FALSE + melee_damage_lower = 0 + melee_damage_upper = 0 + obj_damage = 0 ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = HOSTILE_SPAWN + gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" verb_exclaim = "chitters loudly" verb_yell = "chitters loudly" + del_on_death = TRUE + environment_smash = ENVIRONMENT_SMASH_NONE + faction = list("neutral") + var/squish_chance = 50 + +/obj/projectile/glockroachbullet + damage = 10 //same damage as a hivebot + damage_type = BRUTE + +/obj/item/ammo_casing/glockroach + name = "0.9mm bullet casing" + desc = "A... 0.9mm bullet casing? What?" + projectile_type = /obj/projectile/glockroachbullet + +/mob/living/simple_animal/hostile/cockroach/glockroach + name = "glockroach" + desc = "HOLY SHIT, THAT COCKROACH HAS A GUN!" + icon_state = "glockroach" + melee_damage_lower = 5 + melee_damage_upper = 5 + obj_damage = 20 + gold_core_spawnable = HOSTILE_SPAWN projectilesound = 'sound/weapons/gun/pistol/shot.ogg' projectiletype = /obj/projectile/glockroachbullet casingtype = /obj/item/ammo_casing/glockroach - ranged = 1 - var/squish_chance = 50 - del_on_death = 1 + ranged = TRUE + faction = list("hostile") -/mob/living/simple_animal/hostile/glockroach/death(gibbed) +/mob/living/simple_animal/hostile/cockroach/death(gibbed) if(SSticker.mode && SSticker.mode.station_was_nuked) //If the nuke is going off, then cockroaches are invincible. Keeps the nuke from killing them, cause cockroaches are immune to nukes. return ..() -/mob/living/simple_animal/hostile/glockroach/Crossed(var/atom/movable/AM) +/mob/living/simple_animal/hostile/cockroach/Crossed(var/atom/movable/AM) if(ismob(AM)) if(isliving(AM)) var/mob/living/A = AM @@ -64,6 +79,5 @@ else visible_message("[src] avoids getting crushed.") -/mob/living/simple_animal/hostile/glockroach/ex_act() //Explosions are a terrible way to handle a cockroach. +/mob/living/simple_animal/hostile/cockroach/ex_act() //Explosions are a terrible way to handle a cockroach. return - diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index 9b7621ed33e..2b76318ceff 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -48,7 +48,7 @@ nummies.Cut() nummies += loc.contents if(prob(5) && random_retaliate) - Retaliate() + Retaliate() /mob/living/simple_animal/hostile/retaliate/goose/handle_automated_action() if(length(nummies)) @@ -60,7 +60,7 @@ /mob/living/simple_animal/hostile/retaliate/goose/vomit/handle_automated_action() if(length(nummies)) var/obj/item/E = pick(nummies) - if(!(E.custom_materials && E.custom_materials[getmaterialref(/datum/material/plastic)])) + if(!(E.custom_materials && E.custom_materials[SSmaterials.GetMaterialRef(/datum/material/plastic)])) nummies -= E // remove non-plastic item from queue E = locate(/obj/item/reagent_containers/food) in nummies // find food if(E && E.loc == loc) @@ -70,7 +70,7 @@ /mob/living/simple_animal/hostile/retaliate/goose/proc/feed(obj/item/suffocator) if(stat == DEAD || choking) // plapatin I swear to god return FALSE - if(suffocator.custom_materials && suffocator.custom_materials[getmaterialref(/datum/material/plastic)]) // dumb goose'll swallow food or drink with plastic in it + if(suffocator.custom_materials && suffocator.custom_materials[SSmaterials.GetMaterialRef(/datum/material/plastic)]) // dumb goose'll swallow food or drink with plastic in it visible_message("[src] hungrily gobbles up \the [suffocator]! ") visible_message("[src] is choking on \the [suffocator]! ") suffocator.forceMove(src) diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index f410b8cc3dd..63a752a04e0 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -8,6 +8,7 @@ icon_state = "crawling" icon_living = "crawling" icon_dead = "dead" + health_doll_icon = "crawling" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 80 maxHealth = 220 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index f4511315cb2..25b6b85765e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -28,6 +28,7 @@ Difficulty: Medium icon_state = "miner" icon_living = "miner" icon = 'icons/mob/broadMobs.dmi' + health_doll_icon = "miner" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID light_color = "#E4C7C5" movement_type = GROUND diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 369204f9765..e09e85c4d51 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -38,6 +38,7 @@ Difficulty: Hard icon_state = "bubblegum" icon_living = "bubblegum" icon_dead = "" + health_doll_icon = "bubblegum" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index ca4dd5d591c..954cd200999 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -32,6 +32,7 @@ Difficulty: Very Hard icon_state = "eva" icon_living = "eva" icon_dead = "" + health_doll_icon = "eva" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/96x96megafauna.dmi' @@ -617,7 +618,7 @@ Difficulty: Very Hard if(.) return if(ready_to_deploy) - var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"Yes","No") + var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be revived!)",,"Yes","No") if(be_helper == "Yes" && !QDELETED(src) && isobserver(user)) var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc)) W.key = user.key @@ -732,7 +733,7 @@ Difficulty: Very Hard mobcheck = TRUE break if(!mobcheck) - new /mob/living/simple_animal/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it + new /mob/living/simple_animal/hostile/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it //i found it funny that in the file for a giant angel beast theres a cockroach /obj/structure/closet/stasis name = "quantum entanglement stasis warp field" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index a1dc9405af2..8ba28edceaa 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -42,6 +42,7 @@ Difficulty: Medium icon_state = "dragon" icon_living = "dragon" icon_dead = "dragon_dead" + health_doll_icon = "dragon" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" speak_emote = list("roars") @@ -144,7 +145,7 @@ Difficulty: Medium if(!target) return target.visible_message("Lava starts to pool up around you!") - + while(amount > 0) if(QDELETED(target)) break @@ -607,6 +608,7 @@ obj/effect/temp_visual/fireball icon_state = "spacedragon" icon_living = "spacedragon" icon_dead = "spacedragon_dead" + health_doll_icon = "spacedragon" obj_damage = 80 melee_damage_upper = 35 melee_damage_lower = 35 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index ec405d9be46..3d029161889 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -44,6 +44,7 @@ Difficulty: Hard attack_sound = 'sound/weapons/sonic_jackhammer.ogg' icon_state = "hierophant" icon_living = "hierophant" + health_doll_icon = "hierophant" friendly_verb_continuous = "stares down" friendly_verb_simple = "stare down" icon = 'icons/mob/lavaland/hierophant_new.dmi' diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 3e7cc69196a..cc6309788a9 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -22,6 +22,7 @@ maxHealth = 700 icon_state = "mega_legion" icon_living = "mega_legion" + health_doll_icon = "mega_legion" desc = "One of many." icon = 'icons/mob/lavaland/96x96megafauna.dmi' attack_verb_continuous = "chomps" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 0bf55c1a321..ef5784a93a0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -98,6 +98,7 @@ mob/living/simple_animal/hostile/asteroid/basilisk/proc/cool_down() icon_living = "watcher" icon_aggro = "watcher" icon_dead = "watcher_dead" + health_doll_icon = "watcher" pixel_x = -10 throw_message = "bounces harmlessly off of" melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 8cb629c9025..6bcb7ae83c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -88,12 +88,12 @@ While using this makes the system rely on OnFire, it still gives options for tim update_health_hud() /mob/living/simple_animal/hostile/asteroid/elite/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(hud_used?.healthdoll) switch(healthpercent) if(100 to INFINITY) - hud_used.healths.icon_state = "elite_health0" + severity = 0 if(80 to 100) severity = 1 if(60 to 80) @@ -108,11 +108,11 @@ While using this makes the system rely on OnFire, it still gives options for tim severity = 6 else severity = 7 - hud_used.healths.icon_state = "elite_health[severity]" - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") + hud_used.healthdoll.icon_state = "elite_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") //The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm index 1bcd3173eae..d085204bc1f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm @@ -25,6 +25,7 @@ icon_aggro = "broodmother" icon_dead = "egg_sac" icon_gib = "syndicate_gib" + health_doll_icon = "broodmother" maxHealth = 800 health = 800 melee_damage_lower = 30 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 3f184e2f52d..66e62ba68ca 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -24,6 +24,7 @@ icon_aggro = "herald" icon_dead = "herald_dying" icon_gib = "syndicate_gib" + health_doll_icon = "herald" maxHealth = 800 health = 800 melee_damage_lower = 20 @@ -38,55 +39,55 @@ deathsound = 'sound/magic/demon_dies.ogg' deathmessage = "begins to shudder as it becomes transparent..." loot_drop = /obj/item/clothing/neck/cloak/herald_cloak - + can_talk = 1 attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, /datum/action/innate/elite_attack/herald_directionalshot, /datum/action/innate/elite_attack/herald_teleshot, /datum/action/innate/elite_attack/herald_mirror) - + var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/my_mirror = null var/is_mirror = FALSE - + /mob/living/simple_animal/hostile/asteroid/elite/herald/death() . = ..() if(!is_mirror) addtimer(CALLBACK(src, .proc/become_ghost), 8) if(my_mirror != null) qdel(my_mirror) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() icon_state = "herald_ghost" - + /mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) . = ..() playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - + /datum/action/innate/elite_attack/herald_trishot name = "Triple Shot" button_icon_state = "herald_trishot" chosen_message = "You are now firing three shots in your chosen direction." chosen_attack_num = HERALD_TRISHOT - + /datum/action/innate/elite_attack/herald_directionalshot name = "Circular Shot" button_icon_state = "herald_directionalshot" chosen_message = "You are firing projectiles in all directions." chosen_attack_num = HERALD_DIRECTIONALSHOT - + /datum/action/innate/elite_attack/herald_teleshot name = "Teleport Shot" button_icon_state = "herald_teleshot" chosen_message = "You will now fire a shot which teleports you where it lands." chosen_attack_num = HERALD_TELESHOT - + /datum/action/innate/elite_attack/herald_mirror name = "Summon Mirror" button_icon_state = "herald_mirror" chosen_message = "You will spawn a mirror which duplicates your attacks." chosen_attack_num = HERALD_MIRROR - + /mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire() if(client) switch(chosen_attack) @@ -121,7 +122,7 @@ my_mirror.herald_teleshot(target) if(HERALD_MIRROR) herald_mirror() - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, var/is_teleshot) var/turf/startloc = get_turf(src) var/obj/projectile/herald/H = null @@ -134,7 +135,7 @@ if(target) H.original = target H.fire(set_angle) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) ranged_cooldown = world.time + 30 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) @@ -148,17 +149,17 @@ addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 10) addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 12) addtimer(CALLBACK(src, .proc/shoot_projectile, target_turf, angle_to_target, FALSE), 14) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot() var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) for(var/i in directional_shot_angles) shoot_projectile(get_turf(src), i, FALSE) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/unenrage() if(stat == DEAD || is_mirror) return icon_state = "herald" - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_directionalshot() ranged_cooldown = world.time + 50 if(!is_mirror) @@ -169,14 +170,14 @@ playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) addtimer(CALLBACK(src, .proc/herald_circleshot), 15) addtimer(CALLBACK(src, .proc/unenrage), 20) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) ranged_cooldown = world.time + 30 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) var/target_turf = get_turf(target) var/angle_to_target = Get_Angle(src, target_turf) shoot_projectile(target_turf, angle_to_target, TRUE) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_mirror() ranged_cooldown = world.time + 40 playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) @@ -187,7 +188,7 @@ my_mirror = new_mirror my_mirror.my_master = src my_mirror.faction = faction.Copy() - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror name = "herald's mirror" desc = "This fiendish work of magic copies the herald's attacks. Seems logical to smash it." @@ -200,16 +201,16 @@ del_on_death = TRUE is_mirror = TRUE var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize() ..() toggle_ai(AI_OFF) - + /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy() if(my_master != null) my_master.my_mirror = null . = ..() - + /obj/projectile/herald name ="death bolt" icon_state= "chronobolt" @@ -219,7 +220,7 @@ eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE - + /obj/projectile/herald/teleshot name ="golden bolt" damage = 0 @@ -236,11 +237,11 @@ var/mob/living/F = firer if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) L.heal_overall_damage(damage) - + /obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) . = ..() firer.forceMove(get_turf(src)) - + //Herald's loot: Cloak of the Prophet /obj/item/clothing/neck/cloak/herald_cloak @@ -250,12 +251,12 @@ icon_state = "herald_cloak" body_parts_covered = CHEST|GROIN|ARMS hit_reaction_chance = 10 - + /obj/item/clothing/neck/cloak/herald_cloak/proc/reactionshot(mob/living/carbon/owner) var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) for(var/i in directional_shot_angles) shoot_projectile(get_turf(owner), i, owner) - + /obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) var/turf/startloc = get_turf(owner) var/obj/projectile/herald/H = null @@ -263,7 +264,7 @@ H.preparePixelProjectile(marker, startloc) H.firer = owner H.fire(set_angle) - + /obj/item/clothing/neck/cloak/herald_cloak/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) . = ..() if(rand(1,100) > hit_reaction_chance) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 4d1d07aba44..19674971b29 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -12,7 +12,7 @@ * - Charges at the target after a telegraph, throwing them across the arena should it connect. * - Legionnaire's head detaches, attacking as it's own entity. Has abilities of it's own later into the fight. Once dead, regenerates after a brief period. If the skill is used while the head is off, it will be killed. * - Leaves a pile of bones at your location. Upon using this skill again, you'll swap locations with the bone pile. - * - Spews a cloud of smoke from it's maw, wherever said maw is. + * - Spews a cloud of smoke from it's maw, wherever said maw is. * A unique fight incorporating the head mechanic of legion into a whole new beast. Combatants will need to make sure the tag-team of head and body don't lure them into a deadly trap. */ @@ -24,6 +24,7 @@ icon_aggro = "legionnaire" icon_dead = "legionnaire_dead" icon_gib = "syndicate_gib" + health_doll_icon = "legionnaire" maxHealth = 800 health = 800 melee_damage_lower = 30 @@ -43,35 +44,35 @@ /datum/action/innate/elite_attack/head_detach, /datum/action/innate/elite_attack/bonfire_teleport, /datum/action/innate/elite_attack/spew_smoke) - + var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/myhead = null var/obj/structure/legionnaire_bonfire/mypile = null var/has_head = TRUE - + /datum/action/innate/elite_attack/legionnaire_charge name = "Legionnaire Charge" button_icon_state = "legionnaire_charge" chosen_message = "You will attempt to grab your opponent and throw them." chosen_attack_num = LEGIONNAIRE_CHARGE - + /datum/action/innate/elite_attack/head_detach name = "Release Head" button_icon_state = "head_detach" chosen_message = "You will now detach your head or kill it if it is already released." chosen_attack_num = HEAD_DETACH - + /datum/action/innate/elite_attack/bonfire_teleport name = "Bonfire Teleport" button_icon_state = "bonfire_teleport" chosen_message = "You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it." chosen_attack_num = BONFIRE_TELEPORT - + /datum/action/innate/elite_attack/spew_smoke name = "Spew Smoke" button_icon_state = "spew_smoke" chosen_message = "Your head will spew smoke in an area, wherever it may be." chosen_attack_num = SPEW_SMOKE - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire() if(client) switch(chosen_attack) @@ -94,7 +95,7 @@ bonfire_teleport() if(SPEW_SMOKE) spew_smoke() - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge(target) ranged_cooldown = world.time + 50 var/dir_to_target = get_dir(get_turf(src), get_turf(target)) @@ -105,7 +106,7 @@ playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) visible_message("[src] prepares to charge!") addtimer(CALLBACK(src, .proc/legionnaire_charge_2, dir_to_target, 0), 5) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(var/move_dir, var/times_ran) if(times_ran >= 4) return @@ -133,7 +134,7 @@ L.Paralyze(20) L.adjustBruteLoss(50) addtimer(CALLBACK(src, .proc/legionnaire_charge_2, move_dir, (times_ran + 1)), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) ranged_cooldown = world.time + 10 if(myhead != null) @@ -157,11 +158,11 @@ else if(health < maxHealth * 0.5) myhead.melee_damage_lower = 20 myhead.melee_damage_upper = 20 - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() myhead = null addtimer(CALLBACK(src, .proc/regain_head), 50) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() has_head = TRUE if(stat == DEAD) @@ -193,7 +194,7 @@ forceMove(pileturf) visible_message("[src] forms from the bonfire!") mypile.forceMove(legionturf) - + /mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/spew_smoke() ranged_cooldown = world.time + 60 var/turf/T = null @@ -210,7 +211,7 @@ var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(2, T) smoke.start() - + //The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead name = "legionnaire head" @@ -235,12 +236,12 @@ faction = list() ranged = FALSE var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/body = null - + /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/death() . = ..() if(body) body.onHeadDeath() - + //The legionnaire's bonfire, which can be swapped positions with. Also sets flammable living beings on fire when they walk over it. /obj/structure/legionnaire_bonfire name = "bone pile" @@ -254,20 +255,20 @@ light_range = 4 light_color = LIGHT_COLOR_RED var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/myowner = null - - + + /obj/structure/legionnaire_bonfire/Entered(atom/movable/mover, atom/target) if(isliving(mover)) var/mob/living/L = mover L.adjust_fire_stacks(3) L.IgniteMob() . = ..() - + /obj/structure/legionnaire_bonfire/Destroy() if(myowner != null) myowner.mypile = null . = ..() - + //The visual effect which appears in front of legionnaire when he goes to charge. /obj/effect/temp_visual/dragon_swoop/legionnaire duration = 10 @@ -276,7 +277,7 @@ /obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize() . = ..() transform *= 0.33 - + // Legionnaire's loot: Legionnaire Spine /obj/item/crusher_trophy/legionnaire_spine diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 7422a441aa2..511362d1236 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -24,6 +24,7 @@ icon_aggro = "pandora" icon_dead = "pandora_dead" icon_gib = "syndicate_gib" + health_doll_icon = "pandora" maxHealth = 800 health = 800 melee_damage_lower = 15 @@ -43,34 +44,34 @@ /datum/action/innate/elite_attack/magic_box, /datum/action/innate/elite_attack/pandora_teleport, /datum/action/innate/elite_attack/aoe_squares) - + var/sing_shot_length = 8 var/cooldown_time = 20 - + /datum/action/innate/elite_attack/singular_shot name = "Singular Shot" button_icon_state = "singular_shot" chosen_message = "You are now creating a single linear magic square." chosen_attack_num = SINGULAR_SHOT - + /datum/action/innate/elite_attack/magic_box name = "Magic Box" button_icon_state = "magic_box" chosen_message = "You are now attacking with a box of magic squares." chosen_attack_num = MAGIC_BOX - + /datum/action/innate/elite_attack/pandora_teleport name = "Line Teleport" button_icon_state = "pandora_teleport" chosen_message = "You will now teleport to your target." chosen_attack_num = PANDORA_TELEPORT - + /datum/action/innate/elite_attack/aoe_squares name = "AOE Blast" button_icon_state = "aoe_squares" chosen_message = "Your attacks will spawn an AOE blast at your target location." chosen_attack_num = AOE_SQUARES - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire() if(client) switch(chosen_attack) @@ -93,7 +94,7 @@ pandora_teleport(target) if(AOE_SQUARES) aoe_squares(target) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/Life() . = ..() if(health >= maxHealth * 0.5) @@ -104,13 +105,13 @@ return else cooldown_time = 10 - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) ranged_cooldown = world.time + (cooldown_time * 0.5) var/dir_to_target = get_dir(get_turf(src), get_turf(target)) var/turf/T = get_step(get_turf(src), dir_to_target) singular_shot_line(sing_shot_length, dir_to_target, T) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(var/procsleft, var/angleused, var/turf/T) if(procsleft <= 0) return @@ -118,14 +119,14 @@ T = get_step(T, angleused) procsleft = procsleft - 1 addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) for(var/t in spiral_range_turfs(3, T)) if(get_dist(t, T) > 1) new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) @@ -134,7 +135,7 @@ new /obj/effect/temp_visual/hierophant/telegraph(source, src) playsound(source,'sound/machines/airlockopen.ogg', 200, 1) addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(var/turf/T, var/turf/source) new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) @@ -146,20 +147,20 @@ visible_message("[src] fades out!") density = FALSE addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(var/turf/T) forceMove(T) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN density = TRUE visible_message("[src] fades in!") - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) var/max_size = 2 addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(var/turf/T, var/ring, var/max_size) if(ring > max_size) return @@ -167,12 +168,12 @@ if(get_dist(t, T) == ring) new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2) - + //The specific version of hiero's squares pandora uses /obj/effect/temp_visual/hierophant/blast/pandora damage = 20 monster_damage_boost = FALSE - + //Pandora's loot: Hope /obj/item/clothing/accessory/pandora_hope name = "Hope" @@ -180,7 +181,7 @@ icon = 'icons/obj/lavaland/elite_trophies.dmi' icon_state = "hope" resistance_flags = FIRE_PROOF - + /obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user) var/mob/living/L = user if(L && L.mind) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm index 4cecdf37dee..c835d5cc011 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm @@ -32,6 +32,7 @@ move_force = MOVE_FORCE_VERY_STRONG move_resist = MOVE_FORCE_VERY_STRONG pull_force = MOVE_FORCE_VERY_STRONG + gender = MALE//lavaland elite goliath says that i'''' 't s female and i ''t s stronger because of sexual dimorphism, so normal goliaths should be male var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) @@ -49,9 +50,11 @@ return icon_state = pre_attack_icon -/mob/living/simple_animal/hostile/asteroid/goliath/revive(full_heal = FALSE, admin_revive = FALSE) +/mob/living/simple_animal/hostile/asteroid/goliath/revive(full_heal = FALSE, admin_revive = FALSE)//who the fuck anchors mobs if(..()) - anchored = TRUE + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG . = 1 /mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) @@ -99,6 +102,39 @@ loot = list() stat_attack = UNCONSCIOUS robust_searching = 1 + food_type = list(/obj/item/reagent_containers/food/snacks/customizable/salad/ashsalad, /obj/item/reagent_containers/food/snacks/customizable/soup/ashsoup, /obj/item/reagent_containers/food/snacks/grown/ash_flora)//use lavaland plants to feed the lavaland monster + tame_chance = 10 + bonus_tame_chance = 5 + var/saddled = FALSE + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/tamed(whomst) + if(isliving(whomst)) + var/mob/living/fren = whomst + friends = fren + faction = fren.faction.Copy() + ..() + +/mob/living/simple_animal/hostile/asteroid/goliath/beast/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/saddle) && !saddled) + if(tame && do_after(user,55,target=src)) + user.visible_message("You manage to put [O] on [src], you can now ride [p_them()].") + qdel(O) + saddled = TRUE + can_buckle = TRUE + buckle_lying = FALSE + add_overlay("goliath_saddled") + var/datum/component/riding/D = LoadComponent(/datum/component/riding) + D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8))) + D.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) + D.set_vehicle_dir_layer(EAST, OBJ_LAYER) + D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + D.keytype = /obj/item/key/lasso + D.drive_verb = "ride" + else + user.visible_message("[src] is rocking around! You can't put the saddle on!") + return + ..() /mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize() . = ..() @@ -202,3 +238,9 @@ icon_state = "Goliath_tentacle_retract" deltimer(timerid) timerid = QDEL_IN(src, 7) + +/obj/item/saddle + name = "saddle" + desc = "This saddle will solve all your problems with being killed by lava beasts!" + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "saddle" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index 640d229993f..e9bea26e228 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -231,6 +231,7 @@ icon_state = "legion" icon_living = "legion" icon_dead = "legion" + health_doll_icon = "legion" health = 450 maxHealth = 450 melee_damage_lower = 20 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index ef4d5a0906c..0e41dcb6fa7 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -6,6 +6,7 @@ icon_living = "clown" icon_dead = "clown_dead" icon_gib = "clown_gib" + health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this mob_biotypes = MOB_ORGANIC|MOB_HUMANOID turns_per_move = 5 response_disarm_continuous = "gently pushes aside" diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index c167fa45f68..b5e5ccfbbed 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -6,6 +6,7 @@ icon_living = "pine_1" icon_dead = "pine_1" icon_gib = "pine_1" + health_doll_icon = "pine_1" gender = NEUTER speak_chance = 0 turns_per_move = 5 @@ -40,7 +41,7 @@ loot = list(/obj/item/stack/sheet/mineral/wood) gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 - + var/is_tree = TRUE /mob/living/simple_animal/hostile/tree/Life() @@ -73,6 +74,7 @@ icon_living = "festivus_pole" icon_dead = "festivus_pole" icon_gib = "festivus_pole" + health_doll_icon = "festivus_pole" response_help_continuous = "rubs" response_help_simple = "rub" loot = list(/obj/item/stack/rods) @@ -80,7 +82,7 @@ faction = list() 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) is_tree = FALSE - + /mob/living/simple_animal/hostile/tree/festivus/attack_hand(mob/living/carbon/human/M) . = ..() if(M.a_intent == "help") diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index 76f80ab9287..c958a784067 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -8,6 +8,7 @@ icon_aggro = "Fugu0" icon_dead = "Fugu_dead" icon_gib = "syndicate_gib" + health_doll_icon = "Fugu0" mob_biotypes = MOB_ORGANIC|MOB_BEAST mouse_opacity = MOUSE_OPACITY_ICON move_to_delay = 5 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index f931fc712e9..624db6c1178 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -93,11 +93,10 @@ var/obj/parrot_perch = null var/obj/desired_perches = list(/obj/structure/frame/computer, /obj/structure/displaycase, \ /obj/structure/filingcabinet, /obj/machinery/teleport, \ - /obj/machinery/computer, /obj/machinery/clonepod, \ /obj/machinery/dna_scannernew, /obj/machinery/telecomms, \ /obj/machinery/nuclearbomb, /obj/machinery/particle_accelerator, \ /obj/machinery/recharge_station, /obj/machinery/smartfridge, \ - /obj/machinery/suit_storage_unit) + /obj/machinery/computer, /obj/machinery/suit_storage_unit) //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. var/obj/item/held_item = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c8ad7a11c91..675f4dde2a6 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -184,12 +184,12 @@ return if (prob(tame_chance)) //note: lack of feedback message is deliberate, keep them guessing! tame = TRUE - tamed() + tamed(user) else tame_chance += bonus_tame_chance ///Extra effects to add when the mob is tamed, such as adding a riding component -/mob/living/simple_animal/proc/tamed() +/mob/living/simple_animal/proc/tamed(whomst) return /mob/living/simple_animal/examine(mob/user) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 247466a4f0a..996b82f6000 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -167,34 +167,31 @@ update_health_hud() /mob/living/simple_animal/slime/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 + var/severity = 0 + var/healthpercent = (health/maxHealth) * 100 + if(hud_used?.healthdoll) switch(healthpercent) if(100 to INFINITY) - hud_used.healths.icon_state = "slime_health0" + severity = 0 if(80 to 100) - hud_used.healths.icon_state = "slime_health1" severity = 1 if(60 to 80) - hud_used.healths.icon_state = "slime_health2" severity = 2 if(40 to 60) - hud_used.healths.icon_state = "slime_health3" severity = 3 if(20 to 40) - hud_used.healths.icon_state = "slime_health4" severity = 4 - if(1 to 20) - hud_used.healths.icon_state = "slime_health5" + if(10 to 20) severity = 5 - else - hud_used.healths.icon_state = "slime_health7" + if(1 to 20) severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") + else + severity = 7 + hud_used.healthdoll.icon_state = "slime_health[severity]" + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") /mob/living/simple_animal/slime/adjust_bodytemperature() . = ..() diff --git a/code/modules/modular_computers/computers/item/laptop_presets.dm b/code/modules/modular_computers/computers/item/laptop_presets.dm index 7a2697ab12e..6ae8d1346ee 100644 --- a/code/modules/modular_computers/computers/item/laptop_presets.dm +++ b/code/modules/modular_computers/computers/item/laptop_presets.dm @@ -20,4 +20,3 @@ /obj/item/modular_computer/laptop/preset/civillian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index d2465cf85bc..8c6def18e05 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -49,7 +49,6 @@ /obj/machinery/modular_computer/console/preset/research/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) hard_drive.store_file(new/datum/computer_file/program/chatclient()) hard_drive.store_file(new/datum/computer_file/program/aidiag()) @@ -76,5 +75,4 @@ /obj/machinery/modular_computer/console/preset/civilian/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] hard_drive.store_file(new/datum/computer_file/program/chatclient()) - hard_drive.store_file(new/datum/computer_file/program/nttransfer()) hard_drive.store_file(new/datum/computer_file/program/arcade()) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 2e2aa8e9eb3..4e862c4ae35 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -3,8 +3,8 @@ var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case var/size = 1 // File size in GQ. Integers only! var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. - var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. - var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. + var/unsendable = FALSE // Whether the file may be sent to someone via NTNet transfer or other means. + var/undeletable = FALSE // Whether the file may be deleted. Setting to TRUE prevents deletion/renaming/etc. var/uid // UID of this file var/static/file_uid = 0 @@ -24,7 +24,7 @@ return ..() // Returns independent copy of this file. -/datum/computer_file/proc/clone(rename = 0) +/datum/computer_file/proc/clone(rename = FALSE) var/datum/computer_file/temp = new type temp.unsendable = unsendable temp.undeletable = undeletable diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index 4a40b3cf86e..af1d88fb80b 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -4,12 +4,12 @@ program_icon_state = "generic" extended_desc = "This program is capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot." size = 12 - requires_ntnet = 0 + requires_ntnet = FALSE usage_flags = PROGRAM_CONSOLE transfer_access = ACCESS_HEADS - available_on_ntnet = 1 + available_on_ntnet = TRUE tgui_id = "ntos_ai_restorer" - ui_x = 600 + ui_x = 370 ui_y = 400 var/restoring = FALSE @@ -30,11 +30,11 @@ if(ai_slot.stored_card.AI) return ai_slot.stored_card.AI - return null + return /datum/computer_file/program/aidiag/ui_act(action, params) if(..()) - return TRUE + return var/mob/living/silicon/ai/A = get_ai() if(!A) @@ -54,7 +54,7 @@ return TRUE /datum/computer_file/program/aidiag/process_tick() - ..() + . = ..() if(!restoring) //Put the check here so we don't check for an ai all the time return var/obj/item/aicard/cardhold = get_ai(2) @@ -91,9 +91,7 @@ /datum/computer_file/program/aidiag/ui_data(mob/user) var/list/data = get_header_data() - var/mob/living/silicon/ai/AI - // A shortcut for getting the AI stored inside the computer. The program already does necessary checks. - AI = get_ai() + var/mob/living/silicon/ai/AI = get_ai() var/obj/item/aicard/aicard = get_ai(2) @@ -119,4 +117,4 @@ /datum/computer_file/program/aidiag/kill_program(forced) restoring = FALSE - return ..(forced) + return ..() diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index 140b9d30f7a..004b86ef81d 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -4,9 +4,9 @@ program_icon_state = "hostile" extended_desc = "This advanced script can perform denial of service attacks against NTNet quantum relays. The system administrator will probably notice this. Multiple devices can run this program together against same relay for increased effect" size = 20 - requires_ntnet = 1 - available_on_ntnet = 0 - available_on_syndinet = 1 + requires_ntnet = TRUE + available_on_ntnet = FALSE + available_on_syndinet = TRUE tgui_id = "ntos_net_dos" ui_x = 400 ui_y = 250 @@ -36,61 +36,52 @@ if(target) target.dos_sources.Remove(src) target = null - executed = 0 + executed = FALSE ..() /datum/computer_file/program/ntnet_dos/ui_act(action, params) if(..()) - return 1 + return switch(action) if("PRG_target_relay") for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays) if("[R.uid]" == params["targid"]) target = R - return 1 + break + return TRUE if("PRG_reset") if(target) target.dos_sources.Remove(src) target = null - executed = 0 + executed = FALSE error = "" - return 1 + return TRUE if("PRG_execute") if(target) - executed = 1 + executed = TRUE target.dos_sources.Add(src) if(SSnetworks.station_network.intrusion_detection_enabled) var/obj/item/computer_hardware/network_card/network_card = computer.all_components[MC_NET] SSnetworks.station_network.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]") - SSnetworks.station_network.intrusion_detection_alarm = 1 - return 1 + SSnetworks.station_network.intrusion_detection_alarm = TRUE + return TRUE /datum/computer_file/program/ntnet_dos/ui_data(mob/user) if(!SSnetworks.station_network) return - var/list/data = list() + var/list/data = get_header_data() - data = get_header_data() - - if(error) - data["error"] = error - else if(target && executed) - data["target"] = 1 + data["error"] = error + if(target && executed) + data["target"] = TRUE data["speed"] = dos_speed - // This is mostly visual, generate some strings of 1s and 0s - // Probability of 1 is equal of completion percentage of DoS attack on this relay. - // Combined with UI updates this adds quite nice effect to the UI - var/percentage = target.dos_overload * 100 / target.dos_capacity - data["dos_strings"] = list() - for(var/j, j<10, j++) - var/string = "" - for(var/i, i<20, i++) - string = "[string][prob(percentage)]" - data["dos_strings"] += list(list("nums" = string)) + data["overload"] = target.dos_overload + data["capacity"] = target.dos_capacity else + data["target"] = FALSE data["relays"] = list() for(var/obj/machinery/ntnet_relay/R in SSnetworks.station_network.relays) data["relays"] += list(list("id" = R.uid)) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index af2d3f099d9..5b85e5a67bb 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -4,9 +4,9 @@ program_icon_state = "hostile" extended_desc = "This virus can destroy hard drive of system it is executed on. It may be obfuscated to look like another non-malicious program. Once armed, it will destroy the system upon next execution." size = 13 - requires_ntnet = 0 - available_on_ntnet = 0 - available_on_syndinet = 1 + requires_ntnet = FALSE + available_on_ntnet = FALSE + available_on_syndinet = TRUE tgui_id = "ntos_revelation" ui_x = 400 ui_y = 250 @@ -21,7 +21,7 @@ /datum/computer_file/program/revelation/proc/activate() if(computer) computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") - computer.enabled = 0 + computer.enabled = FALSE computer.update_icon() var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] var/obj/item/computer_hardware/battery/battery_module = computer.all_components[MC_CELL] @@ -43,18 +43,20 @@ /datum/computer_file/program/revelation/ui_act(action, params) if(..()) - return 1 + return switch(action) if("PRG_arm") armed = !armed + return TRUE if("PRG_activate") activate() + return TRUE if("PRG_obfuscate") - var/mob/living/user = usr - var/newname = sanitize(input(user, "Enter new program name: ")) + var/newname = params["new_name"] if(!newname) return filedesc = newname + return TRUE /datum/computer_file/program/revelation/clone() diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm index fb90ecbfad1..52ba479c049 100644 --- a/code/modules/modular_computers/file_system/programs/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -4,9 +4,9 @@ extended_desc = "This program allows management of files." program_icon_state = "generic" size = 8 - requires_ntnet = 0 - available_on_ntnet = 0 - undeletable = 1 + requires_ntnet = FALSE + available_on_ntnet = FALSE + undeletable = TRUE tgui_id = "ntos_file_manager" var/open_file @@ -14,176 +14,57 @@ /datum/computer_file/program/filemanager/ui_act(action, params) if(..()) - return 1 + return var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD] var/obj/item/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD] - var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT] switch(action) - if("PRG_openfile") - . = 1 - open_file = params["name"] - if("PRG_newtextfile") - . = 1 - var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) - if(!newname) - return 1 - if(!HDD) - return 1 - var/datum/computer_file/data/F = new/datum/computer_file/data() - F.filename = newname - F.filetype = "TXT" - HDD.store_file(F) if("PRG_deletefile") - . = 1 if(!HDD) - return 1 + return var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) if(!file || file.undeletable) - return 1 + return HDD.remove_file(file) + return TRUE if("PRG_usbdeletefile") - . = 1 if(!RHDD) - return 1 + return var/datum/computer_file/file = RHDD.find_file_by_name(params["name"]) if(!file || file.undeletable) - return 1 - RHDD.remove_file(file) - if("PRG_closefile") - . = 1 - open_file = null - error = null - if("PRG_clone") - . = 1 - if(!HDD) - return 1 - var/datum/computer_file/F = HDD.find_file_by_name(params["name"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(1) - HDD.store_file(C) - if("PRG_rename") - . = 1 - if(!HDD) - return 1 - var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) - if(!file || !istype(file)) - return 1 - var/newname = stripped_input(usr, "Enter new file name:", "File rename", file.filename, max_length=50) - if(file && newname) - file.filename = newname - if("PRG_edit") - . = 1 - if(!open_file) - return 1 - if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) - return 1 - // 16384 is the limit for file length in characters. Currently, papers have value of 2048 so this is 8 times as long, since we can't edit parts of the file independently. - var/newtext = stripped_multiline_input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", html_decode(F.stored_data), 16384, TRUE) - if(!newtext) return - if(F) - var/datum/computer_file/data/backup = F.clone() - HDD.remove_file(F) - F.stored_data = newtext - F.calculate_size() - // We can't store the updated file, it's probably too large. Print an error and restore backed up version. - // This is mostly intended to prevent people from losing texts they spent lot of time working on due to running out of space. - // They will be able to copy-paste the text from error screen and store it in notepad or something. - if(!HDD.store_file(F)) - error = "I/O error: Unable to overwrite file. Hard drive is probably full. You may want to backup your changes before closing this window:

[F.stored_data]

" - HDD.store_file(backup) - if("PRG_printfile") - . = 1 - if(!open_file) - return 1 + RHDD.remove_file(file) + return TRUE + if("PRG_rename") if(!HDD) - return 1 - var/datum/computer_file/data/F = HDD.find_file_by_name(open_file) - if(!F || !istype(F)) - return 1 - if(!printer) - error = "Missing Hardware: Your computer does not have required hardware to complete this operation." - return 1 - if(!printer.print_text("" + prepare_printjob(F.stored_data) + "", open_file)) - error = "Hardware error: Printer was unable to print the file. It may be out of paper." - return 1 + return + var/datum/computer_file/file = HDD.find_file_by_name(params["name"]) + if(!file) + return + var/newname = params["new_name"] + if(!newname) + return + file.filename = newname + return TRUE if("PRG_copytousb") - . = 1 if(!HDD || !RHDD) - return 1 + return var/datum/computer_file/F = HDD.find_file_by_name(params["name"]) - if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) + if(!F) + return + var/datum/computer_file/C = F.clone(FALSE) RHDD.store_file(C) + return TRUE if("PRG_copyfromusb") - . = 1 if(!HDD || !RHDD) - return 1 + return var/datum/computer_file/F = RHDD.find_file_by_name(params["name"]) if(!F || !istype(F)) - return 1 - var/datum/computer_file/C = F.clone(0) + return + var/datum/computer_file/C = F.clone(FALSE) HDD.store_file(C) - -/datum/computer_file/program/filemanager/proc/parse_tags(t) - t = replacetext(t, "\[center\]", "
") - t = replacetext(t, "\[/center\]", "
") - t = replacetext(t, "\[br\]", "
") - t = replacetext(t, "\n", "
") - t = replacetext(t, "\[b\]", "") - t = replacetext(t, "\[/b\]", "") - t = replacetext(t, "\[i\]", "") - t = replacetext(t, "\[/i\]", "") - t = replacetext(t, "\[u\]", "") - t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[time\]", "[station_time_timestamp()]") - t = replacetext(t, "\[date\]", "[time2text(world.realtime, "MMM DD")] [GLOB.year_integer+540]") - t = replacetext(t, "\[large\]", "") - t = replacetext(t, "\[/large\]", "") - t = replacetext(t, "\[h1\]", "

") - t = replacetext(t, "\[/h1\]", "

") - t = replacetext(t, "\[h2\]", "

") - t = replacetext(t, "\[/h2\]", "

") - t = replacetext(t, "\[h3\]", "

") - t = replacetext(t, "\[/h3\]", "

") - t = replacetext(t, "\[*\]", "
  • ") - t = replacetext(t, "\[hr\]", "
    ") - t = replacetext(t, "\[small\]", "") - t = replacetext(t, "\[/small\]", "") - t = replacetext(t, "\[list\]", "
      ") - t = replacetext(t, "\[/list\]", "
    ") - t = replacetext(t, "\[table\]", "") - t = replacetext(t, "\[/table\]", "
    ") - t = replacetext(t, "\[grid\]", "") - t = replacetext(t, "\[/grid\]", "
    ") - t = replacetext(t, "\[row\]", "") - t = replacetext(t, "\[tr\]", "") - t = replacetext(t, "\[td\]", "") - t = replacetext(t, "\[cell\]", "") - t = replacetext(t, "\[tab\]", "    ") - - t = parsemarkdown_basic(t) - - return t - -/datum/computer_file/program/filemanager/proc/prepare_printjob(t) // Additional stuff to parse if we want to print it and make a happy Head of Personnel. Forms FTW. - t = replacetext(t, "\[field\]", "") - t = replacetext(t, "\[sign\]", "") - - t = parse_tags(t) - - t = replacetext(t, regex("(?:%s(?:ign)|%f(?:ield))(?=\\s|$)", "ig"), "") - - return t + return TRUE /datum/computer_file/program/filemanager/ui_data(mob/user) var/list/data = get_header_data() @@ -192,41 +73,28 @@ var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD] if(error) data["error"] = error - if(open_file) - var/datum/computer_file/data/file - - if(!computer || !HDD) - data["error"] = "I/O ERROR: Unable to access hard drive." - else - file = HDD.find_file_by_name(open_file) - if(!istype(file)) - data["error"] = "I/O ERROR: Unable to open file." - else - data["filedata"] = parse_tags(file.stored_data) - data["filename"] = "[file.filename].[file.filetype]" + if(!computer || !HDD) + data["error"] = "I/O ERROR: Unable to access hard drive." else - if(!computer || !HDD) - data["error"] = "I/O ERROR: Unable to access hard drive." - else - var/list/files[0] - for(var/datum/computer_file/F in HDD.stored_files) - files.Add(list(list( + var/list/files = list() + for(var/datum/computer_file/F in HDD.stored_files) + files += list(list( + "name" = F.filename, + "type" = F.filetype, + "size" = F.size, + "undeletable" = F.undeletable + )) + data["files"] = files + if(RHDD) + data["usbconnected"] = TRUE + var/list/usbfiles = list() + for(var/datum/computer_file/F in RHDD.stored_files) + usbfiles += list(list( "name" = F.filename, "type" = F.filetype, "size" = F.size, "undeletable" = F.undeletable - ))) - data["files"] = files - if(RHDD) - data["usbconnected"] = 1 - var/list/usbfiles[0] - for(var/datum/computer_file/F in RHDD.stored_files) - usbfiles.Add(list(list( - "name" = F.filename, - "type" = F.filetype, - "size" = F.size, - "undeletable" = F.undeletable - ))) - data["usbfiles"] = usbfiles + )) + data["usbfiles"] = usbfiles return data diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 226686fc042..1932f671f9b 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -4,58 +4,48 @@ program_icon_state = "comm_monitor" extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 - requires_ntnet = 1 + requires_ntnet = TRUE required_access = ACCESS_NETWORK //NETWORK CONTROL IS A MORE SECURE PROGRAM. - available_on_ntnet = 1 + available_on_ntnet = TRUE tgui_id = "ntos_net_monitor" /datum/computer_file/program/ntnetmonitor/ui_act(action, params) if(..()) - return 1 + return switch(action) if("resetIDS") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.resetIDS() - return 1 + return TRUE if("toggleIDS") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.toggleIDS() - return 1 + return TRUE if("toggleWireless") - . = 1 if(!SSnetworks.station_network) - return 1 + return // NTNet is disabled. Enabling can be done without user prompt if(SSnetworks.station_network.setting_disabled) - SSnetworks.station_network.setting_disabled = 0 - return 1 + SSnetworks.station_network.setting_disabled = FALSE + return TRUE - // NTNet is enabled and user is about to shut it down. Let's ask them if they really want to do it, as wirelessly connected computers won't connect without NTNet being enabled (which may prevent people from turning it back on) - var/mob/user = usr - if(!user) - return 1 - var/response = alert(user, "Really disable NTNet wireless? If your computer is connected wirelessly you won't be able to turn it back on! This will affect all connected wireless devices.", "NTNet shutdown", "Yes", "No") - if(response == "Yes") - SSnetworks.station_network.setting_disabled = 1 - return 1 + SSnetworks.station_network.setting_disabled = TRUE + return TRUE if("purgelogs") - . = 1 if(SSnetworks.station_network) SSnetworks.station_network.purge_logs() + return TRUE if("updatemaxlogs") - . = 1 - var/mob/user = usr - var/logcount = text2num(input(user,"Enter amount of logs to keep in memory ([MIN_NTNET_LOGS]-[MAX_NTNET_LOGS]):")) + var/logcount = params["new_number"] if(SSnetworks.station_network) SSnetworks.station_network.update_max_log_count(logcount) + return TRUE if("toggle_function") - . = 1 if(!SSnetworks.station_network) - return 1 + return SSnetworks.station_network.toggle_function(text2num(params["id"])) + return TRUE /datum/computer_file/program/ntnetmonitor/ui_data(mob/user) if(!SSnetworks.station_network) @@ -73,6 +63,8 @@ data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol data["ntnetlogs"] = list() + data["minlogs"] = MIN_NTNET_LOGS + data["maxlogs"] = MAX_NTNET_LOGS for(var/i in SSnetworks.station_network.logs) data["ntnetlogs"] += list(list("entry" = i)) diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm deleted file mode 100644 index eef2eedd531..00000000000 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ /dev/null @@ -1,183 +0,0 @@ -/datum/computer_file/program/nttransfer - filename = "nttransfer" - filedesc = "P2P Transfer Client" - extended_desc = "This program allows for simple file transfer via direct peer to peer connection." - program_icon_state = "comm_logs" - size = 7 - requires_ntnet = 1 - requires_ntnet_feature = NTNET_PEERTOPEER - network_destination = "other device via P2P tunnel" - available_on_ntnet = 1 - tgui_id = "ntos_net_transfer" - - var/error = "" // Error screen - var/server_password = "" // Optional password to download the file. - var/datum/computer_file/provided_file = null // File which is provided to clients. - var/datum/computer_file/downloaded_file = null // File which is being downloaded - var/list/connected_clients = list() // List of connected clients. - var/datum/computer_file/program/nttransfer/remote // Client var, specifies who are we downloading from. - var/download_completion = 0 // Download progress in GQ - var/download_netspeed = 0 // Our connectivity speed in GQ/s - var/actual_netspeed = 0 // Displayed in the UI, this is the actual transfer speed. - var/unique_token // UID of this program - var/upload_menu = 0 // Whether we show the program list and upload menu - var/static/nttransfer_uid = 0 - -/datum/computer_file/program/nttransfer/New() - unique_token = nttransfer_uid++ - ..() - -/datum/computer_file/program/nttransfer/process_tick() - // Server mode - update_netspeed() - if(provided_file) - for(var/datum/computer_file/program/nttransfer/C in connected_clients) - // Transfer speed is limited by device which uses slower connectivity. - // We can have multiple clients downloading at same time, but let's assume we use some sort of multicast transfer - // so they can all run on same speed. - C.actual_netspeed = min(C.download_netspeed, download_netspeed) - C.download_completion += C.actual_netspeed - if(C.download_completion >= provided_file.size) - C.finish_download() - else if(downloaded_file) // Client mode - if(!remote) - crash_download("Connection to remote server lost") - -/datum/computer_file/program/nttransfer/kill_program(forced = FALSE) - if(downloaded_file) // Client mode, clean up variables for next use - finalize_download() - - if(provided_file) // Server mode, disconnect all clients - for(var/datum/computer_file/program/nttransfer/P in connected_clients) - P.crash_download("Connection terminated by remote server") - downloaded_file = null - ..(forced) - -/datum/computer_file/program/nttransfer/proc/update_netspeed() - download_netspeed = 0 - switch(ntnet_status) - if(1) - download_netspeed = NTNETSPEED_LOWSIGNAL - if(2) - download_netspeed = NTNETSPEED_HIGHSIGNAL - if(3) - download_netspeed = NTNETSPEED_ETHERNET - -// Finishes download and attempts to store the file on HDD -/datum/computer_file/program/nttransfer/proc/finish_download() - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file)) - error = "I/O Error: Unable to save file. Check your hard drive and try again." - finalize_download() - -// Crashes the download and displays specific error message -/datum/computer_file/program/nttransfer/proc/crash_download(var/message) - error = message ? message : "An unknown error has occurred during download" - finalize_download() - -// Cleans up variables for next use -/datum/computer_file/program/nttransfer/proc/finalize_download() - if(remote) - remote.connected_clients.Remove(src) - downloaded_file = null - remote = null - download_completion = 0 - -/datum/computer_file/program/nttransfer/ui_act(action, params) - if(..()) - return 1 - switch(action) - if("PRG_downloadfile") - for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers) - if("[P.unique_token]" == params["id"]) - remote = P - break - if(!remote || !remote.provided_file) - return - if(remote.server_password) - var/pass = reject_bad_text(input(usr, "Code 401 Unauthorized. Please enter password:", "Password required")) - if(pass != remote.server_password) - error = "Incorrect Password" - return - downloaded_file = remote.provided_file.clone() - remote.connected_clients.Add(src) - return 1 - if("PRG_reset") - error = "" - upload_menu = 0 - finalize_download() - if(src in SSnetworks.station_network.fileservers) - SSnetworks.station_network.fileservers.Remove(src) - for(var/datum/computer_file/program/nttransfer/T in connected_clients) - T.crash_download("Remote server has forcibly closed the connection") - provided_file = null - return 1 - if("PRG_setpassword") - var/pass = reject_bad_text(input(usr, "Enter new server password. Leave blank to cancel, input 'none' to disable password.", "Server security", "none")) - if(!pass) - return - if(pass == "none") - server_password = "" - return - server_password = pass - return 1 - if("PRG_uploadfile") - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - for(var/datum/computer_file/F in hard_drive.stored_files) - if("[F.uid]" == params["id"]) - if(F.unsendable) - error = "I/O Error: File locked." - return - if(istype(F, /datum/computer_file/program)) - var/datum/computer_file/program/P = F - if(!P.can_run(usr,transfer = 1)) - error = "Access Error: Insufficient rights to upload file." - provided_file = F - SSnetworks.station_network.fileservers.Add(src) - return - error = "I/O Error: Unable to locate file on hard drive." - return 1 - if("PRG_uploadmenu") - upload_menu = 1 - - -/datum/computer_file/program/nttransfer/ui_data(mob/user) - - var/list/data = get_header_data() - - if(error) - data["error"] = error - else if(downloaded_file) - data["downloading"] = 1 - data["download_size"] = downloaded_file.size - data["download_progress"] = download_completion - data["download_netspeed"] = actual_netspeed - data["download_name"] = "[downloaded_file.filename].[downloaded_file.filetype]" - else if (provided_file) - data["uploading"] = 1 - data["upload_uid"] = unique_token - data["upload_clients"] = connected_clients.len - data["upload_haspassword"] = server_password ? 1 : 0 - data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]" - else if (upload_menu) - var/list/all_files[0] - var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD] - for(var/datum/computer_file/F in hard_drive.stored_files) - all_files.Add(list(list( - "uid" = F.uid, - "filename" = "[F.filename].[F.filetype]", - "size" = F.size - ))) - data["upload_filelist"] = all_files - else - var/list/all_servers[0] - for(var/datum/computer_file/program/nttransfer/P in SSnetworks.station_network.fileservers) - all_servers.Add(list(list( - "uid" = P.unique_token, - "filename" = "[P.provided_file.filename].[P.provided_file.filetype]", - "size" = P.provided_file.size, - "haspassword" = P.server_password ? 1 : 0 - ))) - data["servers"] = all_servers - - return data diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index ef862aa9fab..bfe738a5bd6 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -26,7 +26,6 @@ Contents: //Important parts of the suit. var/mob/living/carbon/human/affecting = null - var/obj/item/stock_parts/cell/cell var/datum/effect_system/spark_spread/spark_system var/datum/techweb/stored_research var/obj/item/disk/tech_disk/t_disk//To copy design onto disk. @@ -72,10 +71,14 @@ Contents: //Cell Init cell = new/obj/item/stock_parts/cell/high - cell.charge = 9000 + cell.charge = 60000 // larger as it now heats cell.name = "black power cell" cell.icon_state = "bscell" +// seal the cell in the ninja outfit +/obj/item/clothing/suit/space/space_ninja/toggle_spacesuit_cell(mob/user) + return + //Simply deletes all the attachments and self, killing all related procs. /obj/item/clothing/suit/space/space_ninja/proc/terminate() qdel(n_hood) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index a285bee3a14..44d1d48acb1 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -112,56 +112,56 @@ info = "This shouldn't be seen. Error DEVIL:6" /obj/item/paper/contract/infernal/power/update_text(signature = "____________", blood = 0) - info = "
    Contract for infernal power



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for infernal power



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/wealth/update_text(signature = "____________", blood = 0) - info = "
    Contract for unlimited wealth



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for unlimited wealth



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/prestige/update_text(signature = "____________", blood = 0) - info = "
    Contract for prestige



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for prestige



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/magic/update_text(signature = "____________", blood = 0) - info = "
    Contract for magic



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for magic



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/revive/update_text(signature = "____________", blood = 0) - info = "
    Contract for resurrection



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for resurrection



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/knowledge/update_text(signature = "____________", blood = 0) - info = "
    Contract for knowledge



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for knowledge



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/friend/update_text(signature = "____________", blood = 0) - info = "
    Contract for a friend



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a friend. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for a friend



    I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a friend. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else info += "[signature]" /obj/item/paper/contract/infernal/unwilling/update_text(signature = "____________", blood = 0) - info = "
    Contract for slave



    I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, cloned, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " + info = "
    Contract for slave



    I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.


    Signed, " if(blood) info += "[signature]" else diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 2bcd2ad4f3e..62ff1f78950 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -180,8 +180,14 @@ var/list/mobs = list() var/blueprints = FALSE var/clone_area = SSmapping.RequestBlockReservation(size_x * 2 + 1, size_y * 2 + 1) - for(var/turf/T in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z))) - if((ai_user && GLOB.cameranet.checkTurfVis(T)) || (T in seen)) + for(var/turf/placeholder in block(locate(target_turf.x - size_x, target_turf.y - size_y, target_turf.z), locate(target_turf.x + size_x, target_turf.y + size_y, target_turf.z))) + var/turf/T = placeholder + while(istype(T, /turf/open/openspace)) //Multi-z photography + T = SSmapping.get_turf_below(T) + if(!T) + break + + if(T && ((ai_user && GLOB.cameranet.checkTurfVis(placeholder)) || (placeholder in seen))) turfs += T for(var/mob/M in T) mobs += M diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm index 87f68a85c32..cf55286d19c 100644 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ b/code/modules/plumbing/plumbers/grinder_chemical.dm @@ -7,29 +7,21 @@ rcd_cost = 30 rcd_delay = 30 buffer = 400 - var/eat_dir = NORTH + var/eat_dir = SOUTH /obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt) . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type) +/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user, rotation_type) if(anchored) to_chat(user, "It is fastened to the floor!") return FALSE - switch(eat_dir) - if(WEST) - eat_dir = NORTH - return TRUE - if(EAST) - eat_dir = SOUTH - return TRUE - if(NORTH) - eat_dir = EAST - return TRUE - if(SOUTH) - eat_dir = WEST - return TRUE + return TRUE + +/obj/machinery/plumbing/grinder_chemical/setDir(newdir) + . = ..() + eat_dir = newdir /obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM) . = ..() @@ -61,5 +53,7 @@ return I.on_grind() reagents.add_reagent_list(I.grind_results) + if(I.reagents) + I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) qdel(I) diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm index da10728b674..dd0b709be9e 100644 --- a/code/modules/plumbing/plumbers/pumps.dm +++ b/code/modules/plumbing/plumbers/pumps.dm @@ -1,16 +1,17 @@ ///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired. -/obj/machinery/power/liquid_pump +/obj/machinery/plumbing/liquid_pump name = "liquid pump" - desc = "Pump up those sweet liquids from under the surface." + desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasnt fun icon = 'icons/obj/plumbing/plumbers.dmi' icon_state = "pump" anchored = FALSE density = TRUE - circuit = /obj/item/circuitboard/machine/pump idle_power_usage = 10 active_power_usage = 1000 - ///Are we powered? - var/powered = FALSE + + rcd_cost = 30 + rcd_delay = 40 + ///units we pump per process (2 seconds) var/pump_power = 2 ///set to true if the loop couldnt find a geyser in process, so it remembers and stops checking every loop until moved. more accurate name would be absolutely_no_geyser_under_me_so_dont_try @@ -20,63 +21,42 @@ ///volume of our internal buffer var/volume = 200 -/obj/machinery/power/liquid_pump/Initialize() +/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt) . = ..() - create_reagents(volume) - AddComponent(/datum/component/plumbing/simple_supply, TRUE) + AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/power/liquid_pump/attackby(obj/item/W, mob/user, params) - if(!powered) - if(!anchored) - if(default_deconstruction_screwdriver(user, "[initial(icon_state)]_open", "[initial(icon_state)]",W)) - return - if(default_deconstruction_crowbar(W)) - return - return ..() - -/obj/machinery/power/liquid_pump/wrench_act(mob/living/user, obj/item/I) - ..() - default_unfasten_wrench(user, I) - return TRUE ///please note that the component has a hook in the parent call, wich handles activating and deactivating -/obj/machinery/power/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) +/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) geyser = null update_icon() - powered = FALSE geyserless = FALSE //we switched state, so lets just set this back aswell -/obj/machinery/power/liquid_pump/process() - if(!anchored || panel_open) +/obj/machinery/plumbing/liquid_pump/process() + if(!anchored || panel_open || geyserless) return - if(!geyser && !geyserless) + + if(!geyser) for(var/obj/structure/geyser/G in loc.contents) geyser = G + update_icon() if(!geyser) //we didnt find one, abort - anchored = FALSE geyserless = TRUE visible_message("The [name] makes a sad beep!") playsound(src, 'sound/machines/buzz-sigh.ogg', 50) return - if(avail(active_power_usage)) - if(!powered) //we werent powered before this tick so update our sprite - powered = TRUE - update_icon() - add_load(active_power_usage) - pump() - else if(powered) //we were powered, but now we arent - powered = FALSE - update_icon() + pump() + ///pump up that sweet geyser nectar -/obj/machinery/power/liquid_pump/proc/pump() +/obj/machinery/plumbing/liquid_pump/proc/pump() if(!geyser || !geyser.reagents) return geyser.reagents.trans_to(src, pump_power) -/obj/machinery/power/liquid_pump/update_icon_state() - if(powered) +/obj/machinery/plumbing/liquid_pump/update_icon_state() + if(geyser) icon_state = initial(icon_state) + "-on" else if(panel_open) icon_state = initial(icon_state) + "-open" diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ccbe8a06461..cf087e4eb8d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -959,7 +959,7 @@ . = UI_INTERACTIVE /obj/machinery/power/apc/ui_act(action, params) - if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer)) + if(..() || !can_use(usr, 1) || (locked && !usr.has_unlimited_silicon_privilege && !failure_timer && action != "toggle_nightshift")) return switch(action) if("lock") diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index d5f28462930..6ad239d3b88 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -1,42 +1,106 @@ +#define RELAY_OK 1 +#define RELAY_ADD_CABLE 2 +#define RELAY_ADD_METAL 3 + /obj/machinery/power/deck_relay //This bridges powernets name = "Multi-deck power adapter" desc = "A huge bundle of double insulated cabling which seems to run up into the ceiling." icon = 'icons/obj/power.dmi' icon_state = "cablerelay-off" + max_integrity = 350 + integrity_failure = 0.25 + var/broken_status = RELAY_OK var/obj/machinery/power/deck_relay/below ///The relay that's below us (for bridging powernets) var/obj/machinery/power/deck_relay/above ///The relay that's above us (for bridging powernets) anchored = TRUE density = FALSE -/obj/machinery/power/deck_relay/attackby(obj/item/I,mob/user) +/obj/machinery/power/deck_relay/examine(mob/user) + . += ..() + if(!anchored) + . += "The securing bolts are undone." + if(broken_status == RELAY_ADD_CABLE) + . += "The cable insulation is torn apart and the wires are frayed beyond use." + if(broken_status == RELAY_ADD_METAL) + . += "The cable insulation is torn apart and the wiring is exposed." + +/obj/machinery/power/deck_relay/attackby(obj/item/I, mob/user, params) if(default_unfasten_wrench(user, I)) + if(!anchored && broken_status == RELAY_OK) + break_connections() + return return FALSE + . = ..() + if(istype(I, /obj/item/stack/cable_coil) && broken_status == RELAY_ADD_CABLE) + var/obj/item/stack/C = I + if(C.use(15)) + to_chat(user, "You fix the frayed wires inside [src].") + icon_state = "cablerelay-broken-cable" + broken_status = RELAY_ADD_METAL + return + else + to_chat(user, "You need 15 cables to rewire [src].") + return + if(istype(I, /obj/item/stack/sheet/metal) && broken_status == RELAY_ADD_METAL) + var/obj/item/stack/S = I + if(S.use(10)) + to_chat(user, "You reseal the insulation for [src].") + icon_state = "cablerelay" + broken_status = RELAY_OK + obj_integrity = max_integrity + return + else + to_chat(user, "You need 10 metal to mend [src].") + return . = ..() -/obj/machinery/power/deck_relay/process() - if(!anchored) - icon_state = "cablerelay-off" - if(above) //Lose connections - above.below = null - if(below) - below.above = null - return - refresh() //Sometimes the powernets get lost, so we need to keep checking. - if(powernet && (powernet.avail <= 0)) // is it powered? - icon_state = "cablerelay-off" - else - icon_state = "cablerelay-on" - if(!below || QDELETED(below) || !above || QDELETED(above)) - icon_state = "cablerelay-off" - find_relays() +/obj/machinery/power/deck_relay/obj_break() + ..() + if(broken_status == RELAY_OK) + break_connections() + visible_message("[src]'s insulation breaks, fraying and severing the cable bundle!") + playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) + icon_state = "cablerelay-broken" + broken_status = RELAY_ADD_CABLE -///Allows you to scan the relay with a multitool to see stats. +/obj/machinery/power/deck_relay/obj_destruction() + return //this shouldn't break under usual means + +/obj/machinery/power/deck_relay/Destroy() + break_connections() + return ..() + +///Lose connections and reset the merged powernet so it makes 2 new seperated ones +/obj/machinery/power/deck_relay/proc/break_connections() + if(above) + var/turf/above_deck_relay = get_turf(above) + var/obj/structure/cable/above_cable = above_deck_relay.get_cable_node() + if(above_cable) + var/datum/powernet/above_powernet = new() + propagate_network(above_cable, above_powernet) + above.below = null + above = null + if(below) + var/turf/below_deck_relay = get_turf(below) + var/obj/structure/cable/below_cable = below_deck_relay.get_cable_node() + if(below_cable) + var/datum/powernet/below_powernet = new() + propagate_network(below_cable, below_powernet) + below.above = null + below = null + +///Allows you to scan the relay with a multitool to see stats/reconnect relays /obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I) - if(powernet && (powernet.avail > 0)) // is it powered? + if(!anchored) + to_chat(user, "You need to wrench this into place before getting a reading!") + return TRUE + if(broken_status == RELAY_ADD_CABLE || broken_status == RELAY_ADD_METAL) + to_chat(user, "The [src] isn't in proper shape to get a reading!") + return TRUE + if(powernet && (above || below))//we have a powernet and at least one connected relay to_chat(user, "Total power: [DisplayPower(powernet.avail)]\nLoad: [DisplayPower(powernet.load)]\nExcess power: [DisplayPower(surplus())]") - if(!powernet || below.powernet != powernet) - icon_state = "cablerelay-off" - to_chat(user, "Powernet connection lost. Attempting to re-establish. Ensure the relays below this one are connected too.") + if(!above && !below) + to_chat(user, "Cannot access valid powernet. Attempting to re-establish. Ensure any relays above and below are aligned properly and on cable nodes.") find_relays() addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering return TRUE @@ -53,6 +117,7 @@ if(below) below.merge(src) +///Merges the two powernets connected to the deck relays /obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) if(!DR) return @@ -69,6 +134,7 @@ if(!T || !istype(T)) return FALSE below = null //in case we're re-establishing + above = null var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(C && C.powernet) C.powernet.add_machine(src) //Nice we're in. diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 4552bdc9346..d9eb4ac9fb7 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -292,6 +292,7 @@ if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.siemens_coefficient == 0) + SEND_SIGNAL(M, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 05856c987fa..5900286f860 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -62,7 +62,7 @@ FG1.calc_power(INFINITY) //rip that 'containment' field M.adjustHealth(-M.obj_damage) else - ..() + return ..() /obj/machinery/field/containment/Crossed(atom/movable/AM) if(isliving(AM)) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index beba0992b4d..0951ce54d94 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -1,8 +1,3 @@ -//emitter construction defines -#define EMITTER_UNWRENCHED 0 -#define EMITTER_WRENCHED 1 -#define EMITTER_WELDED 2 - /obj/machinery/power/emitter name = "emitter" desc = "A heavy-duty industrial laser, often used in containment fields and power generation." @@ -23,11 +18,11 @@ var/active = FALSE var/powered = FALSE var/fire_delay = 100 - var/maximum_fire_delay = 100 - var/minimum_fire_delay = 20 + var/maximum_fire_delay = 100 //10 seconds + var/minimum_fire_delay = 20 // 2 seconds var/last_shot = 0 var/shot_number = 0 - var/state = EMITTER_UNWRENCHED + var/welded = FALSE ///if it's welded down to the ground or not. the emitter will not fire while unwelded. if set to true, the emitter will start anchored as well. var/locked = FALSE var/allow_switch_interact = TRUE @@ -45,8 +40,9 @@ var/last_projectile_params -/obj/machinery/power/emitter/anchored - anchored = TRUE +/obj/machinery/power/emitter/welded/Initialize() + welded = TRUE + return ..() /obj/machinery/power/emitter/ctf name = "Energy Cannon" @@ -55,14 +51,16 @@ idle_power_usage = FALSE locked = TRUE req_access_txt = "100" - state = EMITTER_WELDED + welded = TRUE use_power = FALSE /obj/machinery/power/emitter/Initialize() . = ..() RefreshParts() wires = new /datum/wires/emitter(src) - if(state == EMITTER_WELDED && anchored) + if(welded) + if(!anchored) + setAnchored(TRUE) connect_to_network() sparks = new @@ -73,6 +71,11 @@ . = ..() AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) +/obj/machinery/power/emitter/setAnchored(anchorvalue) + . = ..() + if(!anchored && welded) //make sure they're keep in sync in case it was forcibly unanchored by badmins or by a megafauna. + welded = FALSE + /obj/machinery/power/emitter/RefreshParts() var/max_firedelay = 120 var/firedelay = 120 @@ -91,8 +94,21 @@ /obj/machinery/power/emitter/examine(mob/user) . = ..() + if(welded) + . += "It's moored firmly to the floor. You can unsecure its moorings with a welder." + else if(anchored) + . += "It's currently anchored to the floor. You can secure its moorings with a welder, or remove it with a wrench." + else + . += "It's not anchored to the floor. You can secure it in place with a wrench." + if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Emitting one beam each [fire_delay*0.1] seconds.
    Power consumption at [active_power_usage]W.
    " + if(!active) + . += "Its status display is currently turned off." + else if(!powered) + . += "Its status display is glowing faintly." + else + . += "Its status display reads: Emitting one beam every [DisplayTimeText(fire_delay)]." + . += "Power consumption at [DisplayPower(active_power_usage)]." /obj/machinery/power/emitter/ComponentInitialize() . = ..() @@ -105,9 +121,7 @@ return TRUE /obj/machinery/power/emitter/should_have_node() - if(state == EMITTER_WELDED) - return TRUE - return FALSE + return welded /obj/machinery/power/emitter/Destroy() if(SSticker.IsRoundInProgress()) @@ -126,7 +140,7 @@ /obj/machinery/power/emitter/interact(mob/user) add_fingerprint(user) - if(state == EMITTER_WELDED) + if(welded) if(!powernet) to_chat(user, "\The [src] isn't connected to a wire!") return TRUE @@ -154,18 +168,17 @@ /obj/machinery/power/emitter/attack_animal(mob/living/simple_animal/M) if(ismegafauna(M) && anchored) - state = EMITTER_UNWRENCHED - anchored = FALSE + setAnchored(FALSE) M.visible_message("[M] rips [src] free from its moorings!") else - ..() - if(!anchored) + . = ..() + if(. && !anchored) step(src, get_dir(M, src)) /obj/machinery/power/emitter/process() if(machine_stat & (BROKEN)) return - if(state != EMITTER_WELDED || (!powernet && active_power_usage)) + if(!welded || (!powernet && active_power_usage)) active = FALSE update_icon() return @@ -197,7 +210,7 @@ /obj/machinery/power/emitter/proc/fire_beam_pulse() if(!check_delay()) return FALSE - if(state != EMITTER_WELDED) + if(!welded) return FALSE if(surplus() >= active_power_usage) add_load(active_power_usage) @@ -205,7 +218,7 @@ /obj/machinery/power/emitter/proc/fire_beam(mob/user) var/obj/projectile/P = new projectile_type(get_turf(src)) - playsound(get_turf(src), projectile_sound, 50, TRUE) + playsound(src, projectile_sound, 50, TRUE) if(prob(35)) sparks.start() P.firer = user ? user : src @@ -232,57 +245,50 @@ to_chat(user, "Turn \the [src] off first!") return FAILED_UNFASTEN - else if(state == EMITTER_WELDED) + else if(welded) if(!silent) to_chat(user, "[src] is welded to the floor!") return FAILED_UNFASTEN return ..() -/obj/machinery/power/emitter/default_unfasten_wrench(mob/user, obj/item/I, time = 20) - . = ..() - if(. == SUCCESSFUL_UNFASTEN) - if(anchored) - state = EMITTER_WRENCHED - else - state = EMITTER_UNWRENCHED - /obj/machinery/power/emitter/wrench_act(mob/living/user, obj/item/I) ..() default_unfasten_wrench(user, I) return TRUE /obj/machinery/power/emitter/welder_act(mob/living/user, obj/item/I) - . = ..() + ..() if(active) - to_chat(user, "Turn \the [src] off first!") + to_chat(user, "Turn [src] off first!") return TRUE - switch(state) - if(EMITTER_UNWRENCHED) - to_chat(user, "The [src.name] needs to be wrenched to the floor!") - if(EMITTER_WRENCHED) - if(!I.tool_start_check(user, amount=0)) - return TRUE - user.visible_message("[user.name] starts to weld the [name] to the floor.", \ - "You start to weld \the [src] to the floor...", \ - "You hear welding.") - if(I.use_tool(src, user, 20, volume=50) && state == EMITTER_WRENCHED) - state = EMITTER_WELDED - to_chat(user, "You weld \the [src] to the floor.") - connect_to_network() - update_cable_icons_on_turf(get_turf(src)) - if(EMITTER_WELDED) - if(!I.tool_start_check(user, amount=0)) - return TRUE - user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ - "You start to cut \the [src] free from the floor...", \ - "You hear welding.") - if(I.use_tool(src, user, 20, volume=50) && state == EMITTER_WELDED) - state = EMITTER_WRENCHED - to_chat(user, "You cut \the [src] free from the floor.") - disconnect_from_network() - update_cable_icons_on_turf(get_turf(src)) + if(welded) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user.name] starts to cut the [name] free from the floor.", \ + "You start to cut [src] free from the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && welded) + welded = FALSE + to_chat(user, "You cut [src] free from the floor.") + disconnect_from_network() + update_cable_icons_on_turf(get_turf(src)) + + else if(anchored) + if(!I.tool_start_check(user, amount=0)) + return TRUE + user.visible_message("[user.name] starts to weld the [name] to the floor.", \ + "You start to weld [src] to the floor...", \ + "You hear welding.") + if(I.use_tool(src, user, 20, volume=50) && anchored) + welded = TRUE + to_chat(user, "You weld [src] to the floor.") + connect_to_network() + update_cable_icons_on_turf(get_turf(src)) + + else + to_chat(user, "[src] needs to be wrenched to the floor!") return TRUE @@ -512,7 +518,3 @@ else if (E.charge < 10) playsound(src,'sound/machines/buzz-sigh.ogg', 50, TRUE) - -#undef EMITTER_UNWRENCHED -#undef EMITTER_WRENCHED -#undef EMITTER_WELDED diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 5b75c55f492..f0ef67dd92b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -213,6 +213,16 @@ anchored = FALSE var/tracker = 0 var/glass_type = null + var/random_offset = 6 //amount in pixels an unanchored assembly may be offset by + +/obj/item/solar_assembly/Initialize(mapload) + . = ..() + if(!anchored && !pixel_x && !pixel_y) + randomise_offset(random_offset) + +/obj/item/solar_assembly/proc/randomise_offset(amount) + pixel_x = rand(-amount,amount) + pixel_y = rand(-amount,amount) // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) @@ -234,9 +244,12 @@ if(anchored) user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") W.play_tool_sound(src, 75) + pixel_x = 0 + pixel_y = 0 else user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") W.play_tool_sound(src, 75) + randomise_offset(random_offset) return 1 if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass)) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 9e82f65c96d..989bdd03833 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -90,6 +90,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) critical_machine = TRUE + //If we ever start to care about all gasses, make this based on type and apply it as a for loop + var/list/gas_trans = list("PL" = PLASMA_TRANSMIT_MODIFIER, "O2" = OXYGEN_TRANSMIT_MODIFIER, "TRIT" = TRITIUM_TRANSMIT_MODIFIER, "PLX" = PLUOXIUM_TRANSMIT_MODIFIER, "BZ" = BZ_TRANSMIT_MODIFIER) var/gasefficency = 0.15 var/base_icon_state = "darkmatter" @@ -114,15 +116,15 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning var/power = 0 + var/gas_change_rate = 0.05 var/n2comp = 0 // raw composition of each gas in the chamber, ranges from 0 to 1 - var/plasmacomp = 0 var/o2comp = 0 var/co2comp = 0 - var/pluoxiumcomp = 0 + var/n2ocomp = 0 var/tritiumcomp = 0 var/bzcomp = 0 - var/n2ocomp = 0 + var/pluoxiumcomp = 0 var/pluoxiumbonus = 0 @@ -354,7 +356,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/datum/gas_mixture/env = T.return_air() var/datum/gas_mixture/removed - if(produces_gas) //Remove gas from surrounding area removed = env.remove(gasefficency * env.total_moles()) @@ -400,17 +401,18 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //This is more error prevention, according to all known laws of atmos, gas_mix.remove() should never make negative mol values. //But this is tg - //Lets get the proportions of the gasses in the mix + //Lets get the proportions of the gasses in the mix and then slowly move our comp to that value + //Can cause an overestimation of mol count, should stabalize things though. + //Prevents huge bursts of gas/heat when a large amount of something is introduced //They range between 0 and 1 - plasmacomp = max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0) - o2comp = max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0) - co2comp = max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0) - pluoxiumcomp = max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0) - tritiumcomp = max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0) - bzcomp = max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0) - - n2ocomp = max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0) - n2comp = max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0) + plasmacomp += CLAMP(max(removed.gases[/datum/gas/plasma][MOLES]/combined_gas, 0) - plasmacomp, -1, gas_change_rate) + o2comp += CLAMP(max(removed.gases[/datum/gas/oxygen][MOLES]/combined_gas, 0) - o2comp, -1, gas_change_rate) + co2comp += CLAMP(max(removed.gases[/datum/gas/carbon_dioxide][MOLES]/combined_gas, 0) - co2comp, -1, gas_change_rate) + pluoxiumcomp += CLAMP(max(removed.gases[/datum/gas/pluoxium][MOLES]/combined_gas, 0) - pluoxiumcomp, -1, gas_change_rate) + tritiumcomp += CLAMP(max(removed.gases[/datum/gas/tritium][MOLES]/combined_gas, 0) - tritiumcomp, -1, gas_change_rate) + bzcomp += CLAMP(max(removed.gases[/datum/gas/bz][MOLES]/combined_gas, 0) - bzcomp, -1, gas_change_rate) + n2ocomp += CLAMP(max(removed.gases[/datum/gas/nitrous_oxide][MOLES]/combined_gas, 0) - n2ocomp, -1, gas_change_rate) + n2comp += CLAMP(max(removed.gases[/datum/gas/nitrogen][MOLES]/combined_gas, 0) - n2comp, -1, gas_change_rate) //We're concerned about pluoxium being too easy to abuse at low percents, so we make sure there's a substantial amount. if(pluoxiumcomp >= 0.15) @@ -425,7 +427,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Value between 6 and 1 dynamic_heat_resistance = max((n2ocomp * N2O_HEAT_RESISTANCE) + ((pluoxiumcomp * PLUOXIUM_HEAT_RESISTANCE) * pluoxiumbonus), 1) //Value between 30 and -5, used to determine radiation output as it concerns things like collecters - power_transmission_bonus = (plasmacomp * PLASMA_TRANSMIT_MODIFIER) + (o2comp * OXYGEN_TRANSMIT_MODIFIER) + (bzcomp * BZ_TRANSMIT_MODIFIER) + (tritiumcomp * TRITIUM_TRANSMIT_MODIFIER) + ((pluoxiumcomp * PLUOXIUM_TRANSMIT_MODIFIER) * pluoxiumbonus) + power_transmission_bonus = (plasmacomp * gas_trans["PL"]) + (o2comp * gas_trans["O2"]) + (bzcomp * gas_trans["BZ"]) + (tritiumcomp * gas_trans["TRIT"]) + ((pluoxiumcomp * gas_trans["PLX"]) * pluoxiumbonus) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) @@ -724,6 +726,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) radiation_pulse(src, 150, 4) + else if(Adjacent(user)) //if the item is stuck to the person, kill the person too instead of eating just the item. + var/vis_msg = "[user] reaches out and touches [src] with [W], inducing a resonance... [W] starts to glow briefly before the light continues up to [user]'s body. [user.p_they(TRUE)] bursts into flames before flashing into dust!" + var/mob_msg = "You reach out and touch [src] with [W]. Everything starts burning and all you can hear is ringing. Your last thought is \"That was not a wise decision.\"" + dust_mob(user, vis_msg, mob_msg) + /obj/machinery/power/supermatter_crystal/wrench_act(mob/user, obj/item/tool) ..() if (moveable) diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index f8601015ec6..038da2b6030 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -136,7 +136,7 @@ /obj/item/ammo_casing/shotgun/dart/noreact/Initialize() . = ..() - ENABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags |= NO_REACT /obj/item/ammo_casing/shotgun/dart/bioterror desc = "A shotgun dart filled with deadly toxins." diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index 9440c435384..082c98dc062 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -65,3 +65,7 @@ /obj/item/ammo_casing/magic/wipe projectile_type = /obj/projectile/magic/wipe + +/obj/item/ammo_casing/magic/nothing + /obj/projectile/magic/nothing + harmful = FALSE diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 55d7a6fa4c3..def30a6fc06 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -213,12 +213,18 @@ to_chat(user, "You need at least ten lengths of cable if you want to make a sling!") /obj/item/gun/ballistic/shotgun/doublebarrel/improvised/update_icon_state() - item_state = "ishotgunsling" + . = ..() + if(slung) + item_state = "ishotgunsling" + if(sawn_off) + item_state = "ishotgun_sawn" /obj/item/gun/ballistic/shotgun/doublebarrel/improvised/update_overlays() . = ..() if(slung) . += "ishotgunsling" + if(sawn_off) + . += "ishotgun_sawn" /obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawoff(mob/user) . = ..() diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 67fa34b51c7..7b8e2c79dfb 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -1,6 +1,6 @@ /obj/item/gun/magic/wand name = "wand of nothing" - desc = "It's not just a stick, it's a MAGIC stick!" + desc = "It's not just a stick, it's a MAGIC stick! You shouldn't have this." ammo_type = /obj/item/ammo_casing/magic icon_state = "nothingwand" item_state = "wand" @@ -140,6 +140,7 @@ /obj/item/gun/magic/wand/polymorph/zap_self(mob/living/user) ..() //because the user mob ceases to exists by the time wabbajack fully resolves + wabbajack(user) charges-- @@ -226,3 +227,13 @@ ..() explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2) charges-- + +///////////////////////////////////// +//WAND OF NOTHING +///////////////////////////////////// + +/obj/item/gun/magic/wand/nothing + desc = "It's not just a stick, it's a MAGIC stick?" + ammo_type = /obj/item/ammo_casing/magic/nothing + + diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9fc2e2ee24b..3155af49079 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -253,7 +253,7 @@ /obj/projectile/proc/process_hit(turf/T, atom/target, qdel_self, hit_something = FALSE) //probably needs to be reworked entirely when pixel movement is done. if(QDELETED(src) || !T || !target) //We're done, nothing's left. - if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE))) + if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE))) qdel(src) return hit_something permutated |= target //Make sure we're never hitting it again. If we ever run into weirdness with piercing projectiles needing to hit something multiple times.. well.. that's a to-do. @@ -262,16 +262,16 @@ SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args) var/result = target.bullet_act(src, def_zone) if(result == BULLET_ACT_FORCE_PIERCE) - if(!CHECK_BITFIELD(movement_type, UNSTOPPABLE)) + if(!(movement_type & UNSTOPPABLE)) temporary_unstoppable_movement = TRUE - ENABLE_BITFIELD(movement_type, UNSTOPPABLE) + movement_type |= UNSTOPPABLE return process_hit(T, select_target(T), qdel_self, TRUE) //Hit whatever else we can since we're piercing through but we're still on the same tile. else if(result == BULLET_ACT_TURF) //We hit the turf but instead we're going to also hit something else on it. return process_hit(T, select_target(T), QDEL_SELF, TRUE) else //Whether it hit or blocked, we're done! qdel_self = QDEL_SELF hit_something = TRUE - if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE))) + if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !(movement_type & UNSTOPPABLE))) qdel(src) return hit_something @@ -547,7 +547,8 @@ else var/mob/living/L = target if(!direct_target) - if(!CHECK_BITFIELD(L.mobility_flags, MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE) || !(L.stat == CONSCIOUS)) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over. + var/checking = MOBILITY_USE | MOBILITY_STAND | MOBILITY_MOVE + if(!((L.mobility_flags & checking) == checking) || !(L.stat == CONSCIOUS)) //If they're able to 1. stand or 2. use items or 3. move, AND they are not softcrit, they are not stunned enough to dodge projectiles passing over. return FALSE return TRUE @@ -622,7 +623,7 @@ if(.) if(temporary_unstoppable_movement) temporary_unstoppable_movement = FALSE - DISABLE_BITFIELD(movement_type, UNSTOPPABLE) + movement_type &= ~(UNSTOPPABLE) if(fired && can_hit_target(original, permutated, TRUE)) Bump(original) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 21df04c15e6..bb367a92373 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -23,7 +23,7 @@ "You were protected against \the [src]!") ..(target, blocked) - DISABLE_BITFIELD(reagents.flags, NO_REACT) + reagents.flags &= ~(NO_REACT) reagents.handle_reactions() return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 1196acd7210..e277d68ba73 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -172,6 +172,9 @@ if(iscyborg(M)) var/mob/living/silicon/robot/Robot = M + // Disconnect AI's in shells + if(Robot.connected_ai) + Robot.connected_ai.disconnect_shell() if(Robot.mmi) qdel(Robot.mmi) Robot.notify_ai(NEW_BORG) @@ -703,3 +706,6 @@ armour_penetration = 100 temperature = -200 // Cools you down greatly per hit flag = "magic" + +/obj/projectile/magic/nothing + name = "bolt of nothing" diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index 54f3e50fe32..392c1eec3b7 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -17,7 +17,7 @@ /obj/projectile/curse_hand/Initialize(mapload) . = ..() - ENABLE_BITFIELD(movement_type, UNSTOPPABLE) + movement_type |= UNSTOPPABLE handedness = prob(50) icon_state = "cursehand[handedness]" @@ -31,7 +31,7 @@ /obj/projectile/curse_hand/prehit(atom/target) if(target == original) - DISABLE_BITFIELD(movement_type, UNSTOPPABLE) + movement_type &= ~(UNSTOPPABLE) else if(!isturf(target)) return FALSE return ..() @@ -40,7 +40,7 @@ if(arm) arm.End() arm = null - if(CHECK_BITFIELD(movement_type, UNSTOPPABLE)) + if((movement_type & UNSTOPPABLE)) playsound(src, 'sound/effects/curse3.ogg', 25, TRUE, -1) var/turf/T = get_step(src, dir) var/obj/effect/temp_visual/dir_setting/curse/hand/leftover = new(T, dir) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index b2f142a2071..d7b8f3958ec 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -41,6 +41,14 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/reagent_weight = 1 //affects how far it travels when sprayed var/metabolizing = FALSE var/harmful = FALSE //is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default. + //Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New() + var/datum/material/material + +/datum/reagent/New() + . = ..() + + if(material) + material = SSmaterials.GetMaterialRef(material) /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index d6d317e72a3..a26c3f71e79 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -346,7 +346,7 @@ //Has to be at less than TRESHOLD_UNHUSK burn damage and have 100 isntabitaluri before unhusking. Corpses dont metabolize. if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && Carbies.getFireLoss() < TRESHOLD_UNHUSK && Carbies.reagents.has_reagent(/datum/reagent/medicine/C2/instabitaluri, 100)) Carbies.cure_husk("burn") - Carbies.visible_message("You successfully replace most of the burnt off flesh of [Carbies].") + Carbies.visible_message("With most of the burnt off flesh replaced, [Carbies] looks a lot healthier.") ..() return TRUE diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index a9eb72a4557..9a90ced4d5f 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -321,12 +321,13 @@ color = "#DCDCDC" metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 + var/healing = 0.5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(-0.5*REM, 0) - M.adjustOxyLoss(-0.5*REM, 0) - M.adjustBruteLoss(-0.5*REM, 0) - M.adjustFireLoss(-0.5*REM, 0) + M.adjustToxLoss(-healing*REM, 0) + M.adjustOxyLoss(-healing*REM, 0) + M.adjustBruteLoss(-healing*REM, 0) + M.adjustFireLoss(-healing*REM, 0) ..() . = 1 @@ -338,6 +339,12 @@ ..() . = 1 +/datum/reagent/medicine/omnizine/protozine + name = "Protozine" + description = "A less environmentally friendly and somewhat weaker variant of omnizine." + color = "#d8c7b7" + healing = 0.2 + /datum/reagent/medicine/calomel name = "Calomel" description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." @@ -706,51 +713,62 @@ /datum/reagent/medicine/strange_reagent name = "Strange Reagent" - description = "A miracle drug capable of bringing the dead back to life. Only functions when applied by patch or spray, if the target has less than 100 brute and burn damage (independent of one another) and hasn't been husked. Causes slight damage to the living." + description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living." reagent_state = LIQUID color = "#A0E85E" - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 1.25 * REAGENTS_METABOLISM taste_description = "magnets" + harmful = TRUE /datum/reagent/medicine/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.stat == DEAD) - if(M.suiciding || M.hellbound) //they are never coming back - M.visible_message("[M]'s body does not react...") - return - if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100 || HAS_TRAIT(M, TRAIT_HUSK)) //body is too damaged to be revived - M.visible_message("[M]'s body convulses a bit, and then falls still once more.") - M.do_jitter_animation(10) - return - else - M.visible_message("[M]'s body starts convulsing!") - M.notify_ghost_cloning(source = M) - M.do_jitter_animation(10) - addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds - addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80) - sleep(100) //so the ghost has time to re-enter - - - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(!(C.dna && C.dna.species && (NOBLOOD in C.dna.species.species_traits))) - C.blood_volume = max(C.blood_volume, BLOOD_VOLUME_NORMAL) //so you don't instantly re-die from a lack of blood - for(var/organ in C.internal_organs) - var/obj/item/organ/O = organ - O.setOrganDamage(0) //so you don't near-instantly re-die because your heart has decayed to the point of complete failure - - M.adjustOxyLoss(-20, 0) - M.adjustToxLoss(-20, 0) - M.updatehealth() - if(M.revive(full_heal = FALSE, admin_revive = FALSE)) - M.emote("gasp") - log_combat(M, M, "revived", src) + if(M.stat != DEAD) + return ..() + if(M.suiciding || M.hellbound) //they are never coming back + M.visible_message("[M]'s body does not react...") + return + if(iscarbon(M) && method != INGEST) //simplemobs can still be splashed + return ..() + var/amount_to_revive = round((M.getBruteLoss()+M.getFireLoss())/20) + if(M.getBruteLoss()+M.getFireLoss() >= 200 || HAS_TRAIT(M, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive. + M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + M.do_jitter_animation(10) + return + M.visible_message("[M]'s body starts convulsing!") + M.notify_ghost_cloning("Your body is being revived with Strange Reagent!") + M.do_jitter_animation(10) + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 40) //jitter immediately, then again after 4 and 8 seconds + addtimer(CALLBACK(M, /mob/living/carbon.proc/do_jitter_animation, 10), 80) + addtimer(CALLBACK(src, .proc/do_strange_revive,M,reac_volume,amount_to_revive), 79) //timing is everything! ..() +/datum/reagent/medicine/strange_reagent/proc/do_strange_revive(mob/living/M,reac_volume,revive_requirement) //we store revive_requirement because if we calculate it now we might have changed our damage numbers. + var/excess_healing = 5*(reac_volume-revive_requirement) //excess reagent will heal blood and organs across the board + if(iscarbon(M) && excess_healing) + var/mob/living/carbon/C = M + if(!(C.dna?.species && (NOBLOOD in C.dna.species.species_traits))) + C.blood_volume += (excess_healing*2)//1 excess = 10 blood + + for(var/i in C.internal_organs) + var/obj/item/organ/O = i + if(O.organ_flags & ORGAN_SYNTHETIC) + continue + O.applyOrganDamage(excess_healing*-1)//1 excess = 5 organ damage healed + + M.adjustOxyLoss(-20, TRUE) + M.adjustToxLoss(-20, TRUE) //slime friendly + M.updatehealth() + M.grab_ghost() + if(M.revive(full_heal = FALSE, admin_revive = FALSE)) + M.emote("gasp") + log_combat(M, M, "revived", src) + + /datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(0.5*REM, 0) - M.adjustFireLoss(0.5*REM, 0) + var/damage_at_random = rand(0,250)/100 //0 to 2.5 + M.adjustBruteLoss(damage_at_random*REM, FALSE) + M.adjustFireLoss(damage_at_random*REM, FALSE) ..() - . = 1 + . = TRUE /datum/reagent/medicine/mannitol name = "Mannitol" @@ -1240,7 +1258,7 @@ /datum/reagent/medicine/rhigoxane name = "Rhigoxane" - description = "A second generation burn treatment agent exibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires." + description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires." reagent_state = LIQUID color = "#F7FFA5" overdose_threshold = 25 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c490c83e9da..7a0fa35cfae 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -252,6 +252,12 @@ qdel(R) T.Bless() +/datum/reagent/water/hollowwater + name = "Hollow Water" + description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." + color = "#88878777" + taste_description = "emptyiness" + /datum/reagent/hydrogen_peroxide name = "Hydrogen peroxide" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen and oxygen." //intended intended @@ -846,6 +852,7 @@ description = "Pure iron is a metal." reagent_state = SOLID taste_description = "iron" + material = /datum/material/iron color = "#606060" //pure iron? let's make it violet of course @@ -866,6 +873,7 @@ reagent_state = SOLID color = "#F7C430" // rgb: 247, 196, 48 taste_description = "expensive metal" + material = /datum/material/gold /datum/reagent/silver name = "Silver" @@ -873,6 +881,7 @@ reagent_state = SOLID color = "#D0D0D0" // rgb: 208, 208, 208 taste_description = "expensive yet reasonable metal" + material = /datum/material/silver /datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(M.has_bane(BANE_SILVER)) @@ -886,6 +895,7 @@ color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother? taste_description = "the inside of a reactor" var/irradiation_level = 1 + material = /datum/material/uranium /datum/reagent/uranium/on_mob_life(mob/living/carbon/M) M.apply_effect(irradiation_level/M.metabolism_efficiency,EFFECT_IRRADIATE,0) @@ -914,6 +924,7 @@ reagent_state = SOLID color = "#0000CC" taste_description = "fizzling blue" + material = /datum/material/bluespace /datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume) if(method == TOUCH || method == VAPOR) @@ -944,6 +955,7 @@ reagent_state = SOLID color = "#A8A8A8" // rgb: 168, 168, 168 taste_mult = 0 + material = /datum/material/glass /datum/reagent/fuel name = "Welding fuel" @@ -2021,6 +2033,67 @@ taste_description = "bananas" can_synth = TRUE +/datum/reagent/wittel + name = "Wittel" + description = "An extremely rare metallic-white substance only found on demon-class planets." + color = "#FFFFFF" // rgb: 255, 255, 255 + taste_mult = 0 // oderless and tasteless + +/datum/reagent/metalgen + name = "Metalgen" + data = list("material"=null) + description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches." + color = "#b000aa" + taste_mult = 0 // oderless and tasteless + var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + var/minumum_material_amount = 100 + +/datum/reagent/metalgen/reaction_obj(obj/O, volume) + metal_morph(O) + return + +/datum/reagent/metalgen/reaction_turf(turf/T, volume) + metal_morph(T) + return + +///turn an object into a special material +/datum/reagent/metalgen/proc/metal_morph(atom/A) + var/metal_ref = data["material"] + if(!metal_ref) + return + var/metal_amount = 0 + + for(var/B in A.custom_materials) //list with what they're made of + metal_amount += A.custom_materials[B] + + if(!metal_amount) + metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist + + var/list/metal_dat = list() + metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf + + A.material_flags = applied_material_flags + A.set_custom_materials(metal_dat) + +/datum/reagent/gravitum + name = "Gravitum" + description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even + color = "#050096" // rgb: 5, 0, 150 + taste_mult = 0 // oderless and tasteless + metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use + var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche + +/datum/reagent/gravitum/reaction_obj(obj/O, volume) + O.AddElement(/datum/element/forced_gravity, 0) + + addtimer(CALLBACK(O, .proc/_RemoveElement, list(/datum/element/forced_gravity, 0)), volume * time_multiplier) + +/datum/reagent/gravitum/on_mob_add(mob/living/L) + L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless + +/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) + L.RemoveElement(/datum/element/forced_gravity, 0) + /datum/reagent/cellulose name = "Cellulose Fibers" description = "A crystaline polydextrose polymer, plants swear by this stuff." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 318fa69807a..11a48cb7ee6 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -61,6 +61,7 @@ taste_mult = 1.5 color = "#8228A0" toxpwr = 3 + material = /datum/material/plasma /datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C) if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) @@ -903,3 +904,20 @@ to_chat(M, "[tox_message]") . = 1 ..() + +/datum/reagent/toxin/leadacetate + name = "Lead Acetate" + description = "Used hundreds of years ago as a sweetener, before it was realized that it's incredibly poisonous." + reagent_state = SOLID + color = "#2b2b2b" // rgb: 127, 132, 0 + toxpwr = 0.5 + taste_mult = 1.3 + taste_description = "sugary sweetness" + +/datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M) + M.adjustOrganLoss(ORGAN_SLOT_EARS,1) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN,1) + if(prob(1)) + to_chat(M, "Ah, what was that? You thought you heard something...") + M.confused += 5 + return ..() diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index 095ba220827..7c3c81eed71 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -131,6 +131,12 @@ results = list(/datum/reagent/medicine/strange_reagent = 3) required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) +/datum/chemical_reaction/strange_reagent/alt + name = "Strange Reagent" + id = /datum/reagent/medicine/strange_reagent + results = list(/datum/reagent/medicine/strange_reagent = 2) + required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) + /datum/chemical_reaction/mannitol name = "Mannitol" id = /datum/reagent/medicine/mannitol diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index c81e9213b37..63d0b216e0d 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -87,6 +87,18 @@ for(var/i = 1, i <= created_volume, i++) new /obj/item/soap/homemade(location) +/datum/chemical_reaction/omegasoapification + name = "Omega Soap" + id = "omegasoap" + required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) + required_temp = 999 + mob_react = FALSE + +/datum/chemical_reaction/omegasoapification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/soap/omega(location) + /datum/chemical_reaction/candlefication name = "Candlefication" id = "candlefication" @@ -708,6 +720,31 @@ var/location = get_turf(holder.my_atom) new /obj/item/slime_extract/grey(location) +/datum/chemical_reaction/metalgen + name = "metalgen" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mutagen = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint + name = "metalgen imprint" + id = /datum/reagent/metalgen + required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) + results = list(/datum/reagent/metalgen = 1) + +/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, created_volume) + var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) + for(var/datum/reagent/R in holder.reagent_list) + if(R.material && R.volume >= 40) + MM.data["material"] = R.material + holder.remove_reagent(R.type, 40) + +/datum/chemical_reaction/gravitum + name = "gravitum" + id = /datum/reagent/gravitum + required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10) + results = list(/datum/reagent/gravitum = 10) + /datum/chemical_reaction/cellulose_carbonization name = "Cellulose_Carbonization" id = /datum/reagent/carbon @@ -740,3 +777,9 @@ required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/water = 1) required_temp = 450 +/datum/chemical_reaction/holywater + name = "Holy Water" + id = /datum/reagent/water/holywater + results = list(/datum/reagent/water/holywater = 1) + required_reagents = list(/datum/reagent/water/hollowwater = 1) + required_catalysts = list(/datum/reagent/water/holywater = 1) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 7e9dbbd3cb5..896761e24ca 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -4,7 +4,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) volume = 50 - reagent_flags = OPENCONTAINER + reagent_flags = OPENCONTAINER | DUNKABLE spillable = TRUE resistance_flags = ACID_PROOF diff --git a/code/modules/research/bepis.dm b/code/modules/research/bepis.dm index 8bf906d3f79..dcf9be28e91 100644 --- a/code/modules/research/bepis.dm +++ b/code/modules/research/bepis.dm @@ -35,7 +35,9 @@ var/negative_cash_offset = 0 var/minor_rewards = list(/obj/item/stack/circuit_stack/full, //To add a new minor reward, add it here. /obj/item/airlock_painter/decal, - /obj/item/pen/survival) + /obj/item/pen/survival, + /obj/item/circuitboard/machine/sleeper/party, + /obj/item/toy/sprayoncan) var/static/list/item_list = list() /obj/machinery/rnd/bepis/attackby(obj/item/O, mob/user, params) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 4020c04e653..af645c30f54 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -49,11 +49,11 @@ other types of metals and chemistry for reagents). return ..() /datum/design/proc/InitializeMaterials() - var/list/temp_list = list() + var/list/temp_list = list() for(var/i in materials) //Go through all of our materials, get the subsystem instance, and then replace the list. var/amount = materials[i] if(!istext(i)) //Not a category, so get the ref the normal way - var/datum/material/M = getmaterialref(i) + var/datum/material/M = SSmaterials.GetMaterialRef(i) temp_list[M] = amount else temp_list[i] = amount diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index f8660c76c3d..91e3cf5ecb1 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -178,28 +178,12 @@ category = list ("Medical Machinery") departmental_flags = DEPARTMENTAL_FLAG_ALL -/datum/design/board/clonecontrol - name = "Computer Design (Cloning Machine Console)" - desc = "Allows for the construction of circuit boards used to build a new Cloning Machine console." - id = "clonecontrol" - build_path = /obj/item/circuitboard/computer/cloning - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - category = list("Medical Machinery") - -/datum/design/board/clonepod - name = "Machine Design (Clone Pod)" - desc = "Allows for the construction of circuit boards used to build a Cloning Pod." - id = "clonepod" - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - build_path = /obj/item/circuitboard/machine/clonepod - category = list("Medical Machinery") - -/datum/design/board/clonescanner - name = "Machine Design (Cloning Scanner)" +/datum/design/board/dnascanner + name = "Machine Design (DNA Scanner)" desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." - id = "clonescanner" + id = "dnascanner" departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - build_path = /obj/item/circuitboard/machine/clonescanner + build_path = /obj/item/circuitboard/machine/dnascanner category = list("Medical Machinery") /datum/design/board/biogenerator @@ -610,3 +594,11 @@ build_path = /obj/item/circuitboard/machine/medical_kiosk category = list ("Medical Machinery") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/board/medipen_refiller + name = "Machine Design (Medipen Refiller)" + desc = "The circuit board for a Medipen Refiller." + id = "medipen_refiller" + build_path = /obj/item/circuitboard/machine/medipen_refiller + category = list ("Medical Machinery") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index b0869a09160..92ecdbfa67b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -81,10 +81,10 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE -/datum/design/cloning_disk - name = "Cloning Data Disk" +/datum/design/dna_disk + name = "Genetic Data Disk" desc = "Produce additional disks for storing genetic data." - id = "cloning_disk" + id = "dna_disk" build_type = PROTOLATHE materials = list(/datum/material/iron = 300, /datum/material/glass = 100, /datum/material/silver = 50) build_path = /obj/item/disk/data diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 147a6911ca0..3d552d1ca82 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -1,552 +1,562 @@ - -///////////////////////////////////////// -/////////////////HUDs//////////////////// -///////////////////////////////////////// - -/datum/design/health_hud - name = "Health Scanner HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." - id = "health_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/health - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/health_hud_night - name = "Night Vision Health Scanner HUD" - desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." - id = "health_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350) - build_path = /obj/item/clothing/glasses/hud/health/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -/datum/design/security_hud - name = "Security HUD" - desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status." - id = "security_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/security - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/security_hud_night - name = "Night Vision Security HUD" - desc = "A heads-up display which provides id data and vision in complete darkness." - id = "security_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350) - build_path = /obj/item/clothing/glasses/hud/security/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/diagnostic_hud - name = "Diagnostic HUD" - desc = "A HUD used to analyze and determine faults within robotic machinery." - id = "diagnostic_hud" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/hud/diagnostic - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/diagnostic_hud_night - name = "Night Vision Diagnostic HUD" - desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." - id = "diagnostic_hud_night" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300) - build_path = /obj/item/clothing/glasses/hud/diagnostic/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -///////////////////////////////////////// -//////////////////Misc/////////////////// -///////////////////////////////////////// - -/datum/design/welding_goggles - name = "Welding Goggles" - desc = "Protects the eyes from bright flashes; approved by the mad scientist association." - id = "welding_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/welding - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/welding_mask - name = "Welding Gas Mask" - desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." - id = "weldingmask" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000) - build_path = /obj/item/clothing/mask/gas/welding - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/bright_helmet - name = "Workplace-Ready Firefighter Helmet" - desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." - id = "bright_helmet" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) - build_path = /obj/item/clothing/head/hardhat/red/upgraded - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO - -/datum/design/mauna_mug - name = "Mauna Mug" - desc = "This awesome mug will ensure your coffee never stays cold!" - id = "mauna_mug" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 1000, /datum/material/glass = 100) - build_path = /obj/item/reagent_containers/glass/maunamug - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL - -/datum/design/portaseeder - name = "Portable Seed Extractor" - desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." - id = "portaseeder" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 1000, /datum/material/glass = 400) - build_path = /obj/item/storage/bag/plants/portaseeder - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/air_horn - name = "Air Horn" - desc = "Damn son, where'd you find this?" - id = "air_horn" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000) - build_path = /obj/item/bikehorn/airhorn - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK! - -/datum/design/mesons - name = "Optical Meson Scanners" - desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." - id = "mesons" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/meson - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/engine_goggles - name = "Engineering Scanner Goggles" - desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." - id = "engine_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100) - build_path = /obj/item/clothing/glasses/meson/engine - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/tray_goggles - name = "Optical T-Ray Scanners" - desc = "Used by engineering staff to see underfloor objects such as cables and pipes." - id = "tray_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/meson/engine/tray - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/nvgmesons - name = "Night Vision Optical Meson Scanners" - desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." - id = "nvgmesons" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) - build_path = /obj/item/clothing/glasses/meson/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO - -/datum/design/night_vision_goggles - name = "Night Vision Goggles" - desc = "Goggles that let you see through darkness unhindered." - id = "night_visision_goggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) - build_path = /obj/item/clothing/glasses/night - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY - -/datum/design/magboots - name = "Magnetic Boots" - desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." - id = "magboots" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500) - build_path = /obj/item/clothing/shoes/magboots - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/forcefield_projector - name = "Forcefield Projector" - desc = "A device which can project temporary forcefields to seal off an area." - id = "forcefield_projector" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000) - build_path = /obj/item/forcefield_projector - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/sci_goggles - name = "Science Goggles" - desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine." - id = "scigoggles" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) - build_path = /obj/item/clothing/glasses/science - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/diskplantgene - name = "Plant Data Disk" - desc = "A disk for storing plant genetic data." - id = "diskplantgene" - build_type = PROTOLATHE - materials = list(/datum/material/iron=200, /datum/material/glass = 100) - build_path = /obj/item/disk/plantgene - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/roastingstick - name = "Advanced Roasting Stick" - desc = "A roasting stick for cooking sausages in exotic ovens." - id = "roastingstick" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) - build_path = /obj/item/melee/roastingstick - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/locator - name = "Bluespace Locator" - desc = "Used to track portable teleportation beacons and targets with embedded tracking implants." - id = "locator" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500) - build_path = /obj/item/locator - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/quantum_keycard - name = "Quantum Keycard" - desc = "Allows for the construction of a quantum keycard." - id = "quantum_keycard" - build_type = PROTOLATHE - materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000) - build_path = /obj/item/quantum_keycard - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/anomaly_neutralizer - name = "Anomaly Neutralizer" - desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine." - id = "anomaly_neutralizer" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000) - build_path = /obj/item/anomaly_neutralizer - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/donksoft_refill - name = "Donksoft Toy Vendor Refill" - desc = "A refill canister for Donksoft Toy Vendors." - id = "donksoft_refill" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000) - build_path = /obj/item/vending_refill/donksoft - category = list("Equipment") - -/datum/design/oxygen_tank - name = "Oxygen Tank" - desc = "An empty oxygen tank." - id = "oxygen_tank" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/tank/internals/oxygen/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/plasma_tank - name = "Plasma Tank" - desc = "An empty oxygen tank." - id = "plasma_tank" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/tank/internals/plasma/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE - -/datum/design/id - name = "Identification Card" - desc = "A card used to provide ID and determine access across the station." - id = "idcard" - build_type = PROTOLATHE - materials = list(/datum/material/iron=200, /datum/material/glass = 100) - build_path = /obj/item/card/id - category = list("Electronics") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/eng_gloves - name = "Tinkers Gloves" - desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." - id = "eng_gloves" - build_type = PROTOLATHE - materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) - build_path = /obj/item/clothing/gloves/color/latex/engineering - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/lavarods - name = "Lava-Resistant Metal Rods" - id = "lava_rods" - build_type = PROTOLATHE - materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) - build_path = /obj/item/stack/rods/lava - category = list("initial", "Stock Parts") - departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/plasticducky - name = "Rubber Ducky" - desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!" - id = "plasticducky" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 1000) - build_path = /obj/item/bikehorn/rubberducky/plasticducky - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ALL - -///////////////////////////////////////// -////////////Janitor Designs////////////// -///////////////////////////////////////// - -/datum/design/advmop - name = "Advanced Mop" - desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." - id = "advmop" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) - build_path = /obj/item/mop/advanced - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/blutrash - name = "Trashbag of Holding" - desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." - id = "blutrash" - build_type = PROTOLATHE - materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500) - build_path = /obj/item/storage/bag/trash/bluespace - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/buffer - name = "Floor Buffer Upgrade" - desc = "A floor buffer that can be attached to vehicular janicarts." - id = "buffer" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) - build_path = /obj/item/janiupgrade - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/spraybottle - name = "Spray Bottle" - desc = "A spray bottle, with an unscrewable top." - id = "spraybottle" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) - build_path = /obj/item/reagent_containers/spray - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/beartrap - name = "Bear Trap" - desc = "A trap used to catch space bears and other legged creatures." - id = "beartrap" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000) - build_path = /obj/item/restraints/legcuffs/beartrap - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -///////////////////////////////////////// -/////////////Holobarriers//////////////// -///////////////////////////////////////// - -/datum/design/holosign - name = "Holographic Sign Projector" - desc = "A holograpic projector used to project various warning signs." - id = "holosign" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) - build_path = /obj/item/holosign_creator - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - -/datum/design/holobarrier_jani - name = "Custodial Holobarrier Projector" - desc = "A holograpic projector used to project hard light wet floor barriers." - id = "holobarrier_jani" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/janibarrier - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SERVICE - - -/datum/design/holosignsec - name = "Security Holobarrier Projector" - desc = "A holographic projector that creates holographic security barriers." - id = "holosignsec" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/security - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/holosignengi - name = "Engineering Holobarrier Projector" - desc = "A holographic projector that creates holographic engineering barriers." - id = "holosignengi" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/engineering - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/holosignatmos - name = "ATMOS Holofan Projector" - desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions." - id = "holosignatmos" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) - build_path = /obj/item/holosign_creator/atmos - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/holobarrier_med - name = "PENLITE Holobarrier Projector" - desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases." - build_type = PROTOLATHE - build_path = /obj/item/holosign_creator/medical - materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease) - id = "holobarrier_med" - category = list("Medical Designs") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - -///////////////////////////////////////// -////////////////Armour/////////////////// -///////////////////////////////////////// - -/datum/design/reactive_armour - name = "Reactive Armour Shell" - desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." - id = "reactive_armour" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000) - build_path = /obj/item/reactive_armour_shell - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING - -/datum/design/knight_armour - name = "Knight Armour" - desc = "A royal knight's favorite garments. Can be trimmed by any friendly person." - id = "knight_armour" - build_type = AUTOLATHE - materials = list(MAT_CATEGORY_RIGID = 10000) - build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale - category = list("Imported") - -/datum/design/knight_helmet - name = "Knight Helmet" - desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket." - id = "knight_helmet" - build_type = AUTOLATHE - materials = list(MAT_CATEGORY_RIGID = 5000) - build_path = /obj/item/clothing/head/helmet/knight/greyscale - category = list("Imported") - - - -///////////////////////////////////////// -/////////////Security//////////////////// -///////////////////////////////////////// - -/datum/design/seclite - name = "Seclite" - desc = "A robust flashlight used by security." - id = "seclite" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 2500) - build_path = /obj/item/flashlight/seclite - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/detective_scanner - name = "Forensic Scanner" - desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." - id = "detective_scanner" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000) - build_path = /obj/item/detective_scanner - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/pepperspray - name = "Pepper Spray" - desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents." - id = "pepperspray" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000) - build_path = /obj/item/reagent_containers/spray/pepper/empty - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/bola_energy - name = "Energy Bola" - desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." - id = "bola_energy" - build_type = PROTOLATHE - materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500) - build_path = /obj/item/restraints/legcuffs/bola/energy - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/zipties - name = "Zipties" - desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." - id = "zipties" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 250) - build_path = /obj/item/restraints/handcuffs/cable/zipties - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/evidencebag - name = "Evidence Bag" - desc = "An empty evidence bag." - id = "evidencebag" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = 100) - build_path = /obj/item/evidencebag - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_SECURITY - -/datum/design/plumbing_rcd - name = "Plumbing Constructor" - id = "plumbing_rcd" - build_type = PROTOLATHE - materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000) - build_path = /obj/item/construction/plumbing - category = list("Equipment") - departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +///////////////////////////////////////// +/////////////////HUDs//////////////////// +///////////////////////////////////////// + +/datum/design/health_hud + name = "Health Scanner HUD" + desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." + id = "health_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/health + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/health_hud_night + name = "Night Vision Health Scanner HUD" + desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." + id = "health_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/silver = 350) + build_path = /obj/item/clothing/glasses/hud/health/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/security_hud + name = "Security HUD" + desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status." + id = "security_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/security + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/security_hud_night + name = "Night Vision Security HUD" + desc = "A heads-up display which provides id data and vision in complete darkness." + id = "security_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/gold = 350) + build_path = /obj/item/clothing/glasses/hud/security/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/diagnostic_hud + name = "Diagnostic HUD" + desc = "A HUD used to analyze and determine faults within robotic machinery." + id = "diagnostic_hud" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/hud/diagnostic + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/diagnostic_hud_night + name = "Night Vision Diagnostic HUD" + desc = "Upgraded version of the diagnostic HUD designed to function during a power failure." + id = "diagnostic_hud_night" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/uranium = 1000, /datum/material/plasma = 300) + build_path = /obj/item/clothing/glasses/hud/diagnostic/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +///////////////////////////////////////// +//////////////////Misc/////////////////// +///////////////////////////////////////// + +/datum/design/welding_goggles + name = "Welding Goggles" + desc = "Protects the eyes from bright flashes; approved by the mad scientist association." + id = "welding_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/welding + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/welding_mask + name = "Welding Gas Mask" + desc = "A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd." + id = "weldingmask" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 1000) + build_path = /obj/item/clothing/mask/gas/welding + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/bright_helmet + name = "Workplace-Ready Firefighter Helmet" + desc = "By applying state of the art lighting technology to a fire helmet with industry standard photo-chemical hardening methods, this hardhat will protect you from robust workplace hazards." + id = "bright_helmet" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 3000, /datum/material/silver = 500) + build_path = /obj/item/clothing/head/hardhat/red/upgraded + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_CARGO + +/datum/design/mauna_mug + name = "Mauna Mug" + desc = "This awesome mug will ensure your coffee never stays cold!" + id = "mauna_mug" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 100) + build_path = /obj/item/reagent_containers/glass/maunamug + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/rolling_table + name = "Rolly poly" + desc = "We duct-taped some wheels to the bottom of a table. It's goddamn science alright?" + id = "rolling_table" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000) + build_path = /obj/structure/table/rolling + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/portaseeder + name = "Portable Seed Extractor" + desc = "For the enterprising botanist on the go. Less efficient than the stationary model, it creates one seed per plant." + id = "portaseeder" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1000, /datum/material/glass = 400) + build_path = /obj/item/storage/bag/plants/portaseeder + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/air_horn + name = "Air Horn" + desc = "Damn son, where'd you find this?" + id = "air_horn" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4000, /datum/material/bananium = 1000) + build_path = /obj/item/bikehorn/airhorn + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL //HONK! + +/datum/design/mesons + name = "Optical Meson Scanners" + desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition." + id = "mesons" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/meson + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/engine_goggles + name = "Engineering Scanner Goggles" + desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes." + id = "engine_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/plasma = 100) + build_path = /obj/item/clothing/glasses/meson/engine + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/tray_goggles + name = "Optical T-Ray Scanners" + desc = "Used by engineering staff to see underfloor objects such as cables and pipes." + id = "tray_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/meson/engine/tray + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/nvgmesons + name = "Night Vision Optical Meson Scanners" + desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display." + id = "nvgmesons" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) + build_path = /obj/item/clothing/glasses/meson/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO + +/datum/design/night_vision_goggles + name = "Night Vision Goggles" + desc = "Goggles that let you see through darkness unhindered." + id = "night_visision_goggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 600, /datum/material/glass = 600, /datum/material/plasma = 350, /datum/material/uranium = 1000) + build_path = /obj/item/clothing/glasses/night + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SECURITY + +/datum/design/magboots + name = "Magnetic Boots" + desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle." + id = "magboots" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 4500, /datum/material/silver = 1500, /datum/material/gold = 2500) + build_path = /obj/item/clothing/shoes/magboots + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/forcefield_projector + name = "Forcefield Projector" + desc = "A device which can project temporary forcefields to seal off an area." + id = "forcefield_projector" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500, /datum/material/glass = 1000) + build_path = /obj/item/forcefield_projector + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/sci_goggles + name = "Science Goggles" + desc = "Goggles fitted with a portable analyzer capable of determining the research worth of an item or components of a machine." + id = "scigoggles" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/clothing/glasses/science + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/diskplantgene + name = "Plant Data Disk" + desc = "A disk for storing plant genetic data." + id = "diskplantgene" + build_type = PROTOLATHE + materials = list(/datum/material/iron=200, /datum/material/glass = 100) + build_path = /obj/item/disk/plantgene + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/roastingstick + name = "Advanced Roasting Stick" + desc = "A roasting stick for cooking sausages in exotic ovens." + id = "roastingstick" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/bluespace = 250) + build_path = /obj/item/melee/roastingstick + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/locator + name = "Bluespace Locator" + desc = "Used to track portable teleportation beacons and targets with embedded tracking implants." + id = "locator" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/glass = 500, /datum/material/silver = 500) + build_path = /obj/item/locator + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/quantum_keycard + name = "Quantum Keycard" + desc = "Allows for the construction of a quantum keycard." + id = "quantum_keycard" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 500, /datum/material/iron = 500, /datum/material/silver = 500, /datum/material/bluespace = 1000) + build_path = /obj/item/quantum_keycard + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/anomaly_neutralizer + name = "Anomaly Neutralizer" + desc = "An advanced tool capable of instantly neutralizing anomalies, designed to capture the fleeting aberrations created by the engine." + id = "anomaly_neutralizer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/gold = 2000, /datum/material/plasma = 5000, /datum/material/uranium = 2000) + build_path = /obj/item/anomaly_neutralizer + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/donksoft_refill + name = "Donksoft Toy Vendor Refill" + desc = "A refill canister for Donksoft Toy Vendors." + id = "donksoft_refill" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 25000, /datum/material/glass = 15000, /datum/material/plasma = 20000, /datum/material/gold = 10000, /datum/material/silver = 10000) + build_path = /obj/item/vending_refill/donksoft + category = list("Equipment") + +/datum/design/oxygen_tank + name = "Oxygen Tank" + desc = "An empty oxygen tank." + id = "oxygen_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/oxygen/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/plasma_tank + name = "Plasma Tank" + desc = "An empty oxygen tank." + id = "plasma_tank" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/tank/internals/plasma/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/id + name = "Identification Card" + desc = "A card used to provide ID and determine access across the station." + id = "idcard" + build_type = PROTOLATHE + materials = list(/datum/material/iron=200, /datum/material/glass = 100) + build_path = /obj/item/card/id + category = list("Electronics") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/eng_gloves + name = "Tinkers Gloves" + desc = "Overdesigned engineering gloves that have automated construction subroutines dialed in, allowing for faster construction while worn." + id = "eng_gloves" + build_type = PROTOLATHE + materials = list(/datum/material/iron=2000, /datum/material/silver=1500, /datum/material/gold = 1000) + build_path = /obj/item/clothing/gloves/color/latex/engineering + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/lavarods + name = "Lava-Resistant Metal Rods" + id = "lava_rods" + build_type = PROTOLATHE + materials = list(/datum/material/iron=1000, /datum/material/plasma=500, /datum/material/titanium=2000) + build_path = /obj/item/stack/rods/lava + category = list("initial", "Stock Parts") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/plasticducky + name = "Rubber Ducky" + desc = "The classic Nanotrasen design for competitively priced bath based duck toys. No need for fancy Waffle co. rubber, buy Plastic Ducks today!" + id = "plasticducky" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 1000) + build_path = /obj/item/bikehorn/rubberducky/plasticducky + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +///////////////////////////////////////// +////////////Janitor Designs////////////// +///////////////////////////////////////// + +/datum/design/advmop + name = "Advanced Mop" + desc = "An upgraded mop with a large internal capacity for holding water or other cleaning chemicals." + id = "advmop" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500, /datum/material/glass = 200) + build_path = /obj/item/mop/advanced + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/blutrash + name = "Trashbag of Holding" + desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage." + id = "blutrash" + build_type = PROTOLATHE + materials = list(/datum/material/gold = 1500, /datum/material/uranium = 250, /datum/material/plasma = 1500) + build_path = /obj/item/storage/bag/trash/bluespace + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/buffer + name = "Floor Buffer Upgrade" + desc = "A floor buffer that can be attached to vehicular janicarts." + id = "buffer" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) + build_path = /obj/item/janiupgrade + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/spraybottle + name = "Spray Bottle" + desc = "A spray bottle, with an unscrewable top." + id = "spraybottle" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 3000, /datum/material/glass = 200) + build_path = /obj/item/reagent_containers/spray + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/beartrap + name = "Bear Trap" + desc = "A trap used to catch space bears and other legged creatures." + id = "beartrap" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/titanium = 1000) + build_path = /obj/item/restraints/legcuffs/beartrap + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +///////////////////////////////////////// +/////////////Holobarriers//////////////// +///////////////////////////////////////// + +/datum/design/holosign + name = "Holographic Sign Projector" + desc = "A holograpic projector used to project various warning signs." + id = "holosign" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000) + build_path = /obj/item/holosign_creator + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/holobarrier_jani + name = "Custodial Holobarrier Projector" + desc = "A holograpic projector used to project hard light wet floor barriers." + id = "holobarrier_jani" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/janibarrier + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + + +/datum/design/holosignsec + name = "Security Holobarrier Projector" + desc = "A holographic projector that creates holographic security barriers." + id = "holosignsec" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/security + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/holosignengi + name = "Engineering Holobarrier Projector" + desc = "A holographic projector that creates holographic engineering barriers." + id = "holosignengi" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/engineering + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/holosignatmos + name = "ATMOS Holofan Projector" + desc = "A holographic projector that creates holographic barriers that prevent changes in atmospheric conditions." + id = "holosignatmos" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000) + build_path = /obj/item/holosign_creator/atmos + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/holobarrier_med + name = "PENLITE Holobarrier Projector" + desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases." + build_type = PROTOLATHE + build_path = /obj/item/holosign_creator/medical + materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 100) //a hint of silver since it can troll 2 antags (bad viros and sentient disease) + id = "holobarrier_med" + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +///////////////////////////////////////// +////////////////Armour/////////////////// +///////////////////////////////////////// + +/datum/design/reactive_armour + name = "Reactive Armour Shell" + desc = "An experimental suit of armour capable of utilizing an implanted anomaly core to protect the user." + id = "reactive_armour" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 10000, /datum/material/diamond = 5000, /datum/material/uranium = 8000, /datum/material/silver = 4500, /datum/material/gold = 5000) + build_path = /obj/item/reactive_armour_shell + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/knight_armour + name = "Knight Armour" + desc = "A royal knight's favorite garments. Can be trimmed by any friendly person." + id = "knight_armour" + build_type = AUTOLATHE + materials = list(MAT_CATEGORY_RIGID = 10000) + build_path = /obj/item/clothing/suit/armor/riot/knight/greyscale + category = list("Imported") + +/datum/design/knight_helmet + name = "Knight Helmet" + desc = "A royal knight's favorite hat. If you hold it upside down it's actually a bucket." + id = "knight_helmet" + build_type = AUTOLATHE + materials = list(MAT_CATEGORY_RIGID = 5000) + build_path = /obj/item/clothing/head/helmet/knight/greyscale + category = list("Imported") + + + +///////////////////////////////////////// +/////////////Security//////////////////// +///////////////////////////////////////// + +/datum/design/seclite + name = "Seclite" + desc = "A robust flashlight used by security." + id = "seclite" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 2500) + build_path = /obj/item/flashlight/seclite + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/detective_scanner + name = "Forensic Scanner" + desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." + id = "detective_scanner" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000) + build_path = /obj/item/detective_scanner + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/pepperspray + name = "Pepper Spray" + desc = "Manufactured by UhangInc, used to blind and down an opponent quickly. Printed pepper sprays do not contain reagents." + id = "pepperspray" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000) + build_path = /obj/item/reagent_containers/spray/pepper/empty + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/bola_energy + name = "Energy Bola" + desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests." + id = "bola_energy" + build_type = PROTOLATHE + materials = list(/datum/material/silver = 500, /datum/material/plasma = 500, /datum/material/titanium = 500) + build_path = /obj/item/restraints/legcuffs/bola/energy + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/zipties + name = "Zipties" + desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." + id = "zipties" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 250) + build_path = /obj/item/restraints/handcuffs/cable/zipties + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/evidencebag + name = "Evidence Bag" + desc = "An empty evidence bag." + id = "evidencebag" + build_type = PROTOLATHE + materials = list(/datum/material/plastic = 100) + build_path = /obj/item/evidencebag + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/plumbing_rcd + name = "Plumbing Constructor" + id = "plumbing_rcd" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 75000, /datum/material/glass = 37500, /datum/material/plastic = 1000) + build_path = /obj/item/construction/plumbing + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL diff --git a/code/modules/research/nanites/nanite_cloud_controller.dm b/code/modules/research/nanites/nanite_cloud_controller.dm index 1a11e1ecdfa..208f562c12a 100644 --- a/code/modules/research/nanites/nanite_cloud_controller.dm +++ b/code/modules/research/nanites/nanite_cloud_controller.dm @@ -48,7 +48,7 @@ return var/datum/nanite_cloud_backup/backup = new(src) - var/datum/component/nanites/cloud_copy = new(backup) + var/datum/component/nanites/cloud_copy = backup.AddComponent(/datum/component/nanites) backup.cloud_id = cloud_id backup.nanites = cloud_copy investigate_log("[key_name(user)] created a new nanite cloud backup with id #[cloud_id]", INVESTIGATE_NANITES) @@ -213,7 +213,7 @@ var/datum/component/nanites/nanites = backup.nanites var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = rule_template.make_rule(P) - + investigate_log("[key_name(usr)] added rule [rule.display()] to program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE if("remove_rule") @@ -224,7 +224,7 @@ var/datum/nanite_program/P = nanites.programs[text2num(params["program_id"])] var/datum/nanite_rule/rule = P.rules[text2num(params["rule_id"])] rule.remove() - + investigate_log("[key_name(usr)] removed rule [rule.display()] from program [P.name] in cloud #[current_view]", INVESTIGATE_NANITES) . = TRUE diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 4f5f80a4cfd..50ff6f4a846 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -170,14 +170,17 @@ if(timer_shutdown_next && world.time > timer_shutdown_next) deactivate() timer_shutdown_next = 0 + return if(timer_trigger && world.time > timer_trigger_next) trigger() timer_trigger_next = world.time + timer_trigger + return if(timer_trigger_delay_next && world.time > timer_trigger_delay_next) trigger(delayed = TRUE) timer_trigger_delay_next = 0 + return if(check_conditions() && consume_nanites(use_rate)) if(!passive_enabled) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 844d9809a9c..b9e9e558813 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -223,20 +223,9 @@ if(!iscarbon(host_mob)) //nonstandard biology return FALSE var/mob/living/carbon/C = host_mob - if(C.suiciding || C.hellbound || HAS_TRAIT(C, TRAIT_HUSK)) //can't revive - return FALSE - if((world.time - C.timeofdeath) > 1800) //too late - return FALSE - if((C.getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (C.getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE) || !C.can_be_revived()) //too damaged - return FALSE - if(!C.getorgan(/obj/item/organ/heart)) //what are we even shocking - return FALSE - var/obj/item/organ/brain/BR = C.getorgan(/obj/item/organ/brain) - if(QDELETED(BR) || BR.brain_death || (BR.organ_flags & ORGAN_FAILING) || BR.suicided) - return FALSE if(C.get_ghost()) return FALSE - return TRUE + return C.can_defib() /datum/nanite_program/defib/proc/zap() var/mob/living/carbon/C = host_mob diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 3f3980bda22..2259f92280f 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -65,7 +65,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox") + design_ids = list("chem_heater", "chem_master", "chem_dispenser", "pandemic", "defibrillator", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "medigel","genescanner", "med_spray_bottle", "chem_pack", "blood_pack", "medical_kiosk", "crewpinpointerprox", "medipen_refiller") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -467,12 +467,12 @@ export_price = 5000 ////////////////////////Medical//////////////////////// -/datum/techweb_node/cloning - id = "cloning" +/datum/techweb_node/genetics + id = "genetics" display_name = "Genetic Engineering" - description = "We have the technology to make him." + description = "We have the technology to change him." prereq_ids = list("biotech") - design_ids = list("clonecontrol", "clonepod", "clonescanner", "scan_console", "cloning_disk") + design_ids = list("dnascanner", "scan_console", "dna_disk") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1020,7 +1020,7 @@ prereq_ids = list("biotech","engineering") boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) + /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/melee/baton/abductor, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) export_price = 20000 hidden = TRUE @@ -1037,7 +1037,7 @@ design_ids = list("alien_scalpel", "alien_hemostat", "alien_retractor", "alien_saw", "alien_drill", "alien_cautery") boost_item_paths = list(/obj/item/gun/energy/alien, /obj/item/scalpel/alien, /obj/item/hemostat/alien, /obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/cautery/alien, /obj/item/surgicaldrill/alien, /obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) + /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/melee/baton/abductor, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 20000 hidden = TRUE @@ -1049,7 +1049,7 @@ prereq_ids = list("alientech", "adv_engi") design_ids = list("alien_wrench", "alien_wirecutters", "alien_screwdriver", "alien_crowbar", "alien_welder", "alien_multitool") boost_item_paths = list(/obj/item/screwdriver/abductor, /obj/item/wrench/abductor, /obj/item/crowbar/abductor, /obj/item/multitool/abductor, - /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/abductor/baton, /obj/item/abductor, + /obj/item/weldingtool/abductor, /obj/item/wirecutters/abductor, /obj/item/circuitboard/machine/abductor, /obj/item/melee/baton/abductor, /obj/item/abductor, /obj/item/gun/energy/shrink_ray) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 20000 @@ -1087,6 +1087,17 @@ hidden = TRUE experimental = TRUE +/datum/techweb_node/rolling_table + id = "rolling_table" + display_name = "Advanced Wheel Applications" + description = "Adding wheels to things can lead to extremely beneficial outcomes." + prereq_ids = list("base") + design_ids = list("rolling_table") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + export_price = 2500 + hidden = TRUE + experimental = TRUE + /datum/techweb_node/Mauna_Mug id = "mauna_mug" display_name = "Mauna Mug" diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm index 1fb17ea4d1f..3e15a818674 100644 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ b/code/modules/research/xenobiology/crossbreeding/_potions.dm @@ -118,6 +118,9 @@ Slimecrossing Potions if(!istype(C)) to_chat(user, "The potion can only be used on clothing!") return + if(istype(C, /obj/item/clothing/suit/space)) + to_chat(user, "The [C] is already pressure-resistant!") + return ..() if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) to_chat(user, "The [C] is already pressure-resistant!") return ..() diff --git a/code/modules/ruins/spaceruin_code/cloning_lab.dm b/code/modules/ruins/spaceruin_code/cloning_lab.dm deleted file mode 100644 index 338f62ee779..00000000000 --- a/code/modules/ruins/spaceruin_code/cloning_lab.dm +++ /dev/null @@ -1,35 +0,0 @@ -/obj/item/paper/fluff/ruins/exp_cloning/manual - name = "paper - 'H-11 Cloning Apparatus Manual" - info = {"

    Getting Started

    - Congratulations, you are testing the H-11 experimental cloning device!
    - Using the H-11 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the clone option to initiate cloning!
    - That's all there is to it!
    - Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
    -

    The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times are roughly 90 seconds. - The cloning pod may be unlocked early after initial maturation is complete.


    - Please note that resulting clones will have a DEVELOPMENTAL DEFECT as a result of genetic drift. We hope to reduce this through further testing.
    - Clones may also experience memory loss and radical changes in personality as a result of the cloning process.

    -
    - This technology produced under license from Thinktronic Systems, LTD."} - -/obj/item/paper/fluff/ruins/exp_cloning/log - name = "experiment log" - info = {"

    Day 1

    - We are very excited to be part of the first crew of the SC Irmanda!
    - This ship is made to test an innovative FTL technology. I had some concerns at first, \ - but the engineers assure me that it is safe and there is absolutely no risk of the external wings breaking off from the acceleration.
    - We've been tasked with testing the latest model of the Thinktronic Cloning Pod. We'll stay in dock for a week before launching, but we're going to get started right away. \ - If the engine is as fast as they say, we might not have the time to run all the routine tests on the cloned subject!
    -
    -

    Day 2

    - We cloned an unknown corpse that was given to us by the medical crew. The genetic replication is good enough to let the subject survive outside of the pod, \ - but the cellular damage remains a concern for his long-term survival. For safety we will be keeping him in quarantine.
    - We left him some books, but clearly we were too optimistic about his mental faculties. His brain seems to suffer from the same cloning decay that was caused by \ - the previous models. We will run further tests to see if there are improvements.
    -

    Day 4

    - It seems we'll be launching even sooner than expected! Apparently the press is starting to lose interest, so we have to cut short the pre-flight checks \ - and give them something to talk about. Hopefully this will end up with increased funding...
    - The crew has all been invited to the main hall, where we have seats for the initial FTL acceleration. Unfortunately the clone cannot leave the quarantine room \ - without risking infection, so we will strap him into the bed and hope for the best. We can grow another clone if anything goes wrong, anyway. -
    - Professor Galen Linkovich"} diff --git a/code/modules/ruins/spaceruin_code/hellfactory.dm b/code/modules/ruins/spaceruin_code/hellfactory.dm new file mode 100644 index 00000000000..6f992fbff52 --- /dev/null +++ b/code/modules/ruins/spaceruin_code/hellfactory.dm @@ -0,0 +1,32 @@ +/obj/machinery/door/keycard/office + name = "management airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory1" + +/obj/item/keycard/office + name = "management keycard" + desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'." + color = "#f05812" + puzzle_id = "factory1" + +/obj/machinery/door/keycard/stockroom + name = "stockroom airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory2" + +/obj/item/keycard/stockroom + name = "stockroom keycard" + desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'." + color = "#1272f0" + puzzle_id = "factory2" + +/obj/machinery/door/keycard/entry + name = "secure airlock" + desc = "The boss man gets the best stuff. Always and forever." + puzzle_id = "factory3" + +/obj/item/keycard/entry + name = "secure keycard" + desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'." + color = "#12f049" + puzzle_id = "factory3" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index b5076ec071b..09373fa177d 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -121,7 +121,7 @@ if(SSshuttle.emergency.mode == SHUTTLE_STRANDED) authorized.Cut() - DISABLE_BITFIELD(obj_flags, EMAGGED) + obj_flags &= ~(EMAGGED) if(ENGINES_STARTED || (!IS_DOCKED)) return . @@ -140,7 +140,7 @@ if(!IS_DOCKED) return - if(CHECK_BITFIELD(obj_flags, EMAGGED) || ENGINES_STARTED) //SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LAUNCH IN 10 SECONDS + if((obj_flags & EMAGGED) || ENGINES_STARTED) //SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LA-SYSTEM ERROR: THE SHUTTLE WILL LAUNCH IN 10 SECONDS to_chat(user, "The shuttle is already about to launch!") return @@ -148,7 +148,7 @@ message_admins("[ADMIN_LOOKUPFLW(user)] has emagged the emergency shuttle [time] seconds before launch.") log_shuttle("[key_name(user)] has emagged the emergency shuttle in [COORD(src)] [time] seconds before launch.") - ENABLE_BITFIELD(obj_flags, EMAGGED) + obj_flags |= EMAGGED SSshuttle.emergency.movement_force = list("KNOCKDOWN" = 60, "THROW" = 20)//YOUR PUNY SEATBELTS can SAVE YOU NOW, MORTAL var/datum/species/S = new for(var/i in 1 to 10) @@ -458,11 +458,11 @@ /obj/machinery/computer/shuttle/pod/ComponentInitialize() . = ..() AddElement(/datum/element/update_icon_blocker) - + /obj/machinery/computer/shuttle/pod/emag_act(mob/user) if(obj_flags & EMAGGED) return - ENABLE_BITFIELD(obj_flags, EMAGGED) + obj_flags |= EMAGGED to_chat(user, "You fry the pod's alert level checking system.") /obj/machinery/computer/shuttle/pod/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e9bdf785464..e532631a3af 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -704,7 +704,7 @@ if(timeleft > 1 HOURS) return "--:--" else if(timeleft > 0) - return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, " ")]" + return "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" else return "00:00" diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index cace4bed55a..2819b9812f8 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -11,7 +11,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/machinery/teleport/station, /obj/machinery/teleport/hub, /obj/machinery/quantumpad, - /obj/machinery/clonepod, /obj/effect/mob_spawn, /obj/effect/hierophant, /obj/structure/receiving_pad, diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 6f2513c9050..0cb92807c2b 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -33,7 +33,8 @@ . = ..() if(!proximity) return - user.say(catchphrase, forced = "spell") + if(catchphrase) + user.say(catchphrase, forced = "spell") playsound(get_turf(user), on_use_sound,50,TRUE) charges-- if(charges <= 0) diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index 5e383947513..7fc73125cca 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/book/granter/spell/barnyard, /obj/item/book/granter/spell/charge, /obj/item/book/granter/spell/summonitem, - /obj/item/gun/magic/wand, + /obj/item/gun/magic/wand/nothing, /obj/item/gun/magic/wand/death, /obj/item/gun/magic/wand/resurrection, /obj/item/gun/magic/wand/polymorph, diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm index 64739fa1339..244ec6ef630 100644 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ b/code/modules/surgery/advanced/bioware/ligament_hook.dm @@ -16,7 +16,7 @@ name = "reshape ligaments" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start reshaping [target]'s ligaments into a hook-like shape.", diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm index ad483bd2be7..624306009b9 100644 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm @@ -16,7 +16,7 @@ name = "reinforce ligaments" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start reinforcing [target]'s ligaments.", diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm index 0ecec896b02..63f624d81f5 100644 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ b/code/modules/surgery/advanced/bioware/muscled_veins.dm @@ -15,7 +15,7 @@ name = "shape vein muscles" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start wrapping muscles around [target]'s circulatory system.", diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm index aec78edb080..a624422af0c 100644 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ b/code/modules/surgery/advanced/bioware/nerve_grounding.dm @@ -15,7 +15,7 @@ name = "ground nerves" accept_hand = TRUE time = 155 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start rerouting [target]'s nerves.", diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm index 38be1a35174..f50d45dab67 100644 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ b/code/modules/surgery/advanced/bioware/nerve_splicing.dm @@ -15,7 +15,7 @@ name = "splice nerves" accept_hand = TRUE time = 155 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start splicing together [target]'s nerves.", diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm index dd89dfa7a04..cf3fe0633a8 100644 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ b/code/modules/surgery/advanced/bioware/vein_threading.dm @@ -15,7 +15,7 @@ name = "thread veins" accept_hand = TRUE time = 125 - experience_given = 5 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You start weaving [target]'s circulatory system.", diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm index 37c4cc0acdb..ab2df4a5559 100644 --- a/code/modules/surgery/advanced/brainwashing.dm +++ b/code/modules/surgery/advanced/brainwashing.dm @@ -29,6 +29,7 @@ name = "brainwash" implements = list(TOOL_HEMOSTAT = 85, TOOL_WIRECUTTER = 50, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15) time = 200 + experience_given = MEDICAL_SKILL_ADVANCED var/objective /datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -39,7 +40,7 @@ "[user] begins to fix [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(!target.mind) to_chat(user, "[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...") return FALSE @@ -53,7 +54,7 @@ brainwash(target, objective) message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.") log_game("[key_name(user)] surgically brainwashed [key_name(target)] with the objective '[objective]'.") - return TRUE + return ..() /datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorganslot(ORGAN_SLOT_BRAIN)) diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm index 4ec56e046fa..fd02138a0cc 100644 --- a/code/modules/surgery/advanced/lobotomy.dm +++ b/code/modules/surgery/advanced/lobotomy.dm @@ -26,6 +26,7 @@ implements = list(TOOL_SCALPEL = 85, /obj/item/melee/transforming/energy/sword = 55, /obj/item/kitchen/knife = 35, /obj/item/shard = 25, /obj/item = 20) time = 100 + experience_given = MEDICAL_SKILL_ADVANCED //lose XP if you end up giving them bad traumas /datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) @@ -37,7 +38,7 @@ "[user] begins to perform a lobotomy on [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in lobotomizing [target].", "[user] successfully lobotomizes [target]!", "[user] completes the surgery on [target]'s brain.") @@ -47,11 +48,14 @@ switch(rand(1,4))//Now let's see what hopefully-not-important part of the brain we cut off if(1) target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) + experience_given = MEDICAL_SKILL_ADVANCED*0.9 if(2) target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) + experience_given = MEDICAL_SKILL_ADVANCED*0.8 if(3) target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - return TRUE + experience_given = MEDICAL_SKILL_ADVANCED*0.5 + return ..() /datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm index 495fe43d5bd..41f63b1a5f3 100644 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ b/code/modules/surgery/advanced/necrotic_revival.dm @@ -22,17 +22,18 @@ time = 50 chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone) require_all_chems = FALSE + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to grow a romerol tumor on [target]'s brain...", "[user] begins to tinker with [target]'s brain...", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in growing a romerol tumor on [target]'s brain.", "[user] successfully grows a romerol tumor on [target]'s brain!", "[user] completes the surgery on [target]'s brain.") if(!target.getorganslot(ORGAN_SLOT_ZOMBIE)) var/obj/item/organ/zombie_infection/ZI = new() ZI.Insert(target) - return TRUE + return ..() diff --git a/code/modules/surgery/advanced/pacification.dm b/code/modules/surgery/advanced/pacification.dm index bb41b7176ea..ccbb6325183 100644 --- a/code/modules/surgery/advanced/pacification.dm +++ b/code/modules/surgery/advanced/pacification.dm @@ -22,18 +22,19 @@ name = "rewire brain" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) time = 40 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/pacify/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to pacify [target]...", "[user] begins to fix [target]'s brain.", "[user] begins to perform surgery on [target]'s brain.") -/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +/datum/surgery_step/pacify/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) display_results(user, target, "You succeed in neurologically pacifying [target].", "[user] successfully fixes [target]'s brain!", "[user] completes the surgery on [target]'s brain.") target.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_LOBOTOMY) - return TRUE + return ..() /datum/surgery_step/pacify/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You screw up, rewiring [target]'s brain the wrong way around...", diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 3a1a8efcff4..815eaa93816 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -30,6 +30,7 @@ implements = list(/obj/item/twohanded/shockpaddles = 100, /obj/item/melee/baton = 75, /obj/item/gun/energy = 60) repeatable = TRUE time = 120 + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm index cf0b1cc3d7e..006ebc947ce 100644 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ b/code/modules/surgery/advanced/viral_bonding.dm @@ -23,6 +23,7 @@ implements = list(TOOL_CAUTERY = 100, TOOL_WELDER = 50, /obj/item = 30) // 30% success with any hot item. time = 100 chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde) + experience_given = MEDICAL_SKILL_ADVANCED /datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool) if(implement_type == TOOL_WELDER || implement_type == /obj/item) diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 27d3e622a3a..4d9827a52b5 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -11,7 +11,7 @@ name = "sever limb" implements = list(/obj/item/shears = 300, TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) time = 64 - experience_given = 5 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to sever [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 69dd5c4cced..53c1c926060 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -68,7 +68,7 @@ . += "The brain has been removed from [src]." else if(brain.suicided || brainmob?.suiciding) . += "There's a miserable expression on [real_name]'s face; they must have really hated life. There's no hope of recovery." - else if(brain.brain_death || brainmob?.health <= HEALTH_THRESHOLD_DEAD) + else if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) . += "It's leaking some kind of... clear fluid? The brain inside must be in pretty bad shape." else if(brainmob) if(brainmob.get_ghost(FALSE, TRUE)) diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm index 998aaadc173..be09daf8ed0 100644 --- a/code/modules/surgery/brain_surgery.dm +++ b/code/modules/surgery/brain_surgery.dm @@ -15,7 +15,8 @@ /datum/surgery_step/fix_brain name = "fix brain" implements = list(TOOL_HEMOSTAT = 85, TOOL_SCREWDRIVER = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 - time = 120 //long and complicated + repeatable = TRUE + time = 100 //long and complicated experience_given = 0 // per_trauma /datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) @@ -33,11 +34,13 @@ display_results(user, target, "You succeed in fixing [target]'s brain.", "[user] successfully fixes [target]'s brain!", "[user] completes the surgery on [target]'s brain.") - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) + if(target.mind?.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 60) //we set damage in this case in order to clear the "failing" flag + target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 50) //we set damage in this case in order to clear the "failing" flag var/cured_num = target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) - experience_given = 2*cured_num + experience_given = (MEDICAL_SKILL_EASY*2*cured_num) + if(target.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) + to_chat(user, "[target]'s brain looks like it could be fixed further.") return ..() /datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 5fb613e16e5..ebe735278ee 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -50,7 +50,7 @@ name = "graft coronary bypass" implements = list(TOOL_HEMOSTAT = 90, TOOL_WIRECUTTER = 35, /obj/item/stack/packageWrap = 15, /obj/item/stack/cable_coil = 5) time = 90 - experience_given = 20 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to graft a bypass onto [target]'s heart...", diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 26d6f76ae84..478877ed357 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -7,6 +7,7 @@ name = "insert pill" implements = list(/obj/item/reagent_containers/pill = 100) time = 16 + experience_given = (MEDICAL_SKILL_MEDIUM*0.4) //quick to do /datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to wedge [tool] in [target]'s [parse_zone(target_zone)]...", diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index f697d48fa83..491dfde8cf2 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -87,7 +87,7 @@ target.apply_damage(80, BRUTE, L) ADD_TRAIT(target, TRAIT_DISSECTED, "[surgery.name]") repeatable = FALSE - experience_given = 1+(points_earned/(BASE_HUMAN_REWARD/10))//if BHR = 500, 10 XP on base surgery + experience_given = max(points_earned/(BASE_HUMAN_REWARD/MEDICAL_SKILL_MEDIUM),1) return ..() /datum/surgery_step/dissection/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index d50840291c2..40e9ceee34e 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -10,7 +10,7 @@ name = "fix eyes" implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 45, /obj/item/pen = 25) time = 64 - experience_given = 5 + experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.6) //repeatable and can be done at any damage /datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm index 6e8e3e18015..e6f58159f5f 100644 --- a/code/modules/surgery/healing.dm +++ b/code/modules/surgery/healing.dm @@ -1,4 +1,4 @@ -#define PER_ITERATION_XP_CAP 3 //TW XP gain scales with repeated iterations. +#define PER_ITERATION_XP_CAP MEDICAL_SKILL_MEDIUM //TW XP gain scales with repeated iterations so we cap it. /datum/surgery/healing steps = list(/datum/surgery_step/incise, @@ -28,7 +28,6 @@ implements = list(TOOL_HEMOSTAT = 100, TOOL_SCREWDRIVER = 65, /obj/item/pen = 55) repeatable = TRUE time = 25 - experience_given = 1 //scales with repeated iterations var/brutehealing = 0 var/burnhealing = 0 var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing! @@ -50,11 +49,11 @@ /datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(..()) - experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) + experience_given = min(experience_given+1,PER_ITERATION_XP_CAP) while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss())) if(!..()) break - experience_given = min(experience_given+0.25,PER_ITERATION_XP_CAP) + experience_given = min(experience_given+1,PER_ITERATION_XP_CAP) /datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) var/umsg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons" diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm index ed04b918f03..c55db698c67 100644 --- a/code/modules/surgery/hepatectomy.dm +++ b/code/modules/surgery/hepatectomy.dm @@ -24,7 +24,7 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 52 - experience_given = 10 + experience_given = (MEDICAL_SKILL_ORGAN_FIX*0.8) //repeatable so not as much xp /datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to cut out a damaged peice of [target]'s liver...", diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 2597464ea59..66658cf47a2 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -10,6 +10,7 @@ name = "extract implant" implements = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 65) time = 64 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/implant/I = null /datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index 1ba0464fa7e..db53ad47aea 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -8,7 +8,7 @@ name = "replace limb" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100) time = 32 - experience_given = 10 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/bodypart/L = null // L because "limb" diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 3b164188fdc..2c3ea560cd2 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -14,7 +14,6 @@ name = "cut excess fat" implements = list(TOOL_SAW = 100, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) time = 64 - experience_given = 2 /datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to cut away [target]'s excess fat.", "You begin to cut away [target]'s excess fat...") @@ -48,7 +47,7 @@ var/removednutriment = target.nutrition target.set_nutrition(NUTRITION_LEVEL_WELL_FED) removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat - experience_given = (round(removednutriment/30)) + experience_given = (round(removednutriment/(MEDICAL_SKILL_EASY*5))) var/mob/living/carbon/human/H = target var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm index 156c1ab4913..6ca80fe13c7 100644 --- a/code/modules/surgery/lobectomy.dm +++ b/code/modules/surgery/lobectomy.dm @@ -18,7 +18,7 @@ implements = list(TOOL_SCALPEL = 95, /obj/item/melee/transforming/energy/sword = 65, /obj/item/kitchen/knife = 45, /obj/item/shard = 35) time = 42 - experience_given = 10 + experience_given = MEDICAL_SKILL_ORGAN_FIX /datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to make an incision in [target]'s lungs...", diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 173420aecd4..340236ccc22 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -67,8 +67,8 @@ /datum/surgery_step/manipulate_organs time = 64 name = "manipulate organs" - repeatable = 1 - implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100) + repeatable = TRUE + implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null @@ -94,7 +94,10 @@ if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 - + var/obj/item/organ/meatslab = tool + if(!meatslab.useable) + to_chat(user, "[I] seems to have been chewed on, you can't use this!") + return -1 display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...", "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") @@ -122,10 +125,6 @@ else return -1 - else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ)) - to_chat(user, "[tool] was bitten by someone! It's too damaged to use!") - return -1 - /datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) if(current_type == "insert") if(istype(tool, /obj/item/organ_storage)) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 23d3a2ceb08..89937e7b5fc 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -39,9 +39,3 @@ ..() if(inflamed) M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) - -/obj/item/organ/appendix/prepare_eat() - var/obj/S = ..() - if(inflamed) - S.reagents.add_reagent(/datum/reagent/toxin/bad_food, 5) - return S diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index f9a1436d840..311b14e9585 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -54,10 +54,10 @@ update_icon() return 1 -/obj/item/organ/heart/prepare_eat() - var/obj/S = ..() - S.icon_state = "heart-off" - return S +/obj/item/organ/heart/OnEatFrom(eater, feeder) + . = ..() + beating = FALSE + update_icon() /obj/item/organ/heart/on_life() ..() diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 45d71eb2fff..fca2b6092a7 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -1,120 +1,117 @@ -#define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out -#define LIVER_DEFAULT_TOX_LETHALITY 0.01 //lower values lower how harmful toxins are to the liver - -/obj/item/organ/liver - name = "liver" - icon_state = "liver" - w_class = WEIGHT_CLASS_SMALL - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_LIVER - desc = "Pairing suggestion: chianti and fava beans." - - maxHealth = STANDARD_ORGAN_THRESHOLD - healing_factor = STANDARD_ORGAN_HEALING - decay_factor = STANDARD_ORGAN_DECAY - - var/alcohol_tolerance = ALCOHOL_RATE //affects how much damage the liver takes from alcohol - var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE //maximum amount of toxins the liver can just shrug off - var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY //affects how much damage toxins do to the liver - var/filterToxins = TRUE //whether to filter toxins - -#define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present -#define HAS_NO_TOXIN 1 -#define HAS_PAINFUL_TOXIN 2 - -/obj/item/organ/liver/on_life() - var/mob/living/carbon/C = owner - ..() //perform general on_life() - if(istype(C)) - if(!(organ_flags & ORGAN_FAILING) && !HAS_TRAIT(C, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver - - var/provide_pain_message = HAS_NO_TOXIN - if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) - //handle liver toxin filtration - for(var/datum/reagent/toxin/T in C.reagents.reagent_list) - var/thisamount = C.reagents.get_reagent_amount(T.type) - if (thisamount && thisamount <= toxTolerance) - C.reagents.remove_reagent(T.type, 1) - else - damage += (thisamount*toxLethality) - if(provide_pain_message != HAS_PAINFUL_TOXIN) - provide_pain_message = T.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN - - //metabolize reagents - C.reagents.metabolize(C, can_overdose=TRUE) - - if(provide_pain_message && damage > 10 && prob(damage/3))//the higher the damage the higher the probability - to_chat(C, "You feel a dull pain in your abdomen.") - - else //for when our liver's failing - C.liver_failure() - - if(damage > maxHealth)//cap liver damage - damage = maxHealth - -#undef HAS_SILENT_TOXIN -#undef HAS_NO_TOXIN -#undef HAS_PAINFUL_TOXIN - -/obj/item/organ/liver/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/iron, 5) - return S - -/obj/item/organ/liver/fly - name = "insectoid liver" - icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits. - desc = "A mutant liver designed to handle the unique diet of a flyperson." - alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect! - -/obj/item/organ/liver/plasmaman - name = "reagent processing crystal" - icon_state = "liver-p" - desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." - -/obj/item/organ/liver/alien - name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage - icon_state = "liver-x" // Same sprite as fly-person liver. - desc = "A liver that used to belong to a killer alien, who knows what it used to eat." - toxLethality = LIVER_DEFAULT_TOX_LETHALITY * 2.5 // rejects its owner early after too much punishment - toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful - -/obj/item/organ/liver/cybernetic - name = "basic cybernetic liver" - icon_state = "liver-c" - desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." - organ_flags = ORGAN_SYNTHETIC - toxTolerance = 2 - toxLethality = 0.011 - maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 - - var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. - -/obj/item/organ/liver/cybernetic/tier2 - name = "cybernetic liver" - icon_state = "liver-c-u" - desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD - toxTolerance = 5 //can shrug off up to 5u of toxins - toxLethality = 0.008 //20% less damage than a normal liver - emp_vulnerability = 40 - -/obj/item/organ/liver/cybernetic/tier3 - name = "upgraded cybernetic liver" - icon_state = "liver-c-u2" - desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." - alcohol_tolerance = 0.001 - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - toxTolerance = 10 //can shrug off up to 10u of toxins - toxLethality = 0.008 //20% less damage than a normal liver - emp_vulnerability = 20 - -/obj/item/organ/liver/cybernetic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(world.time > severe_cooldown) //So we cant just spam emp to kill people. - owner.adjustToxLoss(10) - severe_cooldown = world.time + 10 SECONDS - if(prob(emp_vulnerability/severity)) //Chance of permanent effects - organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. +#define LIVER_DEFAULT_TOX_TOLERANCE 3 //amount of toxins the liver can filter out +#define LIVER_DEFAULT_TOX_LETHALITY 0.01 //lower values lower how harmful toxins are to the liver + +/obj/item/organ/liver + name = "liver" + icon_state = "liver" + w_class = WEIGHT_CLASS_SMALL + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_LIVER + desc = "Pairing suggestion: chianti and fava beans." + + maxHealth = STANDARD_ORGAN_THRESHOLD + healing_factor = STANDARD_ORGAN_HEALING + decay_factor = STANDARD_ORGAN_DECAY + + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) + + var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol + var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE//maximum amount of toxins the liver can just shrug off + var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver + var/filterToxins = TRUE //whether to filter toxins + +#define HAS_SILENT_TOXIN 0 //don't provide a feedback message if this is the only toxin present +#define HAS_NO_TOXIN 1 +#define HAS_PAINFUL_TOXIN 2 + +/obj/item/organ/liver/on_life() + var/mob/living/carbon/C = owner + ..() //perform general on_life() + if(istype(C)) + if(!(organ_flags & ORGAN_FAILING) && !HAS_TRAIT(C, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver + + var/provide_pain_message = HAS_NO_TOXIN + if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) + //handle liver toxin filtration + for(var/datum/reagent/toxin/T in C.reagents.reagent_list) + var/thisamount = C.reagents.get_reagent_amount(T.type) + if (thisamount && thisamount <= toxTolerance) + C.reagents.remove_reagent(T.type, 1) + else + damage += (thisamount*toxLethality) + if(provide_pain_message != HAS_PAINFUL_TOXIN) + provide_pain_message = T.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN + + //metabolize reagents + C.reagents.metabolize(C, can_overdose=TRUE) + + if(provide_pain_message && damage > 10 && prob(damage/3))//the higher the damage the higher the probability + to_chat(C, "You feel a dull pain in your abdomen.") + + else //for when our liver's failing + C.liver_failure() + + if(damage > maxHealth)//cap liver damage + damage = maxHealth + +#undef HAS_SILENT_TOXIN +#undef HAS_NO_TOXIN +#undef HAS_PAINFUL_TOXIN + +/obj/item/organ/liver/fly + name = "insectoid liver" + icon_state = "liver-x" //xenomorph liver? It's just a black liver so it fits. + desc = "A mutant liver designed to handle the unique diet of a flyperson." + alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect! + +/obj/item/organ/liver/plasmaman + name = "reagent processing crystal" + icon_state = "liver-p" + desc = "A large crystal that is somehow capable of metabolizing chemicals, these are found in plasmamen." + +/obj/item/organ/liver/alien + name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage + icon_state = "liver-x" // Same sprite as fly-person liver. + desc = "A liver that used to belong to a killer alien, who knows what it used to eat." + toxLethality = LIVER_DEFAULT_TOX_LETHALITY * 2.5 // rejects its owner early after too much punishment + toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful + +/obj/item/organ/liver/cybernetic + name = "basic cybernetic liver" + icon_state = "liver-c" + desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." + organ_flags = ORGAN_SYNTHETIC + toxTolerance = 2 + toxLethality = 0.011 + maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 + + var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. + +/obj/item/organ/liver/cybernetic/tier2 + name = "cybernetic liver" + icon_state = "liver-c-u" + desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." + maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 5 //can shrug off up to 5u of toxins + toxLethality = 0.008 //20% less damage than a normal liver + emp_vulnerability = 40 + +/obj/item/organ/liver/cybernetic/tier3 + name = "upgraded cybernetic liver" + icon_state = "liver-c-u2" + desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." + alcohol_tolerance = 0.001 + maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + toxTolerance = 10 //can shrug off up to 10u of toxins + toxLethality = 0.008 //20% less damage than a normal liver + emp_vulnerability = 20 + +/obj/item/organ/liver/cybernetic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(world.time > severe_cooldown) //So we cant just spam emp to kill people. + owner.adjustToxLoss(10) + severe_cooldown = world.time + 10 SECONDS + if(prob(emp_vulnerability/severity)) //Chance of permanent effects + organ_flags = ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 26c54d188d1..57879cd6203 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -11,10 +11,15 @@ healing_factor = STANDARD_ORGAN_HEALING decay_factor = STANDARD_ORGAN_DECAY + low_threshold_passed = "You feel short of breath." high_threshold_passed = "You feel some sort of constriction around your chest as your breathing becomes shallow and rapid." now_fixed = "Your lungs seem to once again be able to hold air." + low_threshold_cleared = "You can breathe normally again." high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down." + + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) + //Breath damage var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa @@ -392,20 +397,18 @@ breath.temperature = H.bodytemperature /obj/item/organ/lungs/on_life() - ..() - if((!failed) && ((organ_flags & ORGAN_FAILING))) - if(owner.stat == CONSCIOUS) - owner.visible_message("[owner] grabs [owner.p_their()] throat, struggling for breath!", \ - "You suddenly feel like you can't breathe!") - failed = TRUE - else if(!(organ_flags & ORGAN_FAILING)) + . = ..() + if(failed && !(organ_flags & ORGAN_FAILING)) failed = FALSE - return + return + if(damage >= low_threshold) + var/do_i_cough = damage < high_threshold ? prob(5) : prob(10) // between : past high + if(do_i_cough) + owner.emote("cough") + if(organ_flags & ORGAN_FAILING && owner.stat == CONSCIOUS) + owner.visible_message("[owner] grabs [owner.p_their()] throat, struggling for breath!", "You suddenly feel like you can't breathe!") + failed = TRUE -/obj/item/organ/lungs/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5) - return S /obj/item/organ/lungs/plasmaman name = "plasma filter" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f795ba8aa03..998acb13a03 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,7 +8,7 @@ var/zone = BODY_ZONE_CHEST var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! - var/organ_flags = 0 + var/organ_flags = ORGAN_EDIBLE var/maxHealth = STANDARD_ORGAN_THRESHOLD var/damage = 0 //total damage this organ has sustained ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick @@ -26,6 +26,15 @@ var/high_threshold_cleared var/low_threshold_cleared + ///When you take a bite you cant jam it in for surgery anymore. + var/useable = TRUE + var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) + +/obj/item/organ/Initialize() + . = ..() + if(organ_flags & ORGAN_EDIBLE) + AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) + /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) if(!iscarbon(M) || owner == M) return @@ -94,31 +103,13 @@ . = ..() if(organ_flags & ORGAN_FAILING) if(status == ORGAN_ROBOTIC) - . += "[src] seems to be broken!" + . += "[src] seems to be broken." return - . += "[src] has decayed for too long, and has turned a sickly color! It doesn't look like it will work anymore!" + . += "[src] has decayed for too long, and has turned a sickly color. It probably won't work without repairs." return if(damage > high_threshold) . += "[src] is starting to look discolored." - -/obj/item/organ/proc/prepare_eat() - var/obj/item/reagent_containers/food/snacks/organ/S = new - S.name = name - S.desc = desc - S.icon = icon - S.icon_state = icon_state - S.w_class = w_class - - return S - -/obj/item/reagent_containers/food/snacks/organ - name = "appendix" - icon_state = "appendix" - icon = 'icons/obj/surgery.dmi' - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - foodtype = RAW | MEAT | GROSS - /obj/item/organ/Initialize() . = ..() START_PROCESSING(SSobj, src) @@ -132,17 +123,8 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/organ/attack(mob/living/carbon/M, mob/user) - if(M == user && ishuman(user)) - var/mob/living/carbon/human/H = user - if(status == ORGAN_ORGANIC) - var/obj/item/reagent_containers/food/snacks/S = prepare_eat(H) - if(S) - qdel(src) - if(H.put_in_active_hand(S)) - S.attack(H, H) - else - ..() +/obj/item/organ/proc/OnEatFrom(eater, feeder) + useable = FALSE //You can't use it anymore after eating it you spaztic /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index d6e2a313d75..8c020ccfa85 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -248,6 +248,7 @@ name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." status = ORGAN_ROBOTIC + organ_flags = NONE icon_state = "tonguerobot" say_mod = "states" attack_verb = list("beeped", "booped") diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm index 135008f3f0b..0e64a08b349 100644 --- a/code/modules/surgery/plastic_surgery.dm +++ b/code/modules/surgery/plastic_surgery.dm @@ -8,7 +8,7 @@ name = "reshape face" implements = list(TOOL_SCALPEL = 100, /obj/item/kitchen/knife = 50, TOOL_WIRECUTTER = 35) time = 64 - experience_given = 5 + experience_given = MEDICAL_SKILL_MEDIUM /datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to alter [target]'s appearance.", "You begin to alter [target]'s appearance...") diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index 5f262b40709..0b701d194fc 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -19,7 +19,7 @@ name = "add prosthetic" implements = list(/obj/item/bodypart = 100, /obj/item/organ_storage = 100, /obj/item/twohanded/required/chainsaw = 100, /obj/item/melee/synthetic_arm_blade = 100) time = 32 - experience_given = 5 //won't get full XP if rejected + experience_given = MEDICAL_SKILL_ORGAN_FIX //won't get full XP if rejected var/organ_rejection_dam = 0 /datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 30e08da31be..39f9bcfff54 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -8,7 +8,7 @@ name = "remove embedded objects" time = 32 accept_hand = 1 - experience_given = 5 + experience_given = MEDICAL_SKILL_MEDIUM var/obj/item/bodypart/L = null @@ -40,6 +40,7 @@ display_results(user, target, "You successfully remove [objects] objects from [H]'s [L.name].", "[user] successfully removes [objects] objects from [H]'s [L]!", "[user] successfully removes [objects] objects from [H]'s [L]!") + experience_given = MEDICAL_SKILL_MEDIUM*(objects*0.75) else to_chat(user, "You find no objects embedded in [H]'s [L]!") diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index 6e844940ce2..63bdfedff9d 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -11,6 +11,7 @@ possible_locs = list(BODY_ZONE_CHEST) requires_bodypart_type = TRUE ignore_clothes = FALSE + var/accumulated_experience = 0 /datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) var/obj/item/organ/stomach/S = target.getorganslot(ORGAN_SLOT_STOMACH) @@ -28,6 +29,7 @@ accept_hand = TRUE repeatable = TRUE time = 20 + experience_given = 0 /datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin pumping [target]'s stomach...", @@ -37,10 +39,16 @@ /datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(ishuman(target)) var/mob/living/carbon/human/H = target + var/reagents_volume_before_pump = H.reagents.total_volume display_results(user, target, "[user] forces [H] to vomit, cleansing their stomach of some chemicals!", "[user] forces [H] to vomit, cleansing their stomach of some chemicals!", "[user] forces [H] to vomit!") H.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge = TRUE) //called with purge as true to lose more reagents + if(istype(surgery,/datum/surgery/stomach_pump)) + var/datum/surgery/stomach_pump/stom_pump = surgery + if(stom_pump.accumulated_experience > MEDICAL_SKILL_MEDIUM*10) //capped so you can't dope bodies and purge for ezxp + experience_given = (H.reagents.total_volume - reagents_volume_before_pump)/(MEDICAL_SKILL_MEDIUM) + stom_pump.accumulated_experience += experience_given return ..() /datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 95507477c33..da43e384032 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -10,7 +10,7 @@ var/require_all_chems = TRUE //any on the list or all on the list? var/silicons_obey_prob = FALSE /// The amount of a experience given for successfully completing the step. - var/experience_given = 1 + var/experience_given = MEDICAL_SKILL_EASY /datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) var/success = FALSE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 16a2b156cf6..a53aaa22075 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -841,10 +841,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 1 include_modes = list(/datum/game_mode/nuclear) -/datum/uplink_item/ammo/dark_gygax/bag - name = "Dark Gygax Ammo Bag" - desc = "A duffel bag containing ammo for three full reloads of the incendiary carbine and flash bang launcher that are equipped on a standard Dark Gygax exosuit." - item = /obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax +/datum/uplink_item/ammo/mech/bag + name = "Mech Support Kit Bag" + desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." + item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech cost = 4 include_modes = list(/datum/game_mode/nuclear) diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm index 89b0a5c7bc6..8015024753d 100644 --- a/code/modules/vehicles/lavaboat.dm +++ b/code/modules/vehicles/lavaboat.dm @@ -15,7 +15,7 @@ /obj/vehicle/ridden/lavaboat/Initialize() . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) - D.keytype = /obj/item/oar + D.keytype = list(/obj/item/oar) D.allowed_turf_typecache = typecacheof(allowed_turf) /obj/item/oar diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index 97ed066420d..8344aa045f1 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -8,6 +8,13 @@ key_type = /obj/item/key/security integrity_failure = 0.5 + + + ///This stores a banana that, when used on the secway, prevents the vehicle from moving until it is removed. + var/obj/item/reagent_containers/food/snacks/grown/banana/eddie_murphy + ///When jammed with a banana, the secway will make a stalling sound. This stores the last time it made a sound to prevent spam. + var/stall_cooldown + /obj/vehicle/ridden/secway/Initialize() . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) @@ -36,8 +43,42 @@ if(obj_integrity == max_integrity) to_chat(user, "It looks to be fully repaired now.") return TRUE + + if(istype(W, /obj/item/reagent_containers/food/snacks/grown/banana)) + // ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now! + user.visible_message("[user] begins stuffing [W] into [src]'s tailpipe.", "You begin stuffing [W] into [src]'s tailpipe...", ignored_mobs = occupants) + if(do_after(user, 30, TRUE, src)) + if(user.transferItemToLoc(W, src)) + user.visible_message("[user] stuffs [W] into [src]'s tailpipe.", "You stuff [W] into [src]'s tailpipe.", ignored_mobs = occupants) + eddie_murphy = W + return TRUE return ..() +/obj/vehicle/ridden/secway/attack_hand(mob/living/user) + if(eddie_murphy) // v lol + user.visible_message("[user] begins cleaning [eddie_murphy] out of [src].", "You begin cleaning [eddie_murphy] out of [src]...") + if(do_after(user, 60, target = src)) + user.visible_message("[user] cleans [eddie_murphy] out of [src].", "You manage to get [eddie_murphy] out of [src].") + eddie_murphy.forceMove(drop_location()) + eddie_murphy = null + return + return ..() + +/obj/vehicle/ridden/secway/driver_move(mob/user, direction) + if(is_key(inserted_key) && eddie_murphy) + if(stall_cooldown + 10 < world.time) + visible_message("[src] sputters and refuses to move!") + playsound(src, "sound/effects/stall.ogg", 70) + stall_cooldown = world.time + return FALSE + return ..() + +/obj/vehicle/ridden/secway/examine(mob/user) + . = ..() + + if(eddie_murphy) + . += "Something appears to be stuck in its exhaust..." + /obj/vehicle/ridden/secway/obj_destruction() explosion(src, -1, 0, 2, 4, flame_range = 3) return ..() diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index 204a10bd17e..0847512f094 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -13,3 +13,14 @@ desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"." icon_state = "keyjanitor" +/obj/item/key/lasso + name = "bone lasso" + desc = "Perfect for taming all kinds of supernatural beasts! (Warning: only perfect for taming one kind of supernatural beast.)" + force = 12 + icon_state = "lasso" + item_state = "chain" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + attack_verb = list("flogged", "whipped", "lashed", "disciplined") + hitsound = 'sound/weapons/whip.ogg' + slot_flags = ITEM_SLOT_BELT diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index d75c4426559..da517e4ff7f 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -114,7 +114,6 @@ /obj/item/clothing/head/cueball = 1, /obj/item/clothing/under/suit/white_on_white = 1, /obj/item/clothing/under/costume/sailor = 1, - /obj/item/clothing/ears/headphones = 2, /obj/item/clothing/head/delinquent = 1, /obj/item/clothing/head/wig/random = 3, /obj/item/clothing/head/shrine_wig = 1, @@ -126,7 +125,7 @@ /obj/item/gohei = 1) contraband = list(/obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, - /obj/item/gun/magic/wand = 2, + /obj/item/gun/magic/wand/nothing = 2, /obj/item/clothing/glasses/sunglasses/garb = 2, /obj/item/clothing/glasses/blindfold = 1, /obj/item/clothing/mask/muzzle = 2) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 45867d5ec02..7cd36e3388c 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -46,7 +46,6 @@ /obj/item/storage/belt/fannypack = 3, /obj/item/storage/belt/fannypack/blue = 3, /obj/item/storage/belt/fannypack/red = 3, - /obj/item/clothing/ears/headphones = 2, /obj/item/clothing/under/misc/overalls = 2, /obj/item/clothing/under/pants/jeans = 2, /obj/item/clothing/under/pants/classicjeans = 2, diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index ebc14a74e46..24a4744a7ec 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -8,6 +8,7 @@ /obj/item/toy/cards/deck/cas = 3, /obj/item/toy/cards/deck/cas/black = 3, /obj/item/hourglass = 2, + /obj/item/instrument/piano_synth/headphones = 4, /obj/item/camera = 3) contraband = list(/obj/item/dice/fudge = 9) premium = list(/obj/item/melee/skateboard/pro = 3, diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 4b76ce03d1b..cf574c2fda6 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -36,7 +36,8 @@ /obj/item/sensor_device = 2, /obj/item/pinpointer/crew = 2, /obj/item/storage/firstaid/advanced = 2, - /obj/item/shears = 1) + /obj/item/shears = 1, + /obj/item/plunger/reinforced = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/medical diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 0d5ac31d8c0..ab48ccb2921 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -29,7 +29,6 @@ /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, /obj/item/seeds/pumpkin = 3, - /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, /obj/item/seeds/sugarcane = 3, @@ -42,14 +41,14 @@ /obj/item/seeds/wheat = 3, /obj/item/seeds/whitebeet = 3) contraband = list(/obj/item/seeds/amanita = 2, - /obj/item/seeds/glowshroom = 2, - /obj/item/seeds/liberty = 2, - /obj/item/seeds/nettle = 2, - /obj/item/seeds/plump = 2, - /obj/item/seeds/reishi = 2, - /obj/item/seeds/cannabis = 3, - /obj/item/seeds/starthistle = 2, - /obj/item/seeds/random = 2) + /obj/item/seeds/glowshroom = 2, + /obj/item/seeds/liberty = 2, + /obj/item/seeds/nettle = 2, + /obj/item/seeds/plump = 2, + /obj/item/seeds/reishi = 2, + /obj/item/seeds/cannabis = 3, + /obj/item/seeds/starthistle = 2, + /obj/item/seeds/random = 2) premium = list(/obj/item/reagent_containers/spray/waterflower = 1) refill_canister = /obj/item/vending_refill/hydroseeds default_price = 100 diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index e4ef90ff75b..51446c8c980 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -283,6 +283,7 @@ /obj/item/clothing/under/rank/civilian/janitor/skirt = 2, /obj/item/clothing/gloves/color/black = 2, /obj/item/clothing/head/soft/purple = 2, + /obj/item/twohanded/broom = 2, /obj/item/paint/paint_remover = 2, /obj/item/melee/flyswatter = 2, /obj/item/flashlight = 2, diff --git a/config/config.txt b/config/config.txt index 4cd17022a6a..d61d9b0f4a6 100644 --- a/config/config.txt +++ b/config/config.txt @@ -381,12 +381,6 @@ MAPROTATION ## When it's set to zero, the map will be randomly picked each round PREFERENCE_MAP_VOTING 1 -## Map rotate chance delta -## This is the chance of map rotation factored to the round length. -## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) -#MAPROTATIONCHANCEDELTA 0.75 - ## AUTOADMIN ## The default admin rank AUTOADMIN_RANK Game Master diff --git a/config/game_options.txt b/config/game_options.txt index 91b406be709..2e555cef8d0 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -249,6 +249,9 @@ MAX_TICKETS_PER_ROLL 100 ## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype. #SHOW_GAME_TYPE_ODDS +## Uncomment to prevent the nuclear operative leader from getting the war declaration item +#DISABLE_WAROPS + ## Uncomment to enable dynamic ruleset config file. DYNAMIC_CONFIG_ENABLED @@ -566,5 +569,8 @@ MONKEYCAP 64 ## A cap on how many mice can be bred via cheese wedges RATCAP 64 +## Maximum fine for a citation +MAXFINE 2000 + ## Enable the capitalist agenda on your server. ECONOMY diff --git a/html/changelog.html b/html/changelog.html index 4775b242e2a..a4a449f13be 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,6 +51,372 @@ -->
    +

    15 February 2020

    +

    BadSS13Player updated:

    +
      +
    • The Exosuit Fabricator's sync with R&D operation is now instant.
    • +
    +

    Buggy123 updated:

    +
      +
    • Random mineral turfs no longer cause large amounts of turf changes on initialization.
    • +
    +

    Cobby updated:

    +
      +
    • Buffs Surgery XP values
    • +
    +

    Krysonism updated:

    +
      +
    • The Cosa Nostra starter pack has been added to cargo as a contraband crate.
    • +
    • Added pictures of the virgin mary, burning one of these will let you pick a mafia nickname.
    • +
    • The beige suit, beige fedora and white fedora clothing items have been added to the game.
    • +
    • The non-job fedoras and the white suit have been resprited.
    • +
    +

    Skoglol updated:

    +
      +
    • Unhusking someone with synthflesh will no longer tell everyone they were the one to fix the corpse.
    • +
    +

    XDTM updated:

    +
      +
    • Fixed nanite shutdown timer not properly shutting down nanites.
    • +
    +

    actioninja updated:

    +
      +
    • tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and Revelation
    • +
    • Creation of TXT Files on modular computer has been indefinitely removed
    • +
    • Due to architecture concerns, NTNet Transfer has been indefinitely removed from NTOS hardware.
    • +
    +

    nianjiilical updated:

    +
      +
    • Some weird shit happened in space, and now Ethereals are appearing in new colors. Scientists are baffled.
    • +
    +

    nightred updated:

    +
      +
    • Space Suits warm the wearer, and use Cells
    • +
    • Suit Storage charges Space Suits
    • +
    • EMP's cause Hard Suit's to burn the wearer
    • +
    • Engineering now has emp proof cells with the suits
    • +
    • Hud status for space suit power level
    • +
    • ERT hardsuits get EMP protection AND ONLY THEM
    • +
    + +

    14 February 2020

    +

    Arkatos updated:

    +
      +
    • Infrared emitter now uses tgui-next.
    • +
    • Proximity sensor now uses tgui-next.
    • +
    • Geneticist now uses science selection color in the preferences menu.
    • +
    +

    Capsandi updated:

    +
      +
    • Fixed grammar in death-nettle attack and pickup messages
    • +
    +

    EOBGames updated:

    +
      +
    • The Lavaland Gulag has been rebuilt following repeated complaints about 'human rights violations'.
    • +
    • A hawaiian shirt, currently only in the beach bum ruin.
    • +
    • Fixed a couple of issues with the beach bum ruin.
    • +
    +

    Fikou updated:

    +
      +
    • the nuke op leader having access to the war declaration item is now a config
    • +
    +

    Mickyan updated:

    +
      +
    • Headphones can now play custom music
    • +
    • Moved headphones to the games vendor in the library
    • +
    • Added support for instruments with custom effects triggered by playing
    • +
    +

    Putnam and ninjanomnom updated:

    +
      +
    • Radioactive contamination now has a limited amount of material to be used to contaminate things.
    • +
    +

    Ryll/Shaps updated:

    +
      +
    • You can now sabotage secways by stuffing a banana in their tailpipe.
    • +
    +

    actioninja updated:

    +
      +
    • Traitor Uplink buy buttons properly disable when you don't have enough TC again
    • +
    +

    cacogen updated:

    +
      +
    • Soil no longer renames itself hydroponics tray while something is planted in it
    • +
    • Hydroponics planter names will update when weeds are mutated
    • +
    • Planters no longer change description to match that of what's planted in them
    • +
    +

    necromanceranne updated:

    +
      +
    • A mech support bag.
    • +
    • Combat wrench.
    • +
    • Made the dark gygax significantly better by adjusting equipment and stats.
    • +
    +

    nemvar updated:

    +
      +
    • Replaced the effect of the "two left feet" mutation with random knockdowns while moving.
    • +
    + +

    13 February 2020

    +

    Arkatos updated:

    +
      +
    • HUDs for various simple mobs are now cleaner and consistent with each other.
    • +
    +

    Buggy123 updated:

    +
      +
    • Beware! The Syndicate have upgraded their stolen teleportation machinery, they are now capable of providing reinforcements to their elite operatives nearly anywhere, even in the middle of combat! Not that that would be wise, to say the least.
    • +
    +

    Dennok updated:

    +
      +
    • After rigorous training, Nanotrasen zoologists have observed a rise in the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand weapons.
    • +
    +

    Denton updated:

    +
      +
    • Moved duplicate CID/IP logging from log_access to log_admin_private.
    • +
    +

    Dingo-Dongler updated:

    +
      +
    • Examining people with sechuds will let you give someone an on the spot citation.
    • +
    +

    MMMiracles updated:

    +
      +
    • Multi-Z power relays can repaired but must be manually updated with a multi-tool when reinstalling/moving around.
    • +
    +

    PKPenguin321 updated:

    +
      +
    • Salt piles now get kicked around and eventually scattered to the wind when ran over too much.
    • +
    +

    Skoglol updated:

    +
      +
    • Initial ahelps are now multiline too.
    • +
    • Contractor tablet should now properly let you shop for rep.
    • +
    +

    Tlaltecuhtli updated:

    +
      +
    • adds medipen refiller machine
    • +
    +

    cacogen updated:

    +
      +
    • Swapped positions of Meta Morgue and chem factory
    • +
    • Resized the space now taken up by Meta chem factory to be slightly larger
    • +
    • Made Meta Morgue smaller
    • +
    • Moved Meta maint bar above the new Morgue where rest of the chem factory was
    • +
    • Moved Meta medbay alcove with NanoMed to opposite side of hall
    • +
    • Moved Meta Medical Surplus Storeroom above Virology, off maint across from alcove
    • +
    • Two new Meta maint Storage Rooms beneath robotics
    • +
    • Unanchored solar assemblies go off-centre to indicate they need securing. Secured ones centre themselves
    • +
    +

    ike709 updated:

    +
      +
    • Taking pictures of openspace turfs works now.
    • +
    +

    itseasytosee updated:

    +
      +
    • atmos helmets now properly protect you from pepper spray and face-huggers.
    • +
    +

    nemvar updated:

    +
      +
    • Fixed an issue where unstable people could regain sanity.
    • +
    +

    nightred updated:

    +
      +
    • Hugs are warm now
    • +
    • natural_bodytemperature_stabilization is now self contained.
    • +
    • adjust_bodytemperature to allow the use of insulation and change steps
    • +
    + +

    11 February 2020

    +

    ArcaneMusic updated:

    +
      +
    • Nanotrasen's research division has gone ahead and scratched all possible plans of building new sleepers for the station, due to the discovery of old sleepers injecting crew with lead acetate.
    • +
    • In unrelated news, the research division is proud to announce the all new, "party pods"! Available at your local station B.E.P.I.S. platform as a minor reward.
    • +
    • Wooden Plank Floors no longer runtime.
    • +
    +

    Arkatos updated:

    +
      +
    • Mining Vendor now uses tgui-next.
    • +
    +

    Bokkiewokkie updated:

    +
      +
    • adds box icons for tons of boxes.
    • +
    • changes the toy and shotgun ammo boxes so they're in the new art style.
    • +
    +

    Cloneby updated:

    +
      +
    • Strange Reagent now requires a set amount to revive dependent on patient wellbeing and requires an excess to heal blood and organs. Does more damage on life. Basically loses one-click wonder status UNLESS you give a considerable amount and deal with the consequences.
    • +
    +

    Coconutwarrior97 updated:

    +
      +
    • Fixes meta armory external camera by naming it properly.
    • +
    • AI can use the carp hologram again.
    • +
    • Fixes a typo in mind.dm .
    • +
    +

    Dennok updated:

    +
      +
    • Now nanites don't die from illusions and placing unpowered cable by bare hands.
    • +
    • Now MultiZ Debug map has open space under floor instead of space.
    • +
    +

    Denton updated:

    +
      +
    • Constructed display cases no longer spawn with an alarm that bolts all nearby doors.
    • +
    +

    EOBGames updated:

    +
      +
    • The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch some waves, brah!
    • +
    • Fixed a few minor map problems.
    • +
    +

    Fikou updated:

    +
      +
    • You can now make lassos with a bone and 5 sinew and make saddles from 5 leather sheets, you can also tame goliaths with lavaland food (I think you know what those 3 things mean together)
    • +
    • xenos now keep their name consistent through evolutions
    • +
    • fixes humanoid xeno numbers being 0
    • +
    • royal xenos also get numbers
    • +
    +

    JJRcop updated:

    +
      +
    • Defibs and Defibbing Nanites act the same way again.
    • +
    • Fixed removing brains from changeling husks.
    • +
    +

    Krysonism updated:

    +
      +
    • 4 new ice creams created using the crafting menu,
    • +
    • You can now make popsicle sticks by sticking logs in the processor.
    • +
    +

    Mickyan updated:

    +
      +
    • Blood dripping frequency now scales with blood loss
    • +
    • Fixed blood decals occasionally containing more blood than they should
    • +
    • The Delta Station stasis room has received a makeover
    • +
    +

    NoxVS updated:

    +
      +
    • Nanotrasen has properly relabeled all cyborg limbs following their rediscovery of which direction is left and which is right
    • +
    +

    OnlineGirlfriend updated:

    +
      +
    • crushed can sprite for Sol Dry
    • +
    • Sol Dry cans can be crushed
    • +
    • salami filling color
    • +
    • salami taste
    • +
    +

    Qustinnus updated:

    +
      +
    • there is now an edible component which will allow us to deprecate our hacky methods of making things such as organs edible
    • +
    +

    RaveRadbury updated:

    +
      +
    • Removed latejoin prisoner option
    • +
    +

    ShizCalev updated:

    +
      +
    • Emitters will now remain anchored when being constructed from an anchored machine frame.
    • +
    • Emitters will now properly turn off and be unwelded if unanchored via varediting.
    • +
    • Unanchored emitters will no longer be pulled towards non-harmful simple animals (ie butterflies, cats, ect) if they click on them.
    • +
    • Fixed a scenario where emitters could start welded and be turned on, but were not properly anchored to the ground.
    • +
    • Fixed a scenario where emitters could start anchored to the ground, but had to be resecured with a wrench to get them to work properly.
    • +
    • Emitters now properly use the anchored var. The state var has been renamed to welded, and only tracks welded status.
    • +
    • The anchored emitter map subtype has been changed to a fully welded one, since all utilized instances were editted to be welded as well anyway.
    • +
    • Added a bit more examine feedback to emitters.
    • +
    • Emitters will now show how often they fire a little more accurately.
    • +
    • Attacking the Supermatter crystal with a NODROP item (ie cyborgs with literally any item, ninjas, highlanders, ect) will now dust the user.
    • +
    • Fixed spell books becoming unreadable if you moved while reading them.
    • +
    • Fixed progress bars not showing up for spell books.
    • +
    • Fixed an exploit where spell books didn't always have to be in your hand to finish reading them.
    • +
    +

    Skoglol updated:

    +
      +
    • Removes cloning from the codebase. Cloning rooms have been converted to temporary wards and storage. Experimental cloner and its ruin is also gone.
    • +
    • Replica pod seed availability reduced. No longer available in megaseed vendors, seed crate contains one seed down from three. Mutate some cabbages if you want these.
    • +
    • Say should be less likely to break when under heavy server strain.
    • +
    • Brain death is no longer a thing, no arbitrary unhealable death. Uses organ damage like the rest.
    • +
    • Brains can now be attacked again.
    • +
    • Brains no longer report you SSD if you are in the brain and not ghosted out.
    • +
    • Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, instead of a flat 10 damage for any amount over 10 units.
    • +
    • Defib faliure feedback is now more clear and hints at how to fix it.
    • +
    • Defibs now force the ghost back.
    • +
    • Improved brain feedback, no longer reports SSD.
    • +
    • Stomach pump and brain surgery are now repeatable surgeries.
    • +
    • Removed some forgotten references to defib time of death restrictions.
    • +
    • Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery.
    • +
    • Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage.
    • +
    • Changeling adrenals now last 20 seconds, up from 15 seconds.
    • +
    • Dynamic revs runtime and infinite loss announcement fixed.
    • +
    +

    SteelSlayer updated:

    +
      +
    • Adds the dunkable element. Converts items who were using the dunkable var to instead use this element and removes the dunkable var.
    • +
    • Adds a new "DUNKABLE" reagent flag for reagent containers. This determines whether or not the container can have items dunked into it.
    • +
    +

    TheChosenEvilOne updated:

    +
      +
    • Foamy beer stationwide event works again.
    • +
    +

    Thebleh updated:

    +
      +
    • Bodies with souls show the defib icon on medhuds.
    • +
    +

    Tlaltecuhtli updated:

    +
      +
    • grinder chem not grinding
    • +
    • dir of grinder chem
    • +
    +

    Vondiech updated:

    +
      +
    • There is no longer a light fixture attached to an airlock in the Experimentation Lab on Metastation.
    • +
    +

    armhulen fikou gang updated:

    +
      +
    • a lot of >32x32 mobs now have icons for their health dolls
    • +
    +

    cacogen updated:

    +
      +
    • The abductor baton is now a child of the regular stun baton. There shouldn't be a functional difference.
    • +
    • You need to be an abductor to change baton modes. Seemed like an oversight
    • +
    • Fixes some typos in the abductor baton's messages
    • +
    • Both regular stun baton and abductor baton have had a lot of vars exposed pertaining to their functionality so that could come in handy I guess
    • +
    • Cybernetic implant readouts on medHUD and health analyzer are more compact and show an icon of each
    • +
    +

    improvedname updated:

    +
      +
    • Chamkits now include an chameleon belt
    • +
    +

    imsxz updated:

    +
      +
    • skateboards now buckle you after activating them in hand.
    • +
    +

    itseasytosee updated:

    +
      +
    • Three more toys to find in your local arcade cabinet! Squeaky brain, trick blindfold, and a broken radio. Collect em all!
    • +
    • Plasmamen prisoners now use the proper helmet sprite.
    • +
    • Pacifists can now use the wand of nothing.
    • +
    • Shotgun in hands are no longer broken.
    • +
    • An ancient recipe for the ultimate soap can be had by janitors that carry family heirlooms and those who crawl maintenance.
    • +
    +

    nightred updated:

    +
      +
    • plastic water bottles can now spash
    • +
    • plastic water bottle caps render properly the first time
    • +
    • Fixes pulling button location on simple mobs
    • +
    • Polymorph kicks AI's out of shells
    • +
    • Changed custom material output on examine to be on a single line
    • +
    +

    optimumtact updated:

    +
      +
    • lawyer's department backpack... is a backpack again
    • +
    +

    peoplearestrange updated:

    +
      +
    • Removed Special Verbs Tab
    • +
    • New admin button Tabs
    • +
    +

    wesoda25 updated:

    +
      +
    • You will now cough if you have lung damage (no stun).
    • +
    +

    zxaber updated:

    +
      +
    • It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start.
    • +
    • Borgs now get a message when receiving any upgrade.
    • +
    +

    02 February 2020

    AffectedArc07 updated:

      @@ -1324,160 +1690,6 @@
      • Added logging for when an Exosuit Console is used to EMP a mech.
      - -

      07 December 2019

      -

      Arkatos updated:

      -
        -
      • Gravity Generator now uses tgui-next UI.
      • -
      -

      Denton updated:

      -
        -
      • Added an (admin only) amputation arcade subtype that dispenses wrapped gifts instead of arcade prizes.
      • -
      -

      EdgeLordExe updated:

      -
        -
      • New room: Medbay Clinic , found in between lobby and mebday 'proper' on metastation
      • -
      • Removed the office near medbay entrance
      • -
      • Increased the size of security office in medbay del:public chem fridge removed, as the old 'private' one is in now public area
      • -
      -

      Firecage updated:

      -
        -
      • Updates the energy resistance armour values on several armours and helmets.
      • -
      • Absolute pathing inserted into timsorts.
      • -
      -

      Krysonism updated:

      -
        -
      • Several new burgers.
      • -
      • Fiesta skewer, corn chips & chicken meat.
      • -
      • some old burger sprites have been replaced.
      • -
      • The ghost burger is much spookier.
      • -
      • some burger recipes have been tweaked.
      • -
      -

      PepperPrepper updated:

      -
        -
      • Nightmares/Shadowpeople can be flashed
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • Adds a new admin punishment, full immersion! Full immersion means having to manually *blink, *inhale, and *exhale, or else! Are you having fun yet?
      • -
      -

      Skoglol updated:

      -
        -
      • The "Start Now" verb can now be cancelled by using it again or setting a custom pre-game delay.
      • -
      • tgui-next: Meteor shield controller
      • -
      • Mindswap no longer force ghosts the target.
      • -
      -

      TheVekter updated:

      -
        -
      • Converted the smoke machine over to tgui-next.
      • -
      -

      Tlaltecuhtli updated:

      -
        -
      • plumbing machine to grind/juice objects and put it on duct net
      • -
      -

      actioninja updated:

      -
        -
      • Glide size now scales with movespeed. 60 fps won't jitter your camera around and slower moving mobs will appear to actually be slower.
      • -
      • 60 fps is now the client default
      • -
      • research director id properly gets overlays
      • -
      • Nanite extra settings display a bit better on the cloud controller
      • -
      • Boolean extra settings on nanites function properly
      • -
      • Extra settings on nanites copy properly instead of copying a literal ref
      • -
      -

      stylemistake updated:

      -
        -
      • Fixed recipe button layout in Chem Dispenser.
      • -
      • Fixed the icon on the "Save" button in Chem Dispenser.
      • -
      • ChemMaster no longer rounds volume of chemicals, allowing to package 0.1 unit pills.
      • -
      • Air Alarm layout will no longer jump around when microscopic amounts of gases are present (less than 0.01%).
      • -
      - -

      03 December 2019

      -

      Bumtickley00 updated:

      -
        -
      • Buffed granibitaluri to be a better top-off healer
      • -
      • Changed granibitaluri's recipe to be easier to make
      • -
      -

      Couls updated:

      -
        -
      • Birdboat can eat anything with plastic, but he'll choke on it! Keep him away from plastic.
      • -
      • (admin-spawned) mysterious water bottles now correctly have random reagent contents and show markings without runtiming
      • -
      -

      Firecage updated:

      -
        -
      • Mining Cyborgs are now able to choose which icon they want upon picking their module. Either the Lavaland Mining Cyborg icon, the Asteroid Mining Cyborg icon, or the Spider Mining Cyborg icon.
      • -
      • Mining Cyborg Lavaproof Tracks upgrade is renamed to Mining Cyborg Lavaproof Chassis.
      • -
      • Dead Goliath Broodmother no longer constantly spawns tentacles around them.
      • -
      • Mobs which can metabolize reagents can now properly metabolize crayon powder.
      • -
      -

      GuillaumePrata updated:

      -
        -
      • The pimpin ride hook now holds the trashbag open for easier trash disposal.
      • -
      -

      Indie-ana Jones updated:

      -
        -
      • Xenobiologists have noted a change in results from the gold slime core's reaction. Creatures previously thought to be useless are also notably more unique than before.
      • -
      -

      Ryll/Shaps updated:

      -
        -
      • You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
      • -
      -

      Skoglol updated:

      -
        -
      • Bureaucratic error event has new effects!
      • -
      • Admins can now pick solo abductor in traitor panel.
      • -
      • Ian has found a comfier spawnpoint on metastation.
      • -
      -

      TheVekter updated:

      -
        -
      • Reworked the entrance to Engineering on PubbyStation to give Atmos techs access to the techfab on non-skeleton shift rounds.
      • -
      -

      actioninja updated:

      -
        -
      • All nanite interfaces have been completely reworked for tgui-next
      • -
      • Plumbing Reaction Chamber uses tgui-next
      • -
      • A couple of the other plumbing uis now use the Input component of tgui-next instead of having popup windows
      • -
      • fixes some drinks such as lizard wine being uncraftable
      • -
      -

      bobbahbrown updated:

      -
        -
      • References to IRC now better describe TGS' and Discord's existence.
      • -
      • Players will now be better informed that messages are sent through TGS to IRC/Discord/etc when attempting to adminhelp with no available admins/use adminwho verb.
      • -
      -

      fludd12 updated:

      -
        -
      • The pestle for the mortar and pestle now needs metal to craft, not plasteel.
      • -
      • The mortar and pestle can now grind food and such.
      • -
      -

      nemvar updated:

      -
        -
      • Wormhole jaunters work again.
      • -
      -

      nightred updated:

      -
        -
      • Scanner Gate uses TGUI-NEXT now
      • -
      -

      oranges updated:

      -
        -
      • Budget payouts are gone
      • -
      • Felinids no longer react to cocoa
      • -
      -

      plapatin updated:

      -
        -
      • adds glockroaches, try getting them from gold slime reactions. if that guy from event hall i was talking with is reading this, i made this for you.
      • -
      -

      spookydonut updated:

      -
        -
      • jungle fever monkeys now speak monkey
      • -
      • TRAIT_NOMETABOLISM species are now immune to clone damage
      • -
      -

      zxaber updated:

      -
        -
      • Heads of staff can now connect to holopads without the other side answering the call.
      • -
      • Secure holopads, which do not allow auto-connect, have replaced holopads in a very small number of places.
      • -
      • Placements of holopads in various areas on various stations have been slightly adjusted.
      • -
      • Holopads now ping when a connection from another pad is established.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index bb3399bae10..2783906904d 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -36888,3 +36888,297 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - imageadd: fugu background fugu background zxaber: - bugfix: Positronics no longer have MMIs visually spawn on them. +2020-02-11: + ArcaneMusic: + - rscadd: Nanotrasen's research division has gone ahead and scratched all possible + plans of building new sleepers for the station, due to the discovery of old + sleepers injecting crew with lead acetate. + - rscadd: In unrelated news, the research division is proud to announce the all + new, "party pods"! Available at your local station B.E.P.I.S. platform as a + minor reward. + - bugfix: Wooden Plank Floors no longer runtime. + Arkatos: + - rscadd: Mining Vendor now uses tgui-next. + Bokkiewokkie: + - imageadd: adds box icons for tons of boxes. + - imageadd: changes the toy and shotgun ammo boxes so they're in the new art style. + Cloneby: + - balance: Strange Reagent now requires a set amount to revive dependent on patient + wellbeing and requires an excess to heal blood and organs. Does more damage + on life. Basically loses one-click wonder status UNLESS you give a considerable + amount and deal with the consequences. + Coconutwarrior97: + - bugfix: Fixes meta armory external camera by naming it properly. + - bugfix: AI can use the carp hologram again. + - bugfix: Fixes a typo in mind.dm . + Dennok: + - bugfix: Now nanites don't die from illusions and placing unpowered cable by bare + hands. + - bugfix: Now MultiZ Debug map has open space under floor instead of space. + Denton: + - tweak: Constructed display cases no longer spawn with an alarm that bolts all + nearby doors. + EOBGames: + - rscadd: The Beach Biodome Lavaland ruin has been revamped. Hit the beach and catch + some waves, brah! + - bugfix: Fixed a few minor map problems. + Fikou: + - rscadd: You can now make lassos with a bone and 5 sinew and make saddles from + 5 leather sheets, you can also tame goliaths with lavaland food (I think you + know what those 3 things mean together) + - tweak: xenos now keep their name consistent through evolutions + - bugfix: fixes humanoid xeno numbers being 0 + - tweak: royal xenos also get numbers + JJRcop: + - refactor: Defibs and Defibbing Nanites act the same way again. + - bugfix: Fixed removing brains from changeling husks. + Krysonism: + - rscadd: 4 new ice creams created using the crafting menu, + - rscadd: You can now make popsicle sticks by sticking logs in the processor. + Mickyan: + - tweak: Blood dripping frequency now scales with blood loss + - bugfix: Fixed blood decals occasionally containing more blood than they should + - tweak: The Delta Station stasis room has received a makeover + NoxVS: + - bugfix: Nanotrasen has properly relabeled all cyborg limbs following their rediscovery + of which direction is left and which is right + OnlineGirlfriend: + - imageadd: crushed can sprite for Sol Dry + - bugfix: Sol Dry cans can be crushed + - bugfix: salami filling color + - tweak: salami taste + Qustinnus: + - code_imp: there is now an edible component which will allow us to deprecate our + hacky methods of making things such as organs edible + RaveRadbury: + - bugfix: Removed latejoin prisoner option + ShizCalev: + - bugfix: Emitters will now remain anchored when being constructed from an anchored + machine frame. + - bugfix: Emitters will now properly turn off and be unwelded if unanchored via + varediting. + - bugfix: Unanchored emitters will no longer be pulled towards non-harmful simple + animals (ie butterflies, cats, ect) if they click on them. + - bugfix: Fixed a scenario where emitters could start welded and be turned on, but + were not properly anchored to the ground. + - bugfix: Fixed a scenario where emitters could start anchored to the ground, but + had to be resecured with a wrench to get them to work properly. + - code_imp: Emitters now properly use the anchored var. The state var has been renamed + to welded, and only tracks welded status. + - code_imp: The anchored emitter map subtype has been changed to a fully welded + one, since all utilized instances were editted to be welded as well anyway. + - rscadd: Added a bit more examine feedback to emitters. + - bugfix: Emitters will now show how often they fire a little more accurately. + - bugfix: Attacking the Supermatter crystal with a NODROP item (ie cyborgs with + literally any item, ninjas, highlanders, ect) will now dust the user. + - bugfix: Fixed spell books becoming unreadable if you moved while reading them. + - bugfix: Fixed progress bars not showing up for spell books. + - bugfix: Fixed an exploit where spell books didn't always have to be in your hand + to finish reading them. + Skoglol: + - rscdel: Removes cloning from the codebase. Cloning rooms have been converted to + temporary wards and storage. Experimental cloner and its ruin is also gone. + - balance: Replica pod seed availability reduced. No longer available in megaseed + vendors, seed crate contains one seed down from three. Mutate some cabbages + if you want these. + - bugfix: Say should be less likely to break when under heavy server strain. + - balance: Brain death is no longer a thing, no arbitrary unhealable death. Uses + organ damage like the rest. + - bugfix: Brains can now be attacked again. + - bugfix: Brains no longer report you SSD if you are in the brain and not ghosted + out. + - balance: Brains healed with mannitol now heal 2 damage per unit at a 10 unit minimum, + instead of a flat 10 damage for any amount over 10 units. + - spellcheck: Defib faliure feedback is now more clear and hints at how to fix it. + - tweak: Defibs now force the ghost back. + - spellcheck: Improved brain feedback, no longer reports SSD. + - balance: Stomach pump and brain surgery are now repeatable surgeries. + - code_imp: Removed some forgotten references to defib time of death restrictions. + - bugfix: Beakers should no longer nullspace when quick swapped or alt clicked out + of certain pieces of machinery. + - balance: Traitor adrenals buffed slightly. Now removes knockdown on activation, + increases speed slightly more and has no oxyloss damage. + - balance: Changeling adrenals now last 20 seconds, up from 15 seconds. + - bugfix: Dynamic revs runtime and infinite loss announcement fixed. + SteelSlayer: + - code_imp: Adds the dunkable element. Converts items who were using the dunkable + var to instead use this element and removes the dunkable var. + - code_imp: Adds a new "DUNKABLE" reagent flag for reagent containers. This determines + whether or not the container can have items dunked into it. + TheChosenEvilOne: + - bugfix: Foamy beer stationwide event works again. + Thebleh: + - tweak: Bodies with souls show the defib icon on medhuds. + Tlaltecuhtli: + - bugfix: grinder chem not grinding + - bugfix: dir of grinder chem + Vondiech: + - tweak: There is no longer a light fixture attached to an airlock in the Experimentation + Lab on Metastation. + armhulen fikou gang: + - imageadd: a lot of >32x32 mobs now have icons for their health dolls + cacogen: + - refactor: The abductor baton is now a child of the regular stun baton. There shouldn't + be a functional difference. + - tweak: You need to be an abductor to change baton modes. Seemed like an oversight + - spellcheck: Fixes some typos in the abductor baton's messages + - admin: Both regular stun baton and abductor baton have had a lot of vars exposed + pertaining to their functionality so that could come in handy I guess + - spellcheck: Cybernetic implant readouts on medHUD and health analyzer are more + compact and show an icon of each + improvedname: + - tweak: Chamkits now include an chameleon belt + imsxz: + - tweak: skateboards now buckle you after activating them in hand. + itseasytosee: + - rscadd: Three more toys to find in your local arcade cabinet! Squeaky brain, trick + blindfold, and a broken radio. Collect em all! + - bugfix: Plasmamen prisoners now use the proper helmet sprite. + - bugfix: Pacifists can now use the wand of nothing. + - bugfix: Shotgun in hands are no longer broken. + - rscadd: An ancient recipe for the ultimate soap can be had by janitors that carry + family heirlooms and those who crawl maintenance. + nightred: + - bugfix: plastic water bottles can now spash + - bugfix: plastic water bottle caps render properly the first time + - bugfix: Fixes pulling button location on simple mobs + - bugfix: Polymorph kicks AI's out of shells + - refactor: Changed custom material output on examine to be on a single line + optimumtact: + - tweak: lawyer's department backpack... is a backpack again + peoplearestrange: + - rscdel: Removed Special Verbs Tab + - admin: New admin button Tabs + wesoda25: + - tweak: You will now cough if you have lung damage (no stun). + zxaber: + - balance: It is now possible to use an actual defibrillator unit as a stand-in + for the borg defib upgrade, allowing medical borgs to revive crew without cloning + at shift start. + - spellcheck: Borgs now get a message when receiving any upgrade. +2020-02-13: + Arkatos: + - tweak: HUDs for various simple mobs are now cleaner and consistent with each other. + Buggy123: + - tweak: Beware! The Syndicate have upgraded their stolen teleportation machinery, + they are now capable of providing reinforcements to their elite operatives nearly + anywhere, even in the middle of combat! Not that that would be wise, to say + the least. + Dennok: + - bugfix: After rigorous training, Nanotrasen zoologists have observed a rise in + the level of effectiveness with which non-sentient monkeys utilise certain hand-to-hand + weapons. + Denton: + - admin: Moved duplicate CID/IP logging from log_access to log_admin_private. + Dingo-Dongler: + - rscadd: Examining people with sechuds will let you give someone an on the spot + citation. + MMMiracles: + - tweak: Multi-Z power relays can repaired but must be manually updated with a multi-tool + when reinstalling/moving around. + PKPenguin321: + - rscadd: Salt piles now get kicked around and eventually scattered to the wind + when ran over too much. + Skoglol: + - admin: Initial ahelps are now multiline too. + - bugfix: Contractor tablet should now properly let you shop for rep. + Tlaltecuhtli: + - rscadd: adds medipen refiller machine + cacogen: + - tweak: Swapped positions of Meta Morgue and chem factory + - tweak: Resized the space now taken up by Meta chem factory to be slightly larger + - tweak: Made Meta Morgue smaller + - tweak: Moved Meta maint bar above the new Morgue where rest of the chem factory + was + - tweak: Moved Meta medbay alcove with NanoMed to opposite side of hall + - tweak: Moved Meta Medical Surplus Storeroom above Virology, off maint across from + alcove + - rscadd: Two new Meta maint Storage Rooms beneath robotics + - tweak: Unanchored solar assemblies go off-centre to indicate they need securing. + Secured ones centre themselves + ike709: + - bugfix: Taking pictures of openspace turfs works now. + itseasytosee: + - bugfix: atmos helmets now properly protect you from pepper spray and face-huggers. + nemvar: + - bugfix: Fixed an issue where unstable people could regain sanity. + nightred: + - rscadd: Hugs are warm now + - refactor: natural_bodytemperature_stabilization is now self contained. + - refactor: adjust_bodytemperature to allow the use of insulation and change steps +2020-02-14: + Arkatos: + - rscadd: Infrared emitter now uses tgui-next. + - rscadd: Proximity sensor now uses tgui-next. + - bugfix: Geneticist now uses science selection color in the preferences menu. + Capsandi: + - spellcheck: Fixed grammar in death-nettle attack and pickup messages + EOBGames: + - rscadd: The Lavaland Gulag has been rebuilt following repeated complaints about + 'human rights violations'. + - rscadd: A hawaiian shirt, currently only in the beach bum ruin. + - tweak: Fixed a couple of issues with the beach bum ruin. + Fikou: + - config: the nuke op leader having access to the war declaration item is now a + config + Mickyan: + - tweak: Headphones can now play custom music + - tweak: Moved headphones to the games vendor in the library + - code_imp: Added support for instruments with custom effects triggered by playing + Putnam and ninjanomnom: + - balance: Radioactive contamination now has a limited amount of material to be + used to contaminate things. + Ryll/Shaps: + - rscadd: You can now sabotage secways by stuffing a banana in their tailpipe. + actioninja: + - bugfix: Traitor Uplink buy buttons properly disable when you don't have enough + TC again + cacogen: + - bugfix: Soil no longer renames itself hydroponics tray while something is planted + in it + - bugfix: Hydroponics planter names will update when weeds are mutated + - rscdel: Planters no longer change description to match that of what's planted + in them + necromanceranne: + - rscadd: A mech support bag. + - rscadd: Combat wrench. + - balance: Made the dark gygax significantly better by adjusting equipment and stats. + nemvar: + - rscadd: Replaced the effect of the "two left feet" mutation with random knockdowns + while moving. +2020-02-15: + BadSS13Player: + - tweak: The Exosuit Fabricator's sync with R&D operation is now instant. + Buggy123: + - tweak: Random mineral turfs no longer cause large amounts of turf changes on initialization. + Cobby: + - balance: Buffs Surgery XP values + Krysonism: + - rscadd: The Cosa Nostra starter pack has been added to cargo as a contraband + crate. + - rscadd: Added pictures of the virgin mary, burning one of these will let you pick + a mafia nickname. + - rscadd: The beige suit, beige fedora and white fedora clothing items have been + added to the game. + - imageadd: The non-job fedoras and the white suit have been resprited. + Skoglol: + - spellcheck: Unhusking someone with synthflesh will no longer tell everyone they + were the one to fix the corpse. + XDTM: + - bugfix: Fixed nanite shutdown timer not properly shutting down nanites. + actioninja: + - rscadd: 'tgui-next for NTOS: AI restorer, File Manager, NetDOS, Net Monitor, and + Revelation' + - rscdel: Creation of TXT Files on modular computer has been indefinitely removed + - rscdel: Due to architecture concerns, NTNet Transfer has been indefinitely removed + from NTOS hardware. + nianjiilical: + - rscadd: Some weird shit happened in space, and now Ethereals are appearing in + new colors. Scientists are baffled. + nightred: + - rscadd: Space Suits warm the wearer, and use Cells + - rscadd: Suit Storage charges Space Suits + - rscadd: EMP's cause Hard Suit's to burn the wearer + - rscadd: Engineering now has emp proof cells with the suits + - rscadd: Hud status for space suit power level + - rscadd: ERT hardsuits get EMP protection AND ONLY THEM diff --git a/html/changelogs/AutoChangeLog-pr-48805.yml b/html/changelogs/AutoChangeLog-pr-48805.yml deleted file mode 100644 index 750c8a9d5bf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-48805.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "zxaber" -delete-after: True -changes: - - balance: "It is now possible to use an actual defibrillator unit as a stand-in for the borg defib upgrade, allowing medical borgs to revive crew without cloning at shift start." - - spellcheck: "Borgs now get a message when receiving any upgrade." diff --git a/html/changelogs/AutoChangeLog-pr-48836.yml b/html/changelogs/AutoChangeLog-pr-48836.yml new file mode 100644 index 00000000000..25827dff890 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-48836.yml @@ -0,0 +1,4 @@ +author: "Fikou" +delete-after: True +changes: + - refactor: "glockroach" diff --git a/html/changelogs/AutoChangeLog-pr-48996.yml b/html/changelogs/AutoChangeLog-pr-48996.yml new file mode 100644 index 00000000000..5de8ede8768 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-48996.yml @@ -0,0 +1,4 @@ +author: "yeeyeh" +delete-after: True +changes: + - rscadd: "Nanotrasen's research division's recent science fair has given light to an amazing, electrically-insulated compound that can be sprayed directly onto the skin. The initial idea was for footwear, but we all know what you're really going to do with it. Research can be continued at your station's B.E.P.I.S. unit." diff --git a/html/changelogs/AutoChangeLog-pr-49067.yml b/html/changelogs/AutoChangeLog-pr-49067.yml new file mode 100644 index 00000000000..6779eb70c39 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49067.yml @@ -0,0 +1,7 @@ +author: "Time-Green" +delete-after: True +changes: + - rscadd: "Adds geysers to lavaland! They can be activated by using a reinforced plunger found in the medical vendor. They can be harvested by using a new plumbing device, magically powered liquid pumps!" + - rscadd: "Adds Hollow Water to geysers, wich can be combined with Holy Water as catalyst for more Holy Water" + - rscadd: "Adds Protozine to geyers, a very weak version of Omnizine. Can be used in Strange Reagent mixing" + - rscadd: "Adds Wittel, a very rare geyser chem. Can be processed into gravitum, wich removes gravity. Can also be processed into metalgen, wich has a strange tendency to transform objects into the imprinted material." diff --git a/html/changelogs/AutoChangeLog-pr-49081.yml b/html/changelogs/AutoChangeLog-pr-49081.yml new file mode 100644 index 00000000000..0da6c6eef3f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49081.yml @@ -0,0 +1,6 @@ +author: "with thanks to HugBug and Buggy for helping with bug-squashing" +delete-after: True +changes: + - balance: "The effect of gas comp will now spin up and down, rather then jumping. Play around, don't break anything." + - bugfix: "Fixed low pressure hell SMs" + - admin: "Allows var editing of SM gas rad effects" diff --git a/html/changelogs/AutoChangeLog-pr-49103.yml b/html/changelogs/AutoChangeLog-pr-49103.yml new file mode 100644 index 00000000000..2ae11a12d35 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49103.yml @@ -0,0 +1,6 @@ +author: "necromanceranne" +delete-after: True +changes: + - balance: "Removes the stun from Krav Maga and makes it a high duration knockdown with stamina damage (20-30), respecting chest armor for the damage." + - rscadd: "Disarm intent is now a nonlethal jab that does (5-10) stamina damage. If used on people who are prone, it does (10-15) stamina damage. It also has a chance to completely disarm someone based on the amount of stamina damage they have." + - balance: "Krav Maga harm stomps/punches now respect armor and have a variance of (5-10) for punches and (5-10+5) for stomps." diff --git a/html/changelogs/AutoChangeLog-pr-49120.yml b/html/changelogs/AutoChangeLog-pr-49120.yml new file mode 100644 index 00000000000..1c2fa7f5686 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49120.yml @@ -0,0 +1,4 @@ +author: "Mickyan" +delete-after: True +changes: + - rscadd: "Added the broom. For sweeping." diff --git a/html/changelogs/AutoChangeLog-pr-49126.yml b/html/changelogs/AutoChangeLog-pr-49126.yml deleted file mode 100644 index 553bc184f15..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - bugfix: "Beakers should no longer nullspace when quick swapped or alt clicked out of certain pieces of machinery." diff --git a/html/changelogs/AutoChangeLog-pr-49140.yml b/html/changelogs/AutoChangeLog-pr-49140.yml deleted file mode 100644 index 2eb49d5efaf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49140.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Skoglol" -delete-after: True -changes: - - balance: "Traitor adrenals buffed slightly. Now removes knockdown on activation, increases speed slightly more and has no oxyloss damage." - - balance: "Changeling adrenals now last 20 seconds, up from 15 seconds." diff --git a/html/changelogs/AutoChangeLog-pr-49178.yml b/html/changelogs/AutoChangeLog-pr-49178.yml deleted file mode 100644 index 2e60651bcee..00000000000 --- a/html/changelogs/AutoChangeLog-pr-49178.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "optimumtact" -delete-after: True -changes: - - tweak: "lawyer's department backpack... is a backpack again" diff --git a/html/changelogs/AutoChangeLog-pr-49186.yml b/html/changelogs/AutoChangeLog-pr-49186.yml new file mode 100644 index 00000000000..90def2e00ff --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49186.yml @@ -0,0 +1,5 @@ +author: "ArcaneMusic" +delete-after: True +changes: + - rscadd: "A new space ruin has been located in your sector. The previous owners have dubbed the place \"The Hell Factory\", despite the region being designated as an alcohol bottling facility." + - bugfix: "Fixes accidentally reverting the puzzles/trapmaking tools PR." diff --git a/html/changelogs/AutoChangeLog-pr-49237.yml b/html/changelogs/AutoChangeLog-pr-49237.yml new file mode 100644 index 00000000000..66a6626171a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49237.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - refactor: "Stasis now supports multiple sources." diff --git a/html/changelogs/AutoChangeLog-pr-49319.yml b/html/changelogs/AutoChangeLog-pr-49319.yml new file mode 100644 index 00000000000..556e3da6c47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49319.yml @@ -0,0 +1,6 @@ +author: "JAremko" +delete-after: True +changes: + - rscadd: "Added pyroclastic anomaly slime policy key" + - bugfix: "Fixed anomaly slime role" + - bugfix: "Now anomaly slimes can reproduce like other slimes do" diff --git a/html/changelogs/AutoChangeLog-pr-49335.yml b/html/changelogs/AutoChangeLog-pr-49335.yml new file mode 100644 index 00000000000..0b98d486aa9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49335.yml @@ -0,0 +1,4 @@ +author: "Bokkiewokkie" +delete-after: True +changes: + - bugfix: "Fixes writing being on paper bags and some ammo boxes" diff --git a/html/changelogs/AutoChangeLog-pr-49336.yml b/html/changelogs/AutoChangeLog-pr-49336.yml new file mode 100644 index 00000000000..3e6db9602c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49336.yml @@ -0,0 +1,4 @@ +author: "Arkatos" +delete-after: True +changes: + - tweak: "Added broken chameleon belt to the broken chameleon kit." diff --git a/html/changelogs/AutoChangeLog-pr-49339.yml b/html/changelogs/AutoChangeLog-pr-49339.yml new file mode 100644 index 00000000000..11ffc496e98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49339.yml @@ -0,0 +1,4 @@ +author: "Dennok" +delete-after: True +changes: + - bugfix: "Now MultiZ Debug connected to neighbor space, in strange way." diff --git a/html/changelogs/AutoChangeLog-pr-49358.yml b/html/changelogs/AutoChangeLog-pr-49358.yml new file mode 100644 index 00000000000..e19f9e08e53 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49358.yml @@ -0,0 +1,4 @@ +author: "Thunder12345" +delete-after: True +changes: + - imageadd: "Added missing attached tank sprites for TTVs" diff --git a/html/changelogs/AutoChangeLog-pr-49359.yml b/html/changelogs/AutoChangeLog-pr-49359.yml new file mode 100644 index 00000000000..8471ed5d8f1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49359.yml @@ -0,0 +1,4 @@ +author: "nightred" +delete-after: True +changes: + - tweak: "Turn night mode off or on when the APC is locked" diff --git a/html/changelogs/AutoChangeLog-pr-49375.yml b/html/changelogs/AutoChangeLog-pr-49375.yml new file mode 100644 index 00000000000..c4f41bc13dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49375.yml @@ -0,0 +1,4 @@ +author: "Capsandi" +delete-after: True +changes: + - imageadd: "added a new mortar sprite" diff --git a/html/changelogs/AutoChangeLog-pr-49386.yml b/html/changelogs/AutoChangeLog-pr-49386.yml new file mode 100644 index 00000000000..618008a04c0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-49386.yml @@ -0,0 +1,4 @@ +author: "EOBGames" +delete-after: True +changes: + - bugfix: "A few minor map fixes." diff --git a/icons/mob/actions/actions_spacesuit.dmi b/icons/mob/actions/actions_spacesuit.dmi new file mode 100644 index 00000000000..0b77ed77335 Binary files /dev/null and b/icons/mob/actions/actions_spacesuit.dmi differ diff --git a/icons/mob/augmentation/augments.dmi b/icons/mob/augmentation/augments.dmi index 574a5ddc483..5b5f07f8616 100644 Binary files a/icons/mob/augmentation/augments.dmi and b/icons/mob/augmentation/augments.dmi differ diff --git a/icons/mob/clothing/ears.dmi b/icons/mob/clothing/ears.dmi index 7a2462874f0..ea00f5d1f8a 100644 Binary files a/icons/mob/clothing/ears.dmi and b/icons/mob/clothing/ears.dmi differ diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index 2045f7e88ff..6b9acf9fdd3 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index c493483ce13..09966df4ec3 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 7c6b325808c..f0ad20bcdc0 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 9bd6467e2d2..ad44ec0d311 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 009c8413048..522d9540657 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/suits.dmi b/icons/mob/clothing/under/suits.dmi index 2c3164114f2..1fb5f559bfe 100644 Binary files a/icons/mob/clothing/under/suits.dmi and b/icons/mob/clothing/under/suits.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 56bfaf7178b..40d325eaed9 100644 Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi index 1c3f09b6294..c361d7157d3 100644 Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi index 9505e18d871..2c9f34af2e1 100644 Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi index 499d94ae1ef..f166ba6076b 100644 Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index 030d0db9d1d..b68526f472f 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 37d53c92bdd..6bcfce314e2 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/screen_elite.dmi b/icons/mob/screen_elite.dmi index f407fb79e41..115b1b0c0cb 100644 Binary files a/icons/mob/screen_elite.dmi and b/icons/mob/screen_elite.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 798d9ad7730..fd5acf71b44 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/screen_slime.dmi b/icons/mob/screen_slime.dmi index b9bc909c7ac..19bc7e1f737 100644 Binary files a/icons/mob/screen_slime.dmi and b/icons/mob/screen_slime.dmi differ diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 9cbc0856243..903449726cf 100644 Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ diff --git a/icons/obj/blackmarket.dmi b/icons/obj/blackmarket.dmi index 99f4811ea6b..7dcbe31fa63 100644 Binary files a/icons/obj/blackmarket.dmi and b/icons/obj/blackmarket.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 717d8dd574e..38ce95b8c0e 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 09ef91de788..e1968cde991 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 5946966d24d..e599a0a948c 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/glasses.dmi b/icons/obj/clothing/glasses.dmi index 301a32753eb..b88c84c4e6c 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index a90efcdfea1..7a3d72c8841 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 9f03c75982b..7188896730a 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 78d47339cff..d7f041a3948 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/under/suits.dmi b/icons/obj/clothing/under/suits.dmi index f8e24376713..734d21f9d57 100644 Binary files a/icons/obj/clothing/under/suits.dmi and b/icons/obj/clothing/under/suits.dmi differ diff --git a/icons/obj/doors/doorpuzzle.dmi b/icons/obj/doors/doorpuzzle.dmi new file mode 100644 index 00000000000..ec4fbed514b Binary files /dev/null and b/icons/obj/doors/doorpuzzle.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index b2a2037a11c..6329dbe3791 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 9ba5f759413..fc15ca37181 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food/frozen_treats.dmi b/icons/obj/food/frozen_treats.dmi new file mode 100644 index 00000000000..81a230a8634 Binary files /dev/null and b/icons/obj/food/frozen_treats.dmi differ diff --git a/icons/obj/food/snowcones.dmi b/icons/obj/food/snowcones.dmi deleted file mode 100644 index bb098dd390e..00000000000 Binary files a/icons/obj/food/snowcones.dmi and /dev/null differ diff --git a/icons/obj/guns/toy.dmi b/icons/obj/guns/toy.dmi index 01240245903..edf584b6eee 100644 Binary files a/icons/obj/guns/toy.dmi and b/icons/obj/guns/toy.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 79b0a9b76c9..fc2e4fc61f9 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 6c97422ccb8..501370f823c 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 5c9a31cf740..b1c69776188 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/cloning.dmi b/icons/obj/machines/cloning.dmi index de68060740e..a32fd11627b 100644 Binary files a/icons/obj/machines/cloning.dmi and b/icons/obj/machines/cloning.dmi differ diff --git a/icons/obj/machines/medipen_refiller.dmi b/icons/obj/machines/medipen_refiller.dmi new file mode 100644 index 00000000000..300d218d2d7 Binary files /dev/null and b/icons/obj/machines/medipen_refiller.dmi differ diff --git a/icons/obj/machines/sleeper.dmi b/icons/obj/machines/sleeper.dmi index ff4c7cbdcb5..384b4e3044b 100644 Binary files a/icons/obj/machines/sleeper.dmi and b/icons/obj/machines/sleeper.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 9175252cd39..615621fcce3 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/puzzle_small.dmi b/icons/obj/puzzle_small.dmi new file mode 100644 index 00000000000..e9dc82925aa Binary files /dev/null and b/icons/obj/puzzle_small.dmi differ diff --git a/icons/obj/smooth_structures/rollingtable.dmi b/icons/obj/smooth_structures/rollingtable.dmi new file mode 100644 index 00000000000..9e559a75d94 Binary files /dev/null and b/icons/obj/smooth_structures/rollingtable.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index ac12e293d22..291b29a3ffe 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 2259f47dc5c..ba68af7e673 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index f994f31168e..f58870cb5ee 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 38283d45e29..ff49753f22b 100644 Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ diff --git a/sound/effects/stall.ogg b/sound/effects/stall.ogg new file mode 100644 index 00000000000..8d152076767 Binary files /dev/null and b/sound/effects/stall.ogg differ diff --git a/sound/items/radiostatic.ogg b/sound/items/radiostatic.ogg new file mode 100644 index 00000000000..6b5fa00cc06 Binary files /dev/null and b/sound/items/radiostatic.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 2fcdfad3fea..e8fec3070db 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -34,7 +34,6 @@ #include "code\__DEFINES\cleaning.dm" #include "code\__DEFINES\colors.dm" #include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" #include "code\__DEFINES\configuration.dm" #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\contracts.dm" @@ -114,6 +113,9 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\flags.dm" +#include "code\__DEFINES\dcs\helpers.dm" +#include "code\__DEFINES\dcs\signals.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -382,6 +384,7 @@ #include "code\datums\components\decal.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\earprotection.dm" +#include "code\datums\components\edible.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\empprotection.dm" #include "code\datums\components\explodable.dm" @@ -518,6 +521,7 @@ #include "code\datums\elements\bsa_blocker.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\digitalcamo.dm" +#include "code\datums\elements\dunkable.dm" #include "code\datums\elements\earhealing.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\forced_gravity.dm" @@ -680,7 +684,6 @@ #include "code\game\machinery\Beacon.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\defibrillator_mount.dm" @@ -689,7 +692,6 @@ #include "code\game\machinery\dna_scanner.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\droneDispenser.dm" -#include "code\game\machinery\exp_cloner.dm" #include "code\game\machinery\fat_sucker.dm" #include "code\game\machinery\firealarm.dm" #include "code\game\machinery\flasher.dm" @@ -705,6 +707,7 @@ #include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\medical_kiosk.dm" +#include "code\game\machinery\medipen_refiller.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\newscaster.dm" #include "code\game\machinery\PDApainter.dm" @@ -744,7 +747,6 @@ #include "code\game\machinery\computer\camera.dm" #include "code\game\machinery\computer\camera_advanced.dm" #include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" #include "code\game\machinery\computer\communications.dm" #include "code\game\machinery\computer\crew.dm" #include "code\game\machinery\computer\dna_console.dm" @@ -938,6 +940,7 @@ #include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" +#include "code\game\objects\items\puzzle_pieces.dm" #include "code\game\objects\items\RCD.dm" #include "code\game\objects\items\RCL.dm" #include "code\game\objects\items\religion.dm" @@ -1126,6 +1129,7 @@ #include "code\game\objects\structures\noticeboard.dm" #include "code\game\objects\structures\petrified_statue.dm" #include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\railings.dm" #include "code\game\objects\structures\reflector.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\showcase.dm" @@ -2232,7 +2236,6 @@ #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" #include "code\modules\mob\living\simple_animal\friendly\dog.dm" #include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" @@ -2270,11 +2273,11 @@ #include "code\modules\mob\living\simple_animal\hostile\bees.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\cockroach.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\glockroach.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" @@ -2371,7 +2374,6 @@ #include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" #include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" #include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" #include "code\modules\modular_computers\file_system\programs\powermonitor.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" @@ -2773,11 +2775,11 @@ #include "code\modules\ruins\spaceruin_code\bigderelict1.dm" #include "code\modules\ruins\spaceruin_code\caravanambush.dm" #include "code\modules\ruins\spaceruin_code\clericsden.dm" -#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" #include "code\modules\ruins\spaceruin_code\crashedclownship.dm" #include "code\modules\ruins\spaceruin_code\crashedship.dm" #include "code\modules\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hellfactory.dm" #include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" #include "code\modules\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\ruins\spaceruin_code\oldstation.dm" diff --git a/tgui-next/packages/tgui/components/Button.js b/tgui-next/packages/tgui/components/Button.js index 5ed0c8648bc..e4ff945d1a3 100644 --- a/tgui-next/packages/tgui/components/Button.js +++ b/tgui-next/packages/tgui/components/Button.js @@ -138,8 +138,10 @@ export class ButtonConfirm extends Component { render() { const { - confirmMessage = "Confirm?", + confirmContent = "Confirm?", confirmColor = "bad", + confirmIcon, + icon, color, content, onClick, @@ -147,7 +149,8 @@ export class ButtonConfirm extends Component { } = this.props; return (