diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 9b7ca819cc..639d63772c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -49,7 +49,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "as" = ( @@ -70,7 +70,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "at" = ( @@ -89,7 +89,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "au" = ( @@ -129,7 +129,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ay" = ( @@ -149,7 +149,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "az" = ( @@ -170,7 +170,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aA" = ( @@ -190,7 +190,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aB" = ( @@ -209,7 +209,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aC" = ( @@ -225,7 +225,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aD" = ( @@ -242,7 +242,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aE" = ( @@ -261,7 +261,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aF" = ( @@ -282,7 +282,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aG" = ( @@ -301,7 +301,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aH" = ( @@ -321,7 +321,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aI" = ( @@ -341,7 +341,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aJ" = ( @@ -368,7 +368,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aL" = ( @@ -394,7 +394,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aO" = ( @@ -415,7 +415,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aP" = ( @@ -448,7 +448,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aU" = ( @@ -472,7 +472,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aW" = ( @@ -493,7 +493,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aX" = ( @@ -522,7 +522,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "aZ" = ( @@ -542,7 +542,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ba" = ( @@ -559,7 +559,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bb" = ( @@ -588,7 +588,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bd" = ( @@ -631,7 +631,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bg" = ( @@ -732,7 +732,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bt" = ( @@ -758,7 +758,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bx" = ( @@ -775,7 +775,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "by" = ( @@ -792,7 +792,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bz" = ( @@ -817,7 +817,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bB" = ( @@ -825,7 +825,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bC" = ( @@ -846,7 +846,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bD" = ( @@ -872,7 +872,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bH" = ( @@ -881,7 +881,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bI" = ( @@ -899,7 +899,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bK" = ( @@ -918,7 +918,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bL" = ( @@ -942,7 +942,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bP" = ( @@ -970,8 +970,8 @@ /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bT" = ( -/obj/item/slime_extract/rainbow, /obj/structure/table/glass, +/obj/item/reagent_containers/spray/waterflower/superlube, /turf/open/floor/carpet, /area/ruin/powered/clownplanet) "bU" = ( @@ -989,7 +989,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bY" = ( @@ -999,7 +999,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "bZ" = ( @@ -1008,7 +1008,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "ca" = ( @@ -1018,7 +1018,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "cc" = ( @@ -1052,7 +1052,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dC" = ( @@ -1075,7 +1075,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dD" = ( @@ -1097,7 +1097,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dE" = ( @@ -1120,7 +1120,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dF" = ( @@ -1175,7 +1175,7 @@ }, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dK" = ( @@ -1202,7 +1202,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "dO" = ( @@ -1211,7 +1211,7 @@ icon_state = "bananium"; name = "bananium floor"; sound = 'sound/effects/clownstep1.ogg'; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "eX" = ( @@ -1260,7 +1260,7 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/indestructible{ icon_state = "darkfull"; - wet = 8 + wet = 16 }, /area/ruin/powered/clownplanet) "KX" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index cf1b2c6835..53b12ca0bb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -616,6 +616,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-24" + }, /turf/open/floor/plasteel, /area/security/prison) "abB" = ( @@ -57136,9 +57139,7 @@ /turf/open/floor/plating, /area/maintenance/port) "hwu" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-24" - }, +/obj/machinery/vr_sleeper, /turf/open/floor/plasteel, /area/security/prison) "hEm" = ( @@ -57158,6 +57159,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"ihn" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/security/prison) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -85235,7 +85243,7 @@ aav aaL aaQ aaY -aav +ihn abE acg acJ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index e500c85640..d9d46066bf 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -16541,16 +16541,10 @@ /area/security/prison) "aId" = ( /obj/machinery/seed_extractor, -/obj/structure/cable/white{ - icon_state = "4-8" - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, /area/security/prison) "aIe" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -16568,9 +16562,6 @@ /obj/structure/cable/white{ icon_state = "2-4" }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -18952,25 +18943,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel, /area/security/prison) -"aMd" = ( -/obj/structure/table, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/security/prison) "aMe" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, /obj/structure/cable/white{ icon_state = "1-4" }, -/turf/open/floor/plating, +/turf/open/floor/plasteel, /area/security/prison) "aMf" = ( /obj/structure/easel, @@ -126743,6 +126720,10 @@ dir = 1 }, /area/science/circuit) +"gUV" = ( +/obj/item/twohanded/required/kirbyplants/random, +/turf/open/floor/plasteel, +/area/security/prison) "gVS" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/maid, @@ -126780,6 +126761,9 @@ dir = 10 }, /area/science/circuit) +"hlc" = ( +/turf/open/floor/plasteel, +/area/security/prison) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -127397,6 +127381,17 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"mvf" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/prison) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127418,6 +127413,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"mEy" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "mIi" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, @@ -127607,6 +127612,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"oNW" = ( +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "oOb" = ( /obj/structure/window/reinforced{ dir = 8 @@ -127710,6 +127722,18 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) +"pEq" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/security/prison) "pHf" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -127852,6 +127876,10 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"tmZ" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/security/prison) "twt" = ( /obj/machinery/vr_sleeper, /obj/effect/turf_decal/tile/neutral{ @@ -179430,10 +179458,10 @@ aaa aaa aaa aaa -aaa -ajr -aad -aad +aeH +aFm +aIc +aFm aFm aFm aFm @@ -179687,10 +179715,10 @@ aaa aaa aaa aaa -aaa -ajr -aaa -aad +aeH +aFm +mEy +bbt aFm aMc aNx @@ -179944,10 +179972,10 @@ aaa aaa aaa aaa -aaa -aad -aaa -aad +aeH +aFm +oNW +tmZ aFm aKV aNy @@ -180202,11 +180230,11 @@ aaa ajr ajr aad -aad -aaa -aad aFm -aMd +pEq +hlc +gUV +hlc aNz aPh aQZ @@ -180459,10 +180487,10 @@ aaa ajr aad aad -aad -aad -aad aFn +mvf +aJA +aJA aMe aNA aPi @@ -180717,7 +180745,7 @@ ajr aad aFm aFm -aIc +aFm aFm aFm aMf diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 522d9801ca..f72a787214 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -213,18 +213,12 @@ "aaG" = ( /obj/machinery/hydroponics/constructable, /obj/item/seeds/ambrosia, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, /turf/open/floor/plasteel, /area/security/prison) "aaH" = ( /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, @@ -394,30 +388,16 @@ /obj/item/canvas/twentythreeXtwentythree, /turf/open/floor/plasteel, /area/security/prison) -"abk" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/paper/guides/jobs/hydroponics, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/pen, -/obj/item/storage/crayons, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) "abl" = ( /obj/structure/table, /obj/machinery/computer/libraryconsole/bookmanagement, /turf/open/floor/plasteel, /area/security/prison) "abm" = ( -/obj/machinery/computer/arcade, /obj/machinery/computer/security/telescreen/entertainment{ pixel_y = 32 }, +/obj/machinery/vr_sleeper, /turf/open/floor/plasteel, /area/security/prison) "abn" = ( @@ -83303,6 +83283,13 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"ghT" = ( +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) "gnZ" = ( /obj/item/radio/intercom{ pixel_y = -30 @@ -83417,6 +83404,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"hYs" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -83528,6 +83524,10 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"jVj" = ( +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/security/prison) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -83819,6 +83819,17 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"odR" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/paper/guides/jobs/hydroponics, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/pen, +/obj/item/storage/crayons, +/turf/open/floor/plasteel, +/area/security/prison) "ohj" = ( /obj/item/integrated_electronics/analyzer, /obj/item/integrated_electronics/debugger, @@ -83924,6 +83935,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"pzu" = ( +/obj/structure/chair/stool, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "pCV" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84241,6 +84259,16 @@ /obj/machinery/vending/assist, /turf/open/floor/plasteel, /area/science/mixing) +"uEa" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + id_tag = "permahydro"; + name = "Recreation Module" + }, +/turf/open/floor/plasteel, +/area/security/prison) "uGW" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -106416,10 +106444,10 @@ aaa aaa aaf aaa -aaa -aaa -aaf -aaa +aax +aax +aaF +aax aax abj aaR @@ -106673,12 +106701,12 @@ aaa aaa aaf aaf -aaf -aaf -aaf -aaf aay -abk +odR +hYs +abC +uEa +hYs abC abC acr @@ -106930,13 +106958,13 @@ aaa aaa aaf aaa -aaa -aaf -aaa -aaa aax abl -abD +pzu +ghT +aax +jVj +aaR aaR aaI acF @@ -107189,7 +107217,7 @@ aaa aaa aax aax -aaF +aax aax aax abm diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 9ae92b26d4..d70bc0187b 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1181,19 +1181,6 @@ }, /turf/open/floor/plasteel/dark, /area/security/prison) -"aeI" = ( -/obj/machinery/seed_extractor, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "aeJ" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 @@ -1508,24 +1495,13 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "afr" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, /obj/machinery/light/small, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) -"afs" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /turf/open/floor/plasteel/cafeteria, /area/security/prison) "aft" = ( @@ -52882,6 +52858,19 @@ icon_state = "platingdmg3" }, /area/maintenance/department/security/brig) +"cJd" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "cJo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -53223,6 +53212,21 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"dqi" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "dqw" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "0"; @@ -55028,6 +55032,15 @@ /obj/item/clothing/glasses/regular, /turf/open/floor/plating, /area/maintenance/department/science) +"hyl" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "hzc" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -58617,6 +58630,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/explab) +"pED" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "pEL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -60956,6 +60975,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"vtz" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "vtT" = ( /turf/open/floor/plating, /area/maintenance/solars/port) @@ -62168,6 +62193,19 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"yff" = ( +/obj/machinery/vr_sleeper{ + icon_state = "sleeper"; + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "yfO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/tile/yellow, @@ -62184,6 +62222,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"yhs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "yjy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ @@ -81546,8 +81593,8 @@ aaa aaa adR aaa -abI -aaa +aem +aem aem aem aem @@ -81804,8 +81851,8 @@ aaa adR aaa aem -aem -aem +aeo +aeC aeT afn agy @@ -82060,9 +82107,9 @@ aaa aaa adR abI -aem -aeo -aeC +aen +aep +aeD aeU aeU afC @@ -82317,9 +82364,9 @@ aaa aaa adR aaa -aen -aep -aeD +aem +aeq +aeE aeU afo afD @@ -82574,9 +82621,9 @@ aaa aaa adR abI -aem -aeq -aeE +aen +aer +aeF aeU afp afE @@ -82831,9 +82878,9 @@ aaa aaa adR aaa -aen -aer -aeF +aem +aes +aeG aeV afq afF @@ -83088,10 +83135,10 @@ aaa aaa adR abI -aem -aes -aeG -aeU +aen +aet +aeH +vtz afo afG aeU @@ -83345,10 +83392,10 @@ aaa aaa adR aaa -aen -aet -aeH -aeH +aem +aeu +cJd +pED aeH afH aeH @@ -83603,8 +83650,8 @@ aaa adR abI aem -aeu -aeI +agy +agy lGp aeU aae @@ -83860,9 +83907,9 @@ aaa adR aaa aem -aem -aem aeW +yhs +hyl afr agy agc @@ -84116,11 +84163,11 @@ aaa aaa adR aaa -abI -aaa aem aeX -afs +dqi +yff +yff agy agd agp @@ -84372,8 +84419,6 @@ aaa aaa aaa aaa -aed -adR abI aem aem @@ -84385,6 +84430,8 @@ aem aem aem aem +aem +aem ahL ahL ahL @@ -84630,9 +84677,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +aed +adR +abI aaa aaa aaa diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm new file mode 100644 index 0000000000..085a64bf97 --- /dev/null +++ b/_maps/map_files/debug/multiz.dmm @@ -0,0 +1,10403 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"ac" = ( +/turf/open/space, +/area/space/nearstation) +"ad" = ( +/turf/closed/wall/r_wall, +/area/maintenance/department/bridge) +"ae" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"af" = ( +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"ag" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ah" = ( +/turf/closed/wall/r_wall, +/area/engine/atmos) +"ai" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aj" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"ak" = ( +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"al" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/plating, +/area/engine/atmos) +"am" = ( +/obj/machinery/atmospherics/components/unary/tank/air, +/turf/open/floor/plating, +/area/engine/atmos) +"an" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"ao" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ap" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aq" = ( +/obj/machinery/computer/monitor, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/engine/engineering) +"ar" = ( +/obj/structure/closet/secure_closet/engineering_welding, +/turf/open/floor/plasteel, +/area/engine/engineering) +"as" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/space/nearstation) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"au" = ( +/turf/open/openspace, +/area/space) +"av" = ( +/obj/structure/stairs{ + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"aw" = ( +/turf/open/floor/plating, +/area/engine/atmos) +"ax" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ay" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/engine/atmos) +"az" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"aA" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aC" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/space/nearstation) +"aD" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aE" = ( +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aF" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aI" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/gravity_generator) +"aJ" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/engine/gravity_generator) +"aK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"aL" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/engine/gravity_generator) +"aM" = ( +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plating, +/area/engine/atmos) +"aN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"aO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"aP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aQ" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aR" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aS" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/obj/item/airlock_painter, +/turf/open/floor/plating, +/area/engine/engineering) +"aT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aV" = ( +/obj/machinery/power/rtg/advanced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aW" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"aX" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/light, +/obj/structure/table, +/obj/item/analyzer, +/obj/item/wrench, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"aY" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"aZ" = ( +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"ba" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plating, +/area/engine/atmos) +"bb" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot{ + dir = 2 + }, +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/engine/atmos) +"bc" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + on = 1 + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bd" = ( +/obj/structure/table, +/obj/item/weldingtool/experimental, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/engine/engineering) +"be" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bf" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/turf/open/floor/plating, +/area/engine/engineering) +"bg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + dir = 8; + name = "Gravity Generator APC"; + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bi" = ( +/obj/machinery/gravity_generator/main/station, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/engine/gravity_generator) +"bj" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/atmos) +"bk" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/engine/atmos) +"bm" = ( +/obj/machinery/atmospherics/components/binary/valve/on{ + icon_state = "mvalve_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/atmos) +"bn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/atmos) +"bo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/table, +/obj/item/screwdriver/power, +/obj/item/crowbar/power, +/turf/open/floor/plating, +/area/engine/engineering) +"bp" = ( +/obj/machinery/light, +/obj/item/storage/box/lights/mixed, +/obj/item/lightreplacer, +/turf/open/floor/plating, +/area/engine/engineering) +"bq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"br" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"bs" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"bt" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bu" = ( +/turf/closed/wall/r_wall, +/area/bridge) +"bv" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/bridge) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"bx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"by" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"bz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bA" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"bB" = ( +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/structure/closet/jcloset, +/obj/structure/cable, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bC" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bD" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/secure_closet/captains, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bE" = ( +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bF" = ( +/obj/structure/closet/secure_closet/CMO, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bG" = ( +/obj/structure/table, +/obj/item/ammo_box/c10mm, +/obj/item/gun/ballistic/automatic/pistol, +/turf/open/floor/plasteel, +/area/bridge) +"bH" = ( +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd, +/turf/open/floor/plasteel, +/area/bridge) +"bI" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/bridge) +"bJ" = ( +/obj/structure/table, +/obj/item/card/id/captains_spare, +/turf/open/floor/plasteel, +/area/bridge) +"bK" = ( +/obj/structure/table, +/obj/item/storage/backpack/holding, +/turf/open/floor/plasteel, +/area/bridge) +"bL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bM" = ( +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bO" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/bridge) +"bP" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bR" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"bT" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"bU" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/structure/closet/firecloset/full, +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/entry) +"bV" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bW" = ( +/obj/structure/closet/secure_closet/hos, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bX" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/entry) +"bY" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"bZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/central) +"ca" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/bridge) +"cb" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cc" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ce" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cf" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ch" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ci" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/primary/central) +"cj" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ck" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cl" = ( +/obj/structure/cable, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cn" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"co" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cp" = ( +/obj/machinery/light, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/bridge) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"cr" = ( +/obj/machinery/light, +/turf/open/floor/plasteel{ + dir = 6 + }, +/area/bridge) +"cs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/primary/central) +"ct" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cu" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/bridge) +"cw" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cy" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cz" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"cB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"cC" = ( +/obj/machinery/door/airlock/glass, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cD" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/construction) +"cE" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/construction) +"cG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/hallway/secondary/entry) +"cH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cI" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/entry) +"cJ" = ( +/obj/structure/table, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/entry) +"cK" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cL" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cM" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/storage/firstaid/regular, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"cN" = ( +/turf/closed/wall/r_wall, +/area/construction) +"cO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/construction) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/construction) +"cQ" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/construction) +"cR" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/construction) +"cS" = ( +/turf/closed/wall/r_wall, +/area/storage/primary) +"cT" = ( +/obj/machinery/airalarm{ + frequency = 1439; + locked = 0; + pixel_y = 23 + }, +/obj/machinery/power/apc{ + dir = 8; + pixel_x = -25 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/storage/primary) +"cV" = ( +/obj/machinery/door/airlock/glass, +/turf/open/floor/plasteel, +/area/storage/primary) +"cW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cX" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"cY" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/construction) +"cZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/construction) +"da" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"db" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/construction) +"de" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"df" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/construction) +"dg" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/construction) +"dh" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/construction) +"di" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"dk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dl" = ( +/turf/open/floor/plating, +/area/storage/primary) +"dm" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dn" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"do" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dp" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dq" = ( +/obj/machinery/power/apc/auto_name/north, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"ds" = ( +/obj/machinery/power/deck_relay, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/storage) +"dx" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/storage/primary) +"dy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/construction) +"dA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dB" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/storage/primary) +"dC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dG" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"dH" = ( +/obj/effect/landmark/start, +/turf/open/floor/plasteel, +/area/storage/primary) +"dI" = ( +/obj/effect/landmark/latejoin, +/turf/open/floor/plasteel, +/area/storage/primary) +"dJ" = ( +/turf/open/floor/plasteel, +/area/storage/primary) +"dL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/construction) +"dM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/construction) +"dN" = ( +/obj/structure/table, +/turf/open/floor/plasteel, +/area/storage/primary) +"dO" = ( +/obj/structure/table, +/obj/machinery/light, +/obj/item/twohanded/fireaxe, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/storage/primary) +"dP" = ( +/obj/structure/table, +/obj/item/lightreplacer, +/turf/open/floor/plasteel, +/area/storage/primary) +"dQ" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/obj/item/storage/box/lights/tubes, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/storage/primary) +"dR" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"dS" = ( +/turf/open/floor/plasteel, +/area/engine/storage) +"dV" = ( +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"dW" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"dX" = ( +/turf/open/floor/plasteel{ + dir = 2 + }, +/area/hallway/secondary/service) +"dY" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eb" = ( +/turf/open/floor/plasteel, +/area/bridge) +"ec" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/bridge) +"ed" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ee" = ( +/turf/open/floor/plasteel{ + dir = 9 + }, +/area/hallway/secondary/service) +"ej" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"em" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"en" = ( +/turf/open/floor/plasteel{ + dir = 10 + }, +/area/hallway/secondary/service) +"eo" = ( +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"es" = ( +/obj/effect/turf_decal/stripes/asteroid/corner, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eu" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ey" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"ez" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"eC" = ( +/turf/open/openspace, +/area/maintenance/department/bridge) +"eD" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"eH" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eI" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eL" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eM" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 4 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eN" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eO" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"eV" = ( +/obj/structure/ladder, +/turf/open/floor/plasteel, +/area/engine/storage) +"fa" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"fo" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass, +/obj/structure/fans/tiny, +/turf/open/floor/plasteel, +/area/engine/storage) +"gK" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + icon_state = "connector_map-2"; + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/toxins, +/turf/open/floor/plating, +/area/construction) +"gW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"hi" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + icon_state = "inje_map-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"hm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/construction) +"ho" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"ij" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/plasteel, +/area/construction) +"ip" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/space) +"iu" = ( +/turf/open/openspace, +/area/hallway/secondary/service) +"iK" = ( +/turf/open/floor/plasteel{ + dir = 8 + }, +/area/hallway/secondary/service) +"jb" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"jA" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"jT" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/construction) +"jV" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/storage) +"kg" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"lu" = ( +/obj/effect/turf_decal/stripes/asteroid/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"mZ" = ( +/turf/open/floor/plasteel{ + dir = 4 + }, +/area/hallway/secondary/service) +"nx" = ( +/turf/open/openspace, +/area/space/nearstation) +"nz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"od" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"oh" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"on" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"oA" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"oJ" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"qo" = ( +/turf/open/openspace, +/area/engine/storage) +"qR" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 9 + }, +/turf/open/floor/plating, +/area/engine/storage) +"rd" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/openspace, +/area/engine/storage) +"sh" = ( +/turf/open/floor/plasteel{ + dir = 1 + }, +/area/hallway/secondary/service) +"sm" = ( +/obj/structure/stairs, +/turf/open/floor/plating, +/area/construction) +"sE" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"td" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"vt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"vF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/table, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/rcd_ammo/large, +/obj/item/construction/rcd/combat/admin, +/turf/open/floor/plasteel, +/area/construction) +"xr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel, +/area/construction) +"xB" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/turf/open/floor/plating, +/area/engine/storage) +"xI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"zC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/construction) +"zZ" = ( +/obj/structure/disposalpipe/trunk{ + icon_state = "pipe-t"; + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/construction) +"AG" = ( +/turf/closed/wall/r_wall, +/area/engine/storage) +"AI" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/obj/item/tank/jetpack/oxygen/captain, +/obj/item/storage/belt/utility/chief/full, +/obj/item/clothing/gloves/color/yellow{ + pixel_y = 10 + }, +/turf/open/floor/plasteel, +/area/construction) +"Bk" = ( +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Bm" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/storage/primary) +"CK" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Dm" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"DG" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"DK" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) +"Eb" = ( +/obj/effect/turf_decal/stripes/white/line, +/turf/open/floor/plating, +/area/engine/storage) +"EF" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/construction) +"EH" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Fd" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"FL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/green/hidden{ + icon_state = "pipe11-2"; + dir = 4 + }, +/turf/open/floor/plating, +/area/construction) +"FY" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/construction) +"Hk" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/construction) +"IC" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"IN" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/turf/open/floor/plasteel, +/area/engine/storage) +"Jt" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"JH" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Kd" = ( +/obj/machinery/door/airlock/external/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"Kw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 1 + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"KM" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"LE" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"LW" = ( +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"ME" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/maintenance/department/bridge) +"Ob" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/openspace, +/area/space/nearstation) +"Og" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/engine/storage) +"Pu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Pz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/engine/storage) +"Qo" = ( +/obj/structure/disposalpipe/trunk/multiz/down{ + icon_state = "pipe-down"; + dir = 1 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Qw" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"St" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/construction) +"Tf" = ( +/turf/open/floor/plating, +/area/construction) +"TH" = ( +/turf/open/floor/plating, +/area/engine/storage) +"TY" = ( +/turf/closed/wall/r_wall, +/area/hallway/secondary/service) +"Um" = ( +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"UH" = ( +/obj/machinery/atmospherics/pipe/simple/multiz, +/turf/open/floor/plating, +/area/engine/storage) +"Vn" = ( +/obj/effect/turf_decal/stripes/asteroid/line, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/storage) +"VB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/construction) +"WN" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"XN" = ( +/turf/open/floor/plating, +/area/hallway/secondary/service) +"Zc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/service) +"ZH" = ( +/obj/structure/disposalpipe/trunk/multiz, +/turf/open/floor/plating, +/area/construction) +"ZQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + icon_state = "warningline_white"; + dir = 5 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/engine/storage) + +(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 +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 +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 +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 +aa +aa +"} +(3,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 +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 +aa +aa +"} +(4,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 +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 +aa +aa +"} +(5,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 +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 +aa +aa +"} +(6,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 +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 +aa +aa +"} +(7,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 +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 +aa +aa +"} +(8,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 +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 +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +af +af +bz +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +ah +ah +ah +ah +ah +ah +bA +bZ +bZ +bZ +bZ +bZ +bA +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +al +aw +aM +aZ +aX +bA +bB +bE +bE +bE +bE +bE +bE +cN +cD +dm +dy +dy +dy +dy +dy +dy +dy +dy +dm +dM +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ah +am +ax +aw +ba +be +bj +bt +bN +bN +bN +bC +bN +bN +cP +cE +Tf +Tf +ZH +FY +zZ +Tf +Tf +cR +cR +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aN +bb +bl +ah +bx +bL +bL +bL +cg +bL +bL +cz +cF +Tf +Tf +Tf +Tf +Tf +Tf +Tf +cR +Tf +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +ay +aO +bc +bm +ah +bE +bE +bE +bE +ch +bE +bE +cQ +cY +Tf +cN +df +Tf +Tf +Tf +Tf +cR +hi +cR +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ah +am +az +aP +aP +bn +ah +bF +bE +co +bE +ch +bE +bE +cN +cY +Tf +Tf +dg +Tf +Tf +Tf +Tf +cR +FL +cR +dL +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ah +ah +ah +ah +ah +ah +bu +bu +bv +bu +bu +ci +bL +bL +cB +cO +dd +dd +dh +Tf +Tf +Tf +Tf +Tf +gK +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +ag +ag +ag +ag +bu +bD +bO +cp +cv +cj +bE +bE +cR +cY +Tf +cN +jT +Tf +Tf +Tf +Tf +Tf +Tf +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ai +an +ai +an +ai +ag +bv +bG +bQ +eb +bv +ck +bN +bN +zC +hm +EF +VB +Hk +Tf +Tf +Tf +Tf +Tf +sm +Tf +dL +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ao +as +aB +as +aV +ag +bv +bI +bQ +eb +bu +cm +bE +bE +cN +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +ij +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ag +ag +ag +aC +ag +ag +ag +bv +bJ +bR +bS +ca +cq +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +St +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +ag +aC +ag +ac +ac +bv +bK +eb +eb +bu +cm +bE +bE +cQ +cY +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +Tf +xr +cN +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aD +aj +ac +ac +bv +bH +eb +eb +bv +cm +bE +bE +cN +cZ +do +dz +dz +dz +dz +dz +dz +dz +dz +AI +vF +cN +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ae +ac +ac +aj +aE +aj +ac +ac +bu +bM +ec +cr +bu +cm +bE +bE +cS +cS +cS +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +aj +aj +aF +aj +aj +aj +bu +bu +bv +bu +bu +cs +bE +bE +cS +cT +on +dA +dl +dl +dl +dl +dl +dl +dl +dp +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ap +aG +aS +bd +bo +bw +bN +bN +ct +bN +cu +bN +bN +cU +cW +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +aq +aH +aR +aW +aW +bk +bL +bL +bL +cb +cw +bE +bE +cS +cX +dJ +dB +dl +dD +dc +dc +dA +dl +dD +dc +dc +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +aj +ar +dW +aG +bf +bp +aj +bP +bE +bE +cc +cA +bE +bE +cS +cX +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +ak +ak +aT +ak +ak +bs +bL +bE +bE +cc +cA +bE +bE +cS +da +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dO +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aA +aQ +aU +bg +bq +ak +bL +bE +bE +cd +cx +bL +bL +cC +db +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +at +bh +bh +bh +br +ak +bL +bE +bE +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +aI +aI +dV +aI +aI +ak +bT +bE +co +cc +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dP +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +dV +dV +dV +by +by +by +by +ce +cG +by +by +by +de +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dQ +cS +ME +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aJ +aK +aL +dV +by +bU +cl +cl +cf +cH +cI +cJ +by +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dR +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +Dm +ak +dV +aK +dV +bi +dV +by +bV +eo +eo +eo +eo +eo +cK +by +dJ +dJ +dB +dl +dF +dk +dk +dC +dl +dF +dk +dk +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +aL +aK +aJ +dV +by +bW +eo +eo +eo +eo +eo +cL +by +dJ +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +dV +dV +aY +dV +dV +by +bX +eo +eo +cy +eo +eo +cM +by +dk +Bm +dC +dl +dl +dl +dl +dl +dl +dl +dx +dl +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +oh +by +cn +by +by +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(41,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +af +oA +af +af +af +af +oA +af +af +af +by +LW +by +af +af +af +oA +af +af +af +af +oA +af +af +af +af +oA +af +af +af +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(42,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +Kd +by +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(43,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(44,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +"} +(45,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 +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 +aa +aa +"} +(46,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 +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 +aa +aa +"} +(47,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 +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 +aa +aa +"} +(48,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 +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 +aa +aa +"} +(49,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 +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 +aa +aa +"} +(50,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 +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 +aa +aa +"} +(51,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 +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 +aa +aa +"} +(52,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 +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 +aa +aa +"} + +(1,1,2) = {" +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 +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 +aa +aa +"} +(2,1,2) = {" +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 +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 +aa +aa +"} +(3,1,2) = {" +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 +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 +aa +aa +"} +(4,1,2) = {" +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 +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 +aa +aa +"} +(5,1,2) = {" +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 +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 +aa +aa +"} +(6,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +XN +XN +eE +XN +dY +dY +WN +dY +dY +dY +dY +dY +WN +dY +es +eI +eI +kg +eI +eI +eI +eI +kg +eI +eI +eM +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +CK +gW +Qo +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +XN +dX +dX +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +XN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +XN +TY +di +XN +XN +XN +XN +eF +iu +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +eN +dY +dY +dY +dY +dY +eu +XN +XN +dj +XN +XN +XN +XN +eF +eF +eF +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +ed +ed +eF +TY +TY +TY +eF +TY +TY +mZ +dY +dY +dY +eu +XN +XN +dn +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Ob +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +WN +TY +em +dY +dY +dY +eu +XN +TY +Fd +XN +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +dY +eu +XN +XN +jb +LE +IC +jb +XN +XN +iu +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +Zc +XN +XN +XN +XN +XN +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +av +XN +eL +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +XN +XN +XN +XN +XN +XN +XN +XN +XN +XN +Kw +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +eF +dY +dY +dY +eF +sh +dY +dY +eN +ey +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eH +lu +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +Bk +nx +nx +nx +nx +nx +nx +nx +TY +dY +dY +eN +TY +sh +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +TY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +TY +eF +eD +eD +eF +TY +TY +TY +eF +TY +TY +sh +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +af +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +ME +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +eN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +eF +eF +eF +eF +eF +eF +eF +eF +TY +KM +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +eN +dY +dY +dY +dY +eN +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +dY +dY +dY +TY +TY +TY +TY +dY +TY +TY +TY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +sh +iK +mZ +xI +TY +ee +iK +ez +iK +iK +iK +en +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +iK +dY +iK +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +Dm +TY +dY +mZ +iK +sh +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +dY +dY +eN +dY +dY +TY +sh +dY +dY +iK +dY +dY +dY +TY +dY +eN +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +XN +XN +XN +XN +XN +TY +TY +TY +TY +TY +TY +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +af +oA +af +af +af +af +oA +af +af +af +af +af +af +oA +af +af +af +oA +af +oJ +eC +eC +eC +eC +eC +eC +eC +eC +eC +eC +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,2) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,2) = {" +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 +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 +aa +aa +"} +(49,1,2) = {" +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 +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 +aa +aa +"} +(50,1,2) = {" +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 +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 +aa +aa +"} +(51,1,2) = {" +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 +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 +aa +aa +"} +(52,1,2) = {" +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 +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 +aa +aa +"} + +(1,1,3) = {" +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 +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 +aa +aa +"} +(2,1,3) = {" +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 +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 +aa +aa +"} +(3,1,3) = {" +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 +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 +aa +aa +"} +(4,1,3) = {" +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 +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 +aa +aa +"} +(5,1,3) = {" +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 +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 +aa +aa +"} +(6,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(7,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(8,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(9,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(10,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(11,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(12,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +rd +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(13,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(14,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(15,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +jV +td +td +td +td +td +td +jA +jA +ZQ +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(16,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +DG +TH +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(17,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +AG +dq +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(18,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +TH +dr +TH +TH +TH +TH +DK +DK +od +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(19,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +vt +Um +Um +Um +Um +Um +Um +Um +Um +xB +TH +ds +TH +TH +TH +TH +TH +Pz +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(20,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +AG +Og +TH +TH +TH +TH +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(21,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +Pz +TH +TH +TH +UH +JH +ho +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(22,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +Pu +TH +TH +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(23,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +TH +TH +qo +Eb +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(24,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +dS +dS +EH +sE +sE +sE +sE +sE +sE +sE +sE +qR +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(25,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +nx +ip +Jt +dS +dS +dS +dS +dS +dS +nz +eV +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(26,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +nx +nx +nx +nx +nx +nx +dG +fo +dS +dS +dS +dS +dS +dS +dS +AG +dS +dS +IN +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(27,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +fa +Qw +Qw +Qw +Qw +Qw +Qw +ej +Qw +Qw +Vn +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(28,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(29,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(30,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(31,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(32,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(33,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(34,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(35,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(36,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(37,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(38,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(39,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(40,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(41,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(42,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +AG +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(43,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(44,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(45,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(46,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(47,1,3) = {" +aa +aa +aa +aa +aa +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +aa +aa +aa +aa +aa +"} +(48,1,3) = {" +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 +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 +aa +aa +"} +(49,1,3) = {" +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 +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 +aa +aa +"} +(50,1,3) = {" +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 +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 +aa +aa +"} +(51,1,3) = {" +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 +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 +aa +aa +"} +(52,1,3) = {" +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 +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 +aa +aa +"} diff --git a/_maps/multiz_debug.dm b/_maps/multiz_debug.dm new file mode 100644 index 0000000000..0521fef59d --- /dev/null +++ b/_maps/multiz_debug.dm @@ -0,0 +1 @@ +#define FORCE_MAP "_maps/multiz_debug.json" \ No newline at end of file diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json new file mode 100644 index 0000000000..7e39981e23 --- /dev/null +++ b/_maps/multiz_debug.json @@ -0,0 +1,6 @@ +{ + "map_name": "MultiZ Debug", + "map_path": "map_files/debug", + "map_file": "multiz.dmm", + "traits": [{"Up": 1}, {"Up": 1, "Down": -1}, {"Down": -1}] + } diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 263d692764..f7ec35c667 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -2,15 +2,21 @@ "aa" = ( /turf/template_noop, /area/template_noop) -"ac" = ( -/obj/machinery/porta_turret/syndicate{ +"ab" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ dir = 9 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/bridge) +"ac" = ( +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) "ad" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/bridge) +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) "ae" = ( /obj/structure/window/plastitanium, /obj/machinery/door/poddoor/shutters{ @@ -21,11 +27,8 @@ /turf/open/floor/plating, /area/shuttle/syndicate/bridge) "af" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/bridge) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) "ag" = ( /obj/machinery/computer/med_data/syndie, /obj/effect/turf_decal/bot_white, @@ -144,7 +147,7 @@ /area/shuttle/syndicate/bridge) "au" = ( /obj/machinery/status_display/evac, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/bridge) "av" = ( /obj/machinery/door/airlock/hatch{ @@ -164,14 +167,14 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) "aw" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 9 }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/eva) "ax" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/eva) "ay" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil/white, @@ -222,11 +225,8 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aB" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 6 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/airlock) "aC" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -265,14 +265,17 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aF" = ( -/obj/machinery/porta_turret/syndicate{ +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 5 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) +"aG" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ dir = 9 }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/eva) -"aG" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/eva) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) "aH" = ( /obj/structure/chair/comfy/shuttle{ dir = 4; @@ -314,14 +317,11 @@ /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/hallway) "aJ" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/airlock) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) "aK" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/shuttle/syndicate/medical) "aL" = ( /obj/machinery/suit_storage_unit/syndicate, /obj/effect/turf_decal/stripes/line{ @@ -508,7 +508,7 @@ /obj/structure/sign/warning/vacuum/external{ layer = 4 }, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/airlock) "be" = ( /obj/machinery/suit_storage_unit/syndicate, @@ -517,11 +517,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/eva) -"bf" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/eva) "bg" = ( /obj/structure/grille, /obj/structure/window/plastitanium, @@ -543,31 +538,28 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "bj" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) +/turf/closed/wall/r_wall/syndicate/nodiagonal, +/area/shuttle/syndicate/armory) "bk" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) -"bl" = ( /obj/machinery/status_display/ai, -/turf/closed/wall/mineral/plastitanium, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/medical) "bm" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/syndicate/medical) +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) "bn" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, +/obj/machinery/status_display/evac, +/turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/armory) "bo" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) -"bp" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) +/obj/machinery/nuclearbomb/syndicate{ + anchored = 1 + }, +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/shuttle/syndicate/hallway) "bq" = ( /obj/machinery/sleeper/syndie{ dir = 4 @@ -1043,14 +1035,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/shuttle/syndicate/hallway) -"cm" = ( -/obj/machinery/nuclearbomb/syndicate, -/obj/machinery/door/window{ - dir = 1; - name = "Theatre Stage" - }, -/turf/open/floor/circuit/red, -/area/shuttle/syndicate/hallway) "cn" = ( /obj/machinery/light{ dir = 4 @@ -1169,18 +1153,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/syndicate/medical) -"cC" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 6 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/medical) -"cD" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/armory) "cE" = ( /obj/structure/shuttle/engine/propulsion/left, /obj/effect/turf_decal/stripes/line, @@ -1196,6 +1168,35 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/syndicate/armory) +"dp" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/armory) +"pd" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 5 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/bridge) +"vv" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/eva) +"In" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 6 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/hallway) +"MJ" = ( +/obj/machinery/porta_turret/syndicate/shuttle{ + dir = 6 + }, +/turf/closed/wall/r_wall/syndicate, +/area/shuttle/syndicate/medical) (1,1,1) = {" aa @@ -1211,16 +1212,16 @@ aa aa aa aa -bj -bk -bk -bk -bk -bk -bk -bk -bk -bk +aG +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ +aJ "} (2,1,1) = {" aa @@ -1230,13 +1231,13 @@ aa aa aa aa -aF -aG -aG -aG -aG -aG -bk +aw +ax +ax +ax +ax +ax +aJ bq bC bq @@ -1255,13 +1256,13 @@ aa aa aa aa -aG +ax aL aR aR aR be -bk +aJ br bD bH @@ -1280,13 +1281,13 @@ aa aa aa aa -aG +ax aM aM aM aM aM -bl +bk bs bD bI @@ -1298,51 +1299,51 @@ cu cB "} (5,1,1) = {" +ab +ac +ac +ac ac -ad -ad -ad -ad aa aa -aG +ax aM aM aM aM aM -bk +aJ bt bD bJ bT cb -bm -bk -bk -cC +aK +aJ +aJ +MJ "} (6,1,1) = {" -ad +ac ag an at +ac ad -aw aa -aG +ax aN aS aU aZ -bf -bk +vv +aJ bu bD bJ bT cc -bk +aJ aa aa aa @@ -1352,24 +1353,24 @@ ae ah ao at -ad +ac +af +af +ax +ax ax ax -aG -aG -aG -aG ba bg -bm +aK bv bv bK bv -bk -bk -ax -ax +aJ +aJ +af +af aa "} (8,1,1) = {" @@ -1417,7 +1418,7 @@ aD bL bU az -cm +bo cr cw aa @@ -1427,7 +1428,7 @@ ae ak ap at -ad +ac aA aE aI @@ -1452,75 +1453,75 @@ ae al ar at -ad -ax -ax -ax -ax -aJ -aJ +ac +af +af +af +af +aB +aB bb bh -bn +bj bw bw bM bw -bo -bo -ax -ax +bm +bm +af +af aa "} (12,1,1) = {" -ad +ac am as at -ad -aB +ac +In aa -aJ +aB aO aO aX bc aO -bo +bm bx bG bN bV ce -bo +bm aa aa aa "} (13,1,1) = {" -af -ad -ad -ad -ad +pd +ac +ac +ac +ac aa aa -aJ +aB aP aP aP aP aP -bo +bm by bG bN bV cf -bn -bo -bo -cD +bj +bm +bm +dp "} (14,1,1) = {" aa @@ -1530,13 +1531,13 @@ aa aa aa aa -aJ +aB aP aP aP aP aP -bp +bn bz bG bO @@ -1555,13 +1556,13 @@ aa aa aa aa -aJ +aB aQ aT aT aT bi -bo +bm bA bG bP @@ -1580,13 +1581,13 @@ aa aa aa aa -aK -aJ -aJ +aF +aB +aB aY bd -aJ -bo +aB +bm bB bG bQ @@ -1611,14 +1612,14 @@ aa aa aa aa -aK -bo -bo -bo -bo -bo -bo -bo -bo -bo +aF +bm +bm +bm +bm +bm +bm +bm +bm +bm "} diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index 97ce6ef6fd..fe48edd266 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -2,12 +2,12 @@ #define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count #define MC_SPLIT_TICK \ - if(split_tick_phases > 1){\ - Master.current_ticklimit = ((original_tick_limit - TICK_USAGE) / split_tick_phases) + TICK_USAGE;\ - --split_tick_phases;\ - } else {\ - Master.current_ticklimit = original_tick_limit;\ - } + if(split_tick_phases > 1){\ + Master.current_ticklimit = ((original_tick_limit - TICK_USAGE) / split_tick_phases) + TICK_USAGE;\ + --split_tick_phases;\ + } else {\ + Master.current_ticklimit = original_tick_limit;\ + } // Used to smooth out costs to try and avoid oscillation. #define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) @@ -65,14 +65,14 @@ #define SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/##X);\ /datum/controller/subsystem/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ /datum/controller/subsystem/##X #define PROCESSING_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/processing/##X);\ /datum/controller/subsystem/processing/##X/New(){\ - NEW_SS_GLOBAL(SS##X);\ - PreInit();\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ }\ /datum/controller/subsystem/processing/##X diff --git a/code/__DEFINES/_globals.dm b/code/__DEFINES/_globals.dm index e5f5929a95..874223a612 100644 --- a/code/__DEFINES/_globals.dm +++ b/code/__DEFINES/_globals.dm @@ -3,8 +3,8 @@ //Creates a global initializer with a given InitValue expression, do not use #define GLOBAL_MANAGED(X, InitValue)\ /datum/controller/global_vars/proc/InitGlobal##X(){\ - ##X = ##InitValue;\ - gvars_datum_init_order += #X;\ + ##X = ##InitValue;\ + gvars_datum_init_order += #X;\ } //Creates an empty global initializer, do not use #define GLOBAL_UNMANAGED(X) /datum/controller/global_vars/proc/InitGlobal##X() { return; } @@ -13,8 +13,8 @@ #ifndef TESTING #define GLOBAL_PROTECT(X)\ /datum/controller/global_vars/InitGlobal##X(){\ - ..();\ - gvars_datum_protected_varlist[#X] = TRUE;\ + ..();\ + gvars_datum_protected_varlist[#X] = TRUE;\ } #else #define GLOBAL_PROTECT(X) diff --git a/code/__DEFINES/_protect.dm b/code/__DEFINES/_protect.dm index 2bfb984153..fd27d2fbe9 100644 --- a/code/__DEFINES/_protect.dm +++ b/code/__DEFINES/_protect.dm @@ -1,10 +1,10 @@ #define GENERAL_PROTECT_DATUM(Path)\ ##Path/can_vv_get(var_name){\ - return FALSE;\ + return FALSE;\ }\ ##Path/vv_edit_var(var_name, var_value){\ - return FALSE;\ + return FALSE;\ }\ ##Path/CanProcCall(procname){\ - return FALSE;\ + return FALSE;\ } \ No newline at end of file diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 928837979c..baf29240c3 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -143,7 +143,9 @@ #define ATMOS_PASS_NO 0 #define ATMOS_PASS_PROC -1 //ask CanAtmosPass() #define ATMOS_PASS_DENSITY -2 //just check density + #define CANATMOSPASS(A, O) ( A.CanAtmosPass == ATMOS_PASS_PROC ? A.CanAtmosPass(O) : ( A.CanAtmosPass == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPass ) ) +#define CANVERTICALATMOSPASS(A, O) ( A.CanAtmosPassVertical == ATMOS_PASS_PROC ? A.CanAtmosPass(O, TRUE) : ( A.CanAtmosPassVertical == ATMOS_PASS_DENSITY ? !A.density : A.CanAtmosPassVertical ) ) //LAVALAND #define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland @@ -249,6 +251,13 @@ out_var += cached_gases[total_moles_id];\ } +#ifdef TESTING +GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) +#define CALCULATE_ADJACENT_TURFS(T) if (SSadjacent_air.queue[T]) { GLOB.atmos_adjacent_savings[1] += 1 } else { GLOB.atmos_adjacent_savings[2] += 1; SSadjacent_air.queue[T] = 1 } +#else +#define CALCULATE_ADJACENT_TURFS(T) SSadjacent_air.queue[T] = 1 +#endif + //Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance. #define GAS_GARBAGE_COLLECT(GASGASGAS)\ var/list/CACHE_GAS = GASGASGAS;\ diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 242889e3f8..0d07ef353a 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -17,17 +17,17 @@ #define POD_DESC 3 #define POD_STYLES list(\ - list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ - list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ - list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ - list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ - list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ - list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ - list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ - list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ - list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ - list("fruitpod", "\improper Orange", "An angry orange."),\ - list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ - list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency.")\ + list("supplypod", "supply pod", "A Nanotrasen supply drop pod."),\ + list("bluespacepod", "bluespace supply pod" , "A Nanotrasen Bluespace supply pod. Teleports back to CentCom after delivery."),\ + list("centcompod", "\improper Centcom supply pod", "A Nanotrasen supply pod, this one has been marked with Central Command's designations. Teleports back to Centcom after delivery."),\ + list("syndiepod", "blood-red supply pod", "A dark, intimidating supply pod, covered in the blood-red markings of the Syndicate. It's probably best to stand back from this."),\ + list("squadpod", "\improper MK. II supply pod", "A Nanotrasen supply pod. This one has been marked the markings of some sort of elite strike team."),\ + list("cultpod", "bloody supply pod", "A Nanotrasen supply pod covered in scratch-marks, blood, and strange runes."),\ + list("missilepod", "cruise missile", "A big ass missile that didn't seem to fully detonate. It was likely launched from some far-off deep space missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list("smissilepod", "\improper Syndicate cruise missile", "A big ass, blood-red missile that didn't seem to fully detonate. It was likely launched from some deep space Syndicate missile silo. There appears to be an auxillery payload hatch on the side, though manually opening it is likely impossible."),\ + list("boxpod", "\improper Aussec supply crate", "An incredibly sturdy supply crate, designed to withstand orbital re-entry. Has 'Aussec Armory - 2532' engraved on the side."),\ + list("honkpod", "\improper HONK pod", "A brightly-colored supply pod. It likely originated from the Clown Federation."),\ + list("fruitpod", "\improper Orange", "An angry orange."),\ + list("", "\improper S.T.E.A.L.T.H. pod MKVII", "A supply pod that, under normal circumstances, is completely invisible to conventional methods of detection. How are you even seeing this?"),\ + list("gondolapod", "gondola", "The silent walker. This one seems to be part of a delivery agency.")\ ) \ No newline at end of file diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 4d32252062..bf30b547fe 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -72,11 +72,16 @@ #define COMSIG_ATOM_SCREWDRIVER_ACT "atom_screwdriver_act" //from base of atom/screwdriver_act(): (mob/living/user, obj/item/I) #define COMSIG_ATOM_INTERCEPT_TELEPORT "intercept_teleport" //called when teleporting into a protected turf: (channel, turf/origin, turf/destination) #define COMPONENT_BLOCK_TELEPORT 1 +#define COMSIG_ATOM_HEARER_IN_VIEW "atom_hearer_in_view" //called when an atom with HEAR_1 is added to the hearers on /proc/get_hearers_in_view(): (list/processing_list, list/hearers) ///////////////// #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_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) @@ -98,6 +103,7 @@ // /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_MOVED "movable_moved" //from base of atom/movable/Moved(): (/atom, dir) @@ -123,8 +129,10 @@ #define COMSIG_MIND_TRANSFER "mind_transfer" //from base of mind/transfer_to(): (new_character, old_character) // /mob signals +#define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/A) + #define COMPONENT_ALLOW_EXAMINE 1 #define COMSIG_MOB_DEATH "mob_death" //from base of mob/death(): (gibbed) -#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize() (can_reenter_corpse) +#define COMSIG_MOB_GHOSTIZE "mob_ghostize" //from base of mob/Ghostize(): (can_reenter_corpse) #define COMPONENT_BLOCK_GHOSTING 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) @@ -149,6 +157,8 @@ #define SPEECH_FORCED 7 */ // /mob/living signals +#define COMSIG_LIVING_FULLY_HEAL "living_fully_healed" //from base of /mob/living/fully_heal(): (admin_revive) +#define COMSIG_LIVING_REGENERATE_LIMBS "living_regenerate_limbs" //from base of /mob/living/regenerate_limbs(): (noheal, excluded_limbs) #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) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 70010eeffc..dc573bc28e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -9,6 +9,16 @@ //Turfs //#define isturf(A) (istype(A, /turf)) This is actually a byond built-in. Added here for completeness sake. +GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( + /turf/open/space, + /turf/open/chasm, + /turf/open/lava, + /turf/open/water, + /turf/open/openspace + ))) + +#define isgroundlessturf(A) (is_type_in_typecache(A, GLOB.turfs_without_ground)) + #define isopenturf(A) (istype(A, /turf/open)) #define isindestructiblefloor(A) (istype(A, /turf/open/indestructible)) @@ -56,6 +66,7 @@ #define ishumanbasic(A) (is_species(A, /datum/species/human)) #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) +#define isdullahan(A) (is_species(A, /datum/species/dullahan)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 5e903997e4..e0a22667ac 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -9,6 +9,7 @@ #define FLOOR_PLANE -2 #define GAME_PLANE -1 #define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals + #define SPACE_LAYER 1.8 //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define #define MID_TURF_LAYER 2.02 @@ -83,25 +84,28 @@ #define ABOVE_LIGHTING_PLANE 16 #define ABOVE_LIGHTING_LAYER 16 -#define BYOND_LIGHTING_PLANE 17 -#define BYOND_LIGHTING_LAYER 17 +#define FLOOR_OPENSPACE_PLANE 17 +#define OPENSPACE_LAYER 17 -#define CAMERA_STATIC_PLANE 18 -#define CAMERA_STATIC_LAYER 18 +#define BYOND_LIGHTING_PLANE 18 +#define BYOND_LIGHTING_LAYER 18 + +#define CAMERA_STATIC_PLANE 19 +#define CAMERA_STATIC_LAYER 19 //HUD layer defines -#define FULLSCREEN_PLANE 19 -#define FLASH_LAYER 19 -#define FULLSCREEN_LAYER 19.1 -#define UI_DAMAGE_LAYER 19.2 -#define BLIND_LAYER 19.3 -#define CRIT_LAYER 19.4 -#define CURSE_LAYER 19.5 +#define FULLSCREEN_PLANE 20 +#define FLASH_LAYER 20 +#define FULLSCREEN_LAYER 20.1 +#define UI_DAMAGE_LAYER 20.2 +#define BLIND_LAYER 20.3 +#define CRIT_LAYER 20.4 +#define CURSE_LAYER 20.5 -#define HUD_PLANE 20 -#define HUD_LAYER 20 -#define ABOVE_HUD_PLANE 21 -#define ABOVE_HUD_LAYER 21 +#define HUD_PLANE 21 +#define HUD_LAYER 21 +#define ABOVE_HUD_PLANE 22 +#define ABOVE_HUD_LAYER 22 -#define SPLASHSCREEN_LAYER 22 -#define SPLASHSCREEN_PLANE 22 +#define SPLASHSCREEN_LAYER 23 +#define SPLASHSCREEN_PLANE 23 diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index d0d6269c1e..1ce5b88945 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -30,7 +30,8 @@ #define LIMBGROWER (1<<6) //Uses synthetic flesh #define SMELTER (1<<7) //uses various minerals #define AUTOYLATHE (1<<8) // CITADEL ADD -#define NANITE_COMPILER (1<<9) //Prints nanite disks +#define NANITE_COMPILER (1<<9) //Prints nanite disks +#define AUTOBOTTLER (1<<10) //Uses booze, for printing //Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. //Modular computer/NTNet defines diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 3c0921fa01..1b42217fe1 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -37,6 +37,7 @@ require only minor tweaks. #define ZTRAIT_AWAY "Away Mission" #define ZTRAIT_SPACE_RUINS "Space Ruins" #define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. // prevents certain turfs from being stripped by a singularity #define ZTRAIT_PLANET "Planet" @@ -52,12 +53,12 @@ require only minor tweaks. // enum - how space transitions should affect this level #define ZTRAIT_LINKAGE "Linkage" - // UNAFFECTED if absent - no space transitions - #define UNAFFECTED null - // SELFLOOPING - space transitions always self-loop - #define SELFLOOPING "Self" - // CROSSLINKED - mixed in with the cross-linked space pool - #define CROSSLINKED "Cross" + // UNAFFECTED if absent - no space transitions + #define UNAFFECTED null + // SELFLOOPING - space transitions always self-loop + #define SELFLOOPING "Self" + // CROSSLINKED - mixed in with the cross-linked space pool + #define CROSSLINKED "Cross" // default trait definitions, used by SSmapping #define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) @@ -72,7 +73,7 @@ require only minor tweaks. // must correspond to _basemap.dm for things to work correctly #define DEFAULT_MAP_TRAITS list(\ - DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\ + DECLARE_LEVEL("CentCom", ZTRAITS_CENTCOM),\ ) // Camera lock flags @@ -89,10 +90,10 @@ require only minor tweaks. #define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) #define PLACE_DEFAULT "random" -#define PLACE_SAME_Z "same" -#define PLACE_SPACE_RUIN "space" -#define PLACE_LAVA_RUIN "lavaland" - - +#define PLACE_SAME_Z "same" //On same z level as original ruin +#define PLACE_SPACE_RUIN "space" //On space ruin z level(s) +#define PLACE_LAVA_RUIN "lavaland" //On lavaland ruin z levels(s) +#define PLACE_BELOW "below" //On z levl below - centered on same tile +#define PLACE_ISOLATED "isolated" //On isolated ruin z level //Map type stuff. -#define MAP_TYPE_STATION "station" +#define MAP_TYPE_STATION "station" \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 628c7c242f..7ed4266aef 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -179,11 +179,12 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) #define LOCKED_SENSORS 2 //Wet floor type flags. Stronger ones should be higher in number. -#define TURF_DRY 0 -#define TURF_WET_WATER 1 -#define TURF_WET_PERMAFROST 2 -#define TURF_WET_ICE 4 -#define TURF_WET_LUBE 8 +#define TURF_DRY (0) +#define TURF_WET_WATER (1<<0) +#define TURF_WET_PERMAFROST (1<<1) +#define TURF_WET_ICE (1<<2) +#define TURF_WET_LUBE (1<<3) +#define TURF_WET_SUPERLUBE (1<<4) #define IS_WET_OPEN_TURF(O) O.GetComponent(/datum/component/wet_floor) @@ -257,9 +258,11 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) #define PDA_SKIN_ALT "Holographic" #define PDA_SKIN_RUGGED "Rugged" #define PDA_SKIN_MODERN "Modern" +#define PDA_SKIN_MINIMAL "Minimal" GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi', - PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi')) + PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi', + PDA_SKIN_MINIMAL = 'icons/obj/pda_minimal.dmi')) ///////////////////////////////////// // atom.appearence_flags shortcuts // @@ -487,5 +490,12 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 +// possible bitflag return values of intercept_zImpact(atom/movable/AM, levels = 1) calls +#define FALL_INTERCEPTED (1<<0) //Stops the movable from falling further and crashing on the ground +#define FALL_NO_MESSAGE (1<<1) //Used to suppress the "[A] falls through [old_turf]" messages where it'd make little sense at all, like going downstairs. +#define FALL_STOP_INTERCEPTING (1<<2) //Used in situations where halting the whole "intercept" loop would be better, like supermatter dusting (and thus deleting) the atom. + //Misc text define. Does 4 spaces. Used as a makeshift tabulator. #define FOURSPACES "    " + +#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 5bd0ee5b3b..8d2913629a 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -201,6 +201,8 @@ #define SLIDE (1<<1) #define GALOSHES_DONT_HELP (1<<2) #define SLIDE_ICE (1<<3) +#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin +#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on. #define MAX_CHICKENS 50 diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 1885dd2621..d3e724aefb 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -11,6 +11,7 @@ #define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. #define FROZEN (1<<8) #define SHOVABLE_ONTO (1<<9) //called on turf.shove_act() to consider whether an object should have a niche effect (defined in their own shove_act()) when someone is pushed onto it, or do a sanity CanPass() check. +#define BLOCK_Z_FALL (1<<10) // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/__DEFINES/procpath.dm b/code/__DEFINES/procpath.dm new file mode 100644 index 0000000000..1180058358 --- /dev/null +++ b/code/__DEFINES/procpath.dm @@ -0,0 +1,24 @@ +/// Represents a proc or verb path. +/// +/// Despite having no DM-defined static type, proc paths have some variables, +/// listed below. These are not modifiable, but for a given procpath P, +/// `new P(null, "Name", "Desc")` can be used to create a new procpath with the +/// same code but new `name` and `desc` values. The other variables cannot be +/// changed in this way. +/// +/// This type exists only to act as an annotation, providing reasonable static +/// typing for procpaths. Previously, types like `/atom/verb` were used, with +/// the `name` and `desc` vars of `/atom` thus being accessible. Proc and verb +/// paths will fail `istype` and `ispath` checks against `/procpath`. +/procpath + // Although these variables are effectively const, if they are marked const + // below, their accesses are optimized away. + + /// A text string of the verb's name. + var/name as text + /// The verb's help text or description. + var/desc as text + /// The category or tab the verb will appear in. + var/category as text + /// Only clients/mobs with `see_invisibility` higher can use the verb. + var/invisibility as num diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm new file mode 100644 index 0000000000..e590a30ff9 --- /dev/null +++ b/code/__DEFINES/spaceman_dmm.dm @@ -0,0 +1,13 @@ +// Interfaces for the SpacemanDMM linter, define'd to nothing when the linter +// is not in use. + +// The SPACEMAN_DMM define is set by the linter and other tooling when it runs. +#ifdef SPACEMAN_DMM + #define RETURN_TYPE(X) set SpacemanDMM_return_type = X + #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X + #define UNLINT(X) SpacemanDMM_unlint(X) +#else + #define RETURN_TYPE(X) + #define SHOULD_CALL_PARENT(X) + #define UNLINT(X) X +#endif diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2fd929a07d..c194e578c9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -26,10 +26,6 @@ #define TIMER_ID_NULL -1 -//For servers that can't do with any additional lag, set this to none in flightpacks.dm in subsystem/processing. -#define FLIGHTSUIT_PROCESSING_NONE 0 -#define FLIGHTSUIT_PROCESSING_FULL 1 - #define INITIALIZATION_INSSATOMS 0 //New should not call Initialize #define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE) #define INITIALIZATION_INNEW_REGULAR 1 //New should call Initialize(FALSE) @@ -40,11 +36,11 @@ //type and all subtypes should always call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ - ..();\ - if(!(flags_1 & INITIALIZED_1)) {\ - args[1] = TRUE;\ - SSatoms.InitAtom(src, args);\ - }\ + ..();\ + if(!(flags_1 & INITIALIZED_1)) {\ + args[1] = TRUE;\ + SSatoms.InitAtom(src, args);\ + }\ } // Subsystem init_order, from highest priority to lowest priority @@ -112,10 +108,10 @@ #define FIRE_PRIORITY_DEFAULT 50 #define FIRE_PRIORITY_PARALLAX 65 #define FIRE_PRIORITY_NPC 80 -#define FIRE_PRIORITY_FLIGHTPACKS 80 #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_ATMOS_ADJACENCY 300 #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 1f37556d1d..fe7cf57cb3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -192,7 +192,6 @@ #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" #define EYES_COVERED "eyes_covered" -#define CULT_TRAIT "cult" #define CLOWN_NUKE_TRAIT "clown-nuke" #define STICKY_MOUSTACHE_TRAIT "sticky-moustache" #define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" @@ -213,4 +212,4 @@ #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" #define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" -#define ABDUCTOR_ANTAGONIST "abductor-antagonist" \ No newline at end of file +#define ABDUCTOR_ANTAGONIST "abductor-antagonist" diff --git a/code/__DEFINES/turf_flags.dm b/code/__DEFINES/turf_flags.dm index 5ceb6f2e2e..8604a92c01 100644 --- a/code/__DEFINES/turf_flags.dm +++ b/code/__DEFINES/turf_flags.dm @@ -3,3 +3,4 @@ #define CHANGETURF_FORCEOP 4 #define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE #define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR +#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. \ No newline at end of file diff --git a/code/__DEFINES/typeids.dm b/code/__DEFINES/typeids.dm index ae5df258b4..8bfe6216e2 100644 --- a/code/__DEFINES/typeids.dm +++ b/code/__DEFINES/typeids.dm @@ -2,7 +2,7 @@ #define TYPEID_NULL "0" #define TYPEID_NORMAL_LIST "f" //helper macros -#define GET_TYPEID(ref) ( ( (lentext(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, lentext(ref)-6) ) ) +#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 917615d095..7ea845720d 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -124,6 +124,7 @@ //returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) + RETURN_TYPE(/list) . = list() for(var/thing in atoms) var/atom/A = thing @@ -131,6 +132,7 @@ . += A /proc/typecache_filter_list_reverse(list/atoms, list/typecache) + RETURN_TYPE(/list) . = list() for(var/thing in atoms) var/atom/A = thing @@ -257,6 +259,7 @@ //Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) + RETURN_TYPE(L[_].type) if(L.len) var/picked = rand(1,L.len) . = L[picked] diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index c19a7a64b0..c259831f94 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -7,7 +7,7 @@ #define WRITE_LOG(log, text) rustg_log_write(log, text) //print a warning message to world.log -#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") +#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [UNLINT(src)] usr: [usr].") /proc/warning(msg) msg = "## WARNING: [msg]" log_world(msg) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 19d0755085..d76fc7731a 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -1,9 +1,9 @@ //supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a #define RANGE_TURFS(RADIUS, CENTER) \ - block( \ - locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ - ) + block( \ + locate(max(CENTER.x-(RADIUS),1), max(CENTER.y-(RADIUS),1), CENTER.z), \ + locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ + ) #define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL)) #define CULT_POLL_WAIT 2400 @@ -264,6 +264,7 @@ var/atom/A = processing_list[1] if(A.flags_1 & HEAR_1) . += A + SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing_list, .) processing_list.Cut(1, 2) processing_list += A.contents @@ -446,7 +447,7 @@ var/list/candidates = list() for(var/mob/dead/observer/G in GLOB.player_list) - if(G.can_reenter_round) + if(G.reenter_round_timeout < world.realtime) candidates += G return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 6908a5057f..8494bbb7a9 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -304,9 +304,9 @@ //is in the other string at the same spot (assuming it is not a replace char). //This is used for fingerprints var/newtext = text - if(lentext(text) != lentext(compare)) + if(length(text) != length(compare)) return 0 - for(var/i = 1, i < lentext(text), i++) + for(var/i = 1, i < length(text), i++) var/a = copytext(text,i,i+1) var/b = copytext(compare,i,i+1) //if it isn't both the same letter, or if they are both the replacement character @@ -326,7 +326,7 @@ if(!text || !character) return 0 var/count = 0 - for(var/i = 1, i <= lentext(text), i++) + for(var/i = 1, i <= length(text), i++) var/a = copytext(text,i,i+1) if(a == character) count++ @@ -607,8 +607,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) continue var/buffer = "" var/early_culling = TRUE - for(var/pos = 1, pos <= lentext(string), pos++) - var/let = copytext(string, pos, (pos + 1) % lentext(string)) + for(var/pos = 1, pos <= length(string), pos++) + var/let = copytext(string, pos, (pos + 1) % length(string)) if(early_culling && !findtext(let,GLOB.is_alphanumeric)) continue early_culling = FALSE @@ -616,9 +616,9 @@ GLOBAL_LIST_INIT(binary, list("0","1")) if(!findtext(buffer,GLOB.is_alphanumeric)) continue var/punctbuffer = "" - var/cutoff = lentext(buffer) - for(var/pos = lentext(buffer), pos >= 0, pos--) - var/let = copytext(buffer, pos, (pos + 1) % lentext(buffer)) + var/cutoff = length(buffer) + for(var/pos = length(buffer), pos >= 0, pos--) + var/let = copytext(buffer, pos, (pos + 1) % length(buffer)) if(findtext(let,GLOB.is_alphanumeric)) break if(findtext(let,GLOB.is_punctuation)) @@ -628,8 +628,8 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/exclaim = FALSE var/question = FALSE var/periods = 0 - for(var/pos = lentext(punctbuffer), pos >= 0, pos--) - var/punct = copytext(punctbuffer, pos, (pos + 1) % lentext(punctbuffer)) + for(var/pos = length(punctbuffer), pos >= 0, pos--) + var/punct = copytext(punctbuffer, pos, (pos + 1) % length(punctbuffer)) if(!exclaim && findtext(punct,"!")) exclaim = TRUE if(!question && findtext(punct,"?")) @@ -651,7 +651,7 @@ GLOBAL_LIST_INIT(binary, list("0","1")) buffer = copytext(buffer, 1, cutoff) + punctbuffer if(!findtext(buffer,GLOB.is_alphanumeric)) continue - if(!buffer || lentext(buffer) > 280 || lentext(buffer) <= cullshort || buffer in accepted) + if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted) continue accepted += buffer diff --git a/code/__HELPERS/text_vr.dm b/code/__HELPERS/text_vr.dm index 64e13ef65b..9be806fc54 100644 --- a/code/__HELPERS/text_vr.dm +++ b/code/__HELPERS/text_vr.dm @@ -9,8 +9,8 @@ return t proc/TextPreview(var/string,var/len=40) - if(lentext(string) <= len) - if(!lentext(string)) + if(length(string) <= len) + if(!length(string)) return "\[...\]" else return string diff --git a/code/__HELPERS/unused.dm b/code/__HELPERS/unused.dm index fce25720b7..6d41856fd1 100644 --- a/code/__HELPERS/unused.dm +++ b/code/__HELPERS/unused.dm @@ -11,7 +11,7 @@ var/dest_y /datum/projectile_data/New(var/src_x, var/src_y, var/time, var/distance, \ - var/power_x, var/power_y, var/dest_x, var/dest_y) + var/power_x, var/power_y, var/dest_x, var/dest_y) src.src_x = src_x src.src_y = src_y src.time = time diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index e49d458ceb..91f5105553 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -193,7 +193,7 @@ GLOBAL_LIST_INIT(bitfields, list( "clear_conversion" = list( "REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE, "REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE - ), + ), "organ_flags" = list( "ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC, "ORGAN_FROZEN" = ORGAN_FROZEN, diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 0cb61949a0..f0479cd8aa 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -1,6 +1,16 @@ GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST)) -GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(cardinals_multiz, list(NORTH, SOUTH, EAST, WEST, UP, DOWN)) GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) +GLOBAL_LIST_INIT(corners_multiz, list(UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(diagonals_multiz, list( + NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs_multiz, list( + NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, + UP, UP|NORTH, UP|SOUTH, UP|EAST, UP|WEST, UP|NORTHEAST, UP|NORTHWEST, UP|SOUTHEAST, UP|SOUTHWEST, + DOWN, DOWN|NORTH, DOWN|SOUTH, DOWN|EAST, DOWN|WEST, DOWN|NORTHEAST, DOWN|NORTHWEST, DOWN|SOUTHEAST, DOWN|SOUTHWEST)) +GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) GLOBAL_LIST_EMPTY(landmarks_list) //list of all landmarks created GLOBAL_LIST_EMPTY(start_landmarks_list) //list of all spawn points created diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 8b5657a6f6..1707c3a536 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -1,6 +1,8 @@ GLOBAL_LIST_EMPTY(clients) //all clients GLOBAL_LIST_EMPTY(admins) //all clients whom are admins GLOBAL_PROTECT(admins) +GLOBAL_LIST_EMPTY(mentors) //all clients whom are mentors +GLOBAL_PROTECT(mentors) GLOBAL_LIST_EMPTY(deadmins) //all ckeys who have used the de-admin verb. GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client diff --git a/code/_js/menus.dm b/code/_js/menus.dm index 9b2fc40e68..da56850b07 100644 --- a/code/_js/menus.dm +++ b/code/_js/menus.dm @@ -1,37 +1,37 @@ #define js_dropdowns {" function dropdowns() { - var divs = document.getElementsByTagName('div'); - var headers = new Array(); - var links = new Array(); - for(var i=0;i=0) { - elem.className = elem.className.replace('visible','hidden'); - this.className = this.className.replace('open','closed'); - this.innerHTML = this.innerHTML.replace('-','+'); - } - else { - elem.className = elem.className.replace('hidden','visible'); - this.className = this.className.replace('closed','open'); - this.innerHTML = this.innerHTML.replace('+','-'); - } - return false; - } - })(links\[i\]); - } - } + var divs = document.getElementsByTagName('div'); + var headers = new Array(); + var links = new Array(); + for(var i=0;i=0) { + elem.className = elem.className.replace('visible','hidden'); + this.className = this.className.replace('open','closed'); + this.innerHTML = this.innerHTML.replace('-','+'); + } + else { + elem.className = elem.className.replace('hidden','visible'); + this.className = this.className.replace('closed','open'); + this.innerHTML = this.innerHTML.replace('+','-'); + } + return false; + } + })(links\[i\]); + } + } } "} \ No newline at end of file diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index ddff0b6bd3..9485ea3374 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -68,9 +68,10 @@ /atom/movable/Adjacent(var/atom/neighbor) if(neighbor == loc) return TRUE - if(!isturf(loc)) + var/turf/T = loc + if(!istype(T)) return FALSE - if(loc.Adjacent(neighbor,target = neighbor, mover = src)) + if(T.Adjacent(neighbor, neighbor, src)) return TRUE return FALSE diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 58eabbdbcf..e9f50d9212 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -321,8 +321,7 @@ return /atom/proc/ShiftClick(mob/user) SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) - if(user.client && user.client.eye == user || user.client.eye == user.loc) - user.examinate(src) + user.examinate(src) return /* diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 8ee837a202..b2bc05924c 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -16,6 +16,28 @@ //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. /obj/screen/plane_master/proc/backdrop(mob/mymob) +/obj/screen/plane_master/openspace + name = "open space plane master" + plane = FLOOR_OPENSPACE_PLANE + appearance_flags = PLANE_MASTER + blend_mode = BLEND_MULTIPLY + alpha = 255 + +/obj/screen/plane_master/openspace/backdrop(mob/mymob) + filters = list() + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -10) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) + filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) + +/obj/screen/plane_master/proc/outline(_size, _color) + filters += filter(type = "outline", size = _size, color = _color) + +/obj/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") + filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) + +/obj/screen/plane_master/proc/clear_filters() + filters = list() + /obj/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index ea2919f342..a5d27819b8 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -34,7 +34,7 @@ if(_directory) directory = _directory if(entries) - CRASH("[THIS_PROC_TYPE_WEIRD] called more than once!") + CRASH("/datum/controller/configuration/Load() called more than once!") InitEntries() LoadModes() if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 36b57a4b7c..ed3cca587d 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -139,6 +139,14 @@ min_val = 0 max_val = 1 +/datum/config_entry/number/suicide_reenter_round_timer + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/roundstart_suicide_time_limit + config_entry_value = 30 + min_val = 0 + /datum/config_entry/number/shuttle_refuel_delay config_entry_value = 12000 min_val = 0 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index aab71fd015..a412ad2f48 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -141,6 +141,11 @@ /datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database protection = CONFIG_ENTRY_LOCKED +/datum/config_entry/flag/mentors_mobname_only + +/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/string/hostedby /datum/config_entry/flag/norespawn diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm new file mode 100644 index 0000000000..8395eda708 --- /dev/null +++ b/code/controllers/subsystem/adjacent_air.dm @@ -0,0 +1,35 @@ +SUBSYSTEM_DEF(adjacent_air) + name = "Atmos Adjacency" + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 10 + priority = FIRE_PRIORITY_ATMOS_ADJACENCY + var/list/queue = list() + +/datum/controller/subsystem/adjacent_air/stat_entry() +#ifdef TESTING + ..("P:[length(queue)], S:[GLOB.atmos_adjacent_savings[1]], T:[GLOB.atmos_adjacent_savings[2]]") +#else + ..("P:[length(queue)]") +#endif + +/datum/controller/subsystem/adjacent_air/Initialize() + while(length(queue)) + fire(mc_check = FALSE) + return ..() + +/datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + + var/list/queue = src.queue + + while (length(queue)) + var/turf/currT = queue[1] + queue.Cut(1,2) + + currT.ImmediateCalculateAdjacentTurfs() + + if(mc_check) + if(MC_TICK_CHECK) + break + else + CHECK_TICK \ No newline at end of file diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index efa6b8b59d..af7ae825f4 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -658,6 +658,46 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) +/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff) + var/mob/the_mob = N + if(!the_mob) + the_mob = M // cause this doesn't get assigned if player is a latejoiner + if(the_mob.client && the_mob.client.prefs && (the_mob.client.prefs.chosen_gear && the_mob.client.prefs.chosen_gear.len)) + if(!ishuman(M))//no silicons allowed + return + for(var/i in the_mob.client.prefs.chosen_gear) + var/datum/gear/G = i + G = GLOB.loadout_items[slot_to_string(initial(G.category))][initial(G.name)] + if(!G) + continue + var/permitted = TRUE + if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles)) + permitted = FALSE + if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) + permitted = FALSE + if(!equipbackpackstuff && G.category == SLOT_IN_BACKPACK)//snowflake check since plopping stuff in the backpack doesnt work for pre-job equip loadout stuffs + permitted = FALSE + if(equipbackpackstuff && G.category != SLOT_IN_BACKPACK)//ditto + permitted = FALSE + if(!permitted) + continue + var/obj/item/I = new G.path + if(!M.equip_to_slot_if_possible(I, G.category, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first + if(iscarbon(M)) + var/mob/living/carbon/C = M + var/obj/item/storage/backpack/B = C.back + if(!B || !SEND_SIGNAL(B, COMSIG_TRY_STORAGE_INSERT, I, null, TRUE, TRUE)) // Otherwise, try to put it in the backpack, for carbons. + I.forceMove(get_turf(C)) + else if(!M.equip_to_slot_if_possible(I, SLOT_IN_BACKPACK, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack + I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob. + +/datum/controller/subsystem/job/proc/FreeRole(rank) + if(!rank) + return + var/datum/job/job = GetJob(rank) + if(!job) + return FALSE + job.current_positions = max(0, job.current_positions - 1) /////////////////////////////////// //Keeps track of all living heads// diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index dec6cf8466..ceb2fae998 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -14,6 +14,7 @@ SUBSYSTEM_DEF(mapping) var/list/ruins_templates = list() var/list/space_ruins_templates = list() var/list/lava_ruins_templates = list() + var/datum/space_level/isolated_ruins_z //Created on demand during ruin loading. var/list/shuttle_templates = list() var/list/shelter_templates = list() @@ -25,6 +26,7 @@ SUBSYSTEM_DEF(mapping) var/list/datum/turf_reservations //list of turf reservations var/list/used_turfs = list() //list of turf = datum/turf_reservation + var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE // Z-manager stuff @@ -95,7 +97,7 @@ SUBSYSTEM_DEF(mapping) // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() - initialize_reserved_level() + initialize_reserved_level(transit.z_value) return ..() /* Nuke threats, for making the blue tiles on the station go RED @@ -442,7 +444,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) GLOB.the_gateway.wait = world.time /datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override, border_type_override) - UNTIL(initialized && !clearing_reserved_turfs) + UNTIL(reservation_ready["[z]"] && !clearing_reserved_turfs) var/datum/turf_reservation/reserve = new type if(turf_type_override) reserve.turf_type = turf_type_override @@ -454,8 +456,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) return reserve //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one num_of_res_levels += 1 - var/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) - if(reserve.Reserve(width, height, newReserved)) + var/datum/space_level/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + initialize_reserved_level(newReserved.z_value) + if(reserve.Reserve(width, height, newReserved.z_value)) return reserve else if(!level_trait(z, ZTRAIT_RESERVED)) @@ -467,19 +470,22 @@ GLOBAL_LIST_EMPTY(the_station_areas) QDEL_NULL(reserve) //This is not for wiping reserved levels, use wipe_reservations() for that. -/datum/controller/subsystem/mapping/proc/initialize_reserved_level() +/datum/controller/subsystem/mapping/proc/initialize_reserved_level(z) UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. - for(var/i in levels_by_trait(ZTRAIT_RESERVED)) - var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,i)) - var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,i)) - var/block = block(A, B) - for(var/t in block) - // No need to empty() these, because it's world init and they're - // already /turf/open/space/basic. - var/turf/T = t - T.flags_1 |= UNUSED_RESERVATION_TURF_1 - unused_turfs["[i]"] = block + if(!level_trait(z,ZTRAIT_RESERVED)) + clearing_reserved_turfs = FALSE + CRASH("Invalid z level prepared for reservations.") + var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) + var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) + var/block = block(A, B) + for(var/t in block) + // No need to empty() these, because it's world init and they're + // already /turf/open/space/basic. + var/turf/T = t + T.flags_1 |= UNUSED_RESERVATION_TURF_1 + unused_turfs["[z]"] = block + reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE /datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs) @@ -513,3 +519,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/B in areas) var/area/A = B A.reg_in_areas_in_z() + +/datum/controller/subsystem/mapping/proc/get_isolated_ruin_z() + if(!isolated_ruins_z) + isolated_ruins_z = add_new_zlevel("Isolated Ruins/Reserved", list(ZTRAIT_RESERVED = TRUE, ZTRAIT_ISOLATED_RUINS = TRUE)) + initialize_reserved_level(isolated_ruins_z.z_value) + return isolated_ruins_z.z_value \ No newline at end of file diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index 2e2f7edd99..18667053d4 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -69,6 +69,10 @@ SUBSYSTEM_DEF(pai) candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN) if("submit") + if(isobserver(usr)) + var/mob/dead/observer/O = usr + if(!O.can_reenter_round()) + return FALSE if(candidate) candidate.ready = 1 for(var/obj/item/paicard/p in pai_card_list) @@ -148,6 +152,8 @@ SUBSYSTEM_DEF(pai) continue if(!(ROLE_PAI in G.client.prefs.be_special)) continue + if(!G.can_reenter_round()) // this should use notify_ghosts() instead one day. + return FALSE to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.") addtimer(CALLBACK(src, .proc/spam_again), spam_delay) var/list/available = list() diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 51a2761f74..fe40b3f01f 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -638,3 +638,11 @@ SUBSYSTEM_DEF(shuttle) C.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) + +/datum/controller/subsystem/shuttle/proc/autoEnd() //CIT CHANGE - allows shift to end after 2 hours have passed. + if((world.realtime - SSshuttle.realtimeofstart) > auto_call && EMERGENCY_IDLE_OR_RECALLED) //2 hours + SSshuttle.emergency.request(silent = TRUE) + priority_announce("The shift has come to an end and the shuttle called. [seclevel2num(get_security_level()) == SEC_LEVEL_RED ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [emergency.timeLeft(600)] minutes.", null, "shuttlecalled", "Priority") + log_game("Round time limit reached. Shuttle has been auto-called.") + message_admins("Round time limit reached. Shuttle called.") + emergencyNoRecall = TRUE diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 96f359b069..d757b00493 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -148,6 +148,11 @@ SUBSYSTEM_DEF(throwing) if (callback) callback.Invoke() + if(!thrownthing.zfalling) // I don't think you can zfall while thrown but hey, just in case. + var/turf/T = get_turf(thrownthing) + if(T && thrownthing.has_gravity(T)) + T.zFall(thrownthing) + qdel(src) /datum/thrownthing/proc/hit_atom(atom/A) diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index ee1f5b8c3d..33798d74f7 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(traumas) "cats" = strings(PHOBIA_FILE, "cats"), "syndicate"= strings(PHOBIA_FILE, "syndicate"), "eye" = strings(PHOBIA_FILE, "eye") - ) + ) phobia_mobs = list("spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot, /mob/living/simple_animal/bot/ed209)), @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(traumas) "syndicate" = typecacheof(list(/obj/item/stack/tile/mineral/plastitanium, /obj/machinery/computer/shuttle/syndicate, /obj/machinery/computer/shuttle/syndicate/recall, /obj/machinery/computer/shuttle/syndicate/drop_pod, /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate, /obj/machinery/recharge_station, /obj/machinery/porta_turret/syndicate, /obj/structure/closet/syndicate, /obj/machinery/suit_storage_unit/syndicate, /obj/item/clothing/under/syndicate, /obj/item/folder/syndicate, /obj/item/documents/syndicate, /obj/item/clothing/glasses/phantomthief/syndicate, /obj/item/antag_spawner/nuke_ops, /obj/item/storage/box/syndicate, - /obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver/syndie, + /obj/structure/fluff/empty_sleeper/syndicate, /obj/item/implant/radio/syndicate, /obj/item/clothing/head/helmet/space/syndicate, /obj/machinery/nuclearbomb/syndicate, /obj/item/grenade/syndieminibomb, /obj/item/storage/backpack/duffelbag/syndie, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/automatic/shotgun/bulldog, /obj/item/gun/ballistic/automatic/c20r, /obj/item/gun/ballistic/automatic/m90, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/storage/belt/grenade/full, /obj/item/gun/ballistic/automatic/sniper_rifle/syndicate, /obj/item/gun/energy/kinetic_accelerator/crossbow, /obj/item/melee/transforming/energy/sword/saber, /obj/item/twohanded/dualsaber, /obj/item/melee/powerfist, /obj/item/storage/box/syndie_kit, /obj/item/grenade/spawnergrenade/manhacks, /obj/item/grenade/chem_grenade/bioterrorfoam, /obj/item/reagent_containers/spray/chemsprayer/bioterror, /obj/item/ammo_box/magazine/m10mm, /obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate, diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 2391b4c839..5e44f2e4c3 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -74,10 +74,10 @@ SUBSYSTEM_DEF(weather) next_hit_by_zlevel["[z]"] = null /datum/controller/subsystem/weather/proc/get_weather(z, area/active_area) - var/datum/weather/A - for(var/V in processing) - var/datum/weather/W = V - if((z in W.impacted_z_levels) && W.area_type == active_area.type) - A = W - break - return A + var/datum/weather/A + for(var/V in processing) + var/datum/weather/W = V + if((z in W.impacted_z_levels) && W.area_type == active_area.type) + A = W + break + return A diff --git a/code/datums/armor.dm b/code/datums/armor.dm index cbf4b76c60..85915395f8 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,70 +1,70 @@ #define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]" /proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - . = locate(ARMORID) - if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) + . = locate(ARMORID) + if (!.) + . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) /datum/armor - datum_flags = DF_USE_TAG - var/melee - var/bullet - var/laser - var/energy - var/bomb - var/bio - var/rad - var/fire - var/acid - var/magic + datum_flags = DF_USE_TAG + var/melee + var/bullet + var/laser + var/energy + var/bomb + var/bio + var/rad + var/fire + var/acid + var/magic /datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - src.melee = melee - src.bullet = bullet - src.laser = laser - src.energy = energy - src.bomb = bomb - src.bio = bio - src.rad = rad - src.fire = fire - src.acid = acid - src.magic = magic - tag = ARMORID + src.melee = melee + src.bullet = bullet + src.laser = laser + src.energy = energy + src.bomb = bomb + src.bio = bio + src.rad = rad + src.fire = fire + src.acid = acid + src.magic = magic + tag = ARMORID /datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) + return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) + return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier) /datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic) - return getArmor((isnull(melee) ? src.melee : melee),\ - (isnull(bullet) ? src.bullet : bullet),\ - (isnull(laser) ? src.laser : laser),\ - (isnull(energy) ? src.energy : energy),\ - (isnull(bomb) ? src.bomb : bomb),\ - (isnull(bio) ? src.bio : bio),\ - (isnull(rad) ? src.rad : rad),\ - (isnull(fire) ? src.fire : fire),\ - (isnull(acid) ? src.acid : acid),\ - (isnull(magic) ? src.magic : magic)) + return getArmor((isnull(melee) ? src.melee : melee),\ + (isnull(bullet) ? src.bullet : bullet),\ + (isnull(laser) ? src.laser : laser),\ + (isnull(energy) ? src.energy : energy),\ + (isnull(bomb) ? src.bomb : bomb),\ + (isnull(bio) ? src.bio : bio),\ + (isnull(rad) ? src.rad : rad),\ + (isnull(fire) ? src.fire : fire),\ + (isnull(acid) ? src.acid : acid),\ + (isnull(magic) ? src.magic : magic)) /datum/armor/proc/getRating(rating) - return vars[rating] + return vars[rating] /datum/armor/proc/getList() - return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) + return list("melee" = melee, "bullet" = bullet, "laser" = laser, "energy" = energy, "bomb" = bomb, "bio" = bio, "rad" = rad, "fire" = fire, "acid" = acid, "magic" = magic) /datum/armor/proc/attachArmor(datum/armor/AA) - return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) + return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic) /datum/armor/proc/detachArmor(datum/armor/AA) - return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) + return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic) /datum/armor/vv_edit_var(var_name, var_value) - if (var_name == NAMEOF(src, tag)) - return FALSE - . = ..() - tag = ARMORID // update tag in case armor values were edited + if (var_name == NAMEOF(src, tag)) + return FALSE + . = ..() + tag = ARMORID // update tag in case armor values were edited #undef ARMORID diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 4c501a3e7f..60434d2766 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -194,7 +194,7 @@ .=..() opentime = 0 -/datum/browser/modal/open() +/datum/browser/modal/open(use_onclose = 1) set waitfor = 0 opentime = world.time diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 8c6013aeab..a3a9d96a55 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -8,7 +8,7 @@ var/mood_level = 5 //To track what stage of moodies they're on var/sanity_level = 5 //To track what stage of sanity they're on var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets - var/datum/mood_event/list/mood_events = list() + var/list/datum/mood_event/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? var/obj/screen/mood/screen_obj diff --git a/code/datums/components/storage/concrete/special.dm b/code/datums/components/storage/concrete/special.dm index 556e9e9fc9..9f2c435642 100644 --- a/code/datums/components/storage/concrete/special.dm +++ b/code/datums/components/storage/concrete/special.dm @@ -1,5 +1,5 @@ -/datum/component/storage/concrete/secret_satchel/can_be_inserted(I,msg,user) +/datum/component/storage/concrete/secret_satchel/can_be_inserted(obj/item/I, stop_messages = FALSE, mob/M) if(SSpersistence.spawned_objects[I]) - to_chat(user, "[I] is unstable after its journey through space and time, it wouldn't survive another trip.") + to_chat(M, "[I] is unstable after its journey through space and time, it wouldn't survive another trip.") return FALSE return ..() diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index a1f538e4dd..f09a92c91c 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -1,15 +1,15 @@ /datum/component/waddling - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /datum/component/waddling/Initialize() - if(!isliving(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle) /datum/component/waddling/proc/Waddle() - var/mob/living/L = parent - if(L.incapacitated() || L.lying) - return - animate(L, pixel_z = 4, time = 0) - animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) - animate(pixel_z = 0, transform = matrix(), time = 0) + var/mob/living/L = parent + if(L.incapacitated() || L.lying) + return + animate(L, pixel_z = 4, time = 0) + animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) + animate(pixel_z = 0, transform = matrix(), time = 0) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 84b0320375..38b17993d8 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -88,6 +88,9 @@ if(TURF_WET_PERMAFROST) intensity = 120 lube_flags = SLIDE_ICE | GALOSHES_DONT_HELP + if(TURF_WET_SUPERLUBE) + intensity = 120 + lube_flags = SLIDE | GALOSHES_DONT_HELP | SLIP_WHEN_CRAWLING else qdel(parent.GetComponent(/datum/component/slippery)) return @@ -159,7 +162,7 @@ //NB it's possible we get deleted after this, due to inherit /datum/component/wet_floor/proc/add_wet(type, duration_minimum = 0, duration_add = 0, duration_maximum = MAXIMUM_WET_TIME, _permanent = FALSE) - var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST) + var/static/list/allowed_types = list(TURF_WET_WATER, TURF_WET_LUBE, TURF_WET_ICE, TURF_WET_PERMAFROST, TURF_WET_SUPERLUBE) if(duration_minimum <= 0 || !type) return FALSE if(type in allowed_types) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index cdb195dd82..8737cd8feb 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -4,7 +4,7 @@ var/list/datum_components //for /datum/components var/list/status_traits var/list/comp_lookup //it used to be for looking up components which had registered a signal but now anything can register - var/list/signal_procs + var/list/list/datum/callback/signal_procs var/signal_enabled = FALSE var/datum_flags = NONE var/datum/weakref/weak_reference diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index cfbd8be32c..e44134f01f 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -875,14 +875,14 @@ return // text2num conveniently returns a null on invalid values O.armor = O.armor.setRating(melee = text2num(result["values"]["melee"]),\ - bullet = text2num(result["values"]["bullet"]),\ - laser = text2num(result["values"]["laser"]),\ - energy = text2num(result["values"]["energy"]),\ - bomb = text2num(result["values"]["bomb"]),\ - bio = text2num(result["values"]["bio"]),\ - rad = text2num(result["values"]["rad"]),\ - fire = text2num(result["values"]["fire"]),\ - acid = text2num(result["values"]["acid"])) + bullet = text2num(result["values"]["bullet"]),\ + laser = text2num(result["values"]["laser"]),\ + energy = text2num(result["values"]["energy"]),\ + bomb = text2num(result["values"]["bomb"]),\ + bio = text2num(result["values"]["bio"]),\ + rad = text2num(result["values"]["rad"]),\ + fire = text2num(result["values"]["fire"]),\ + acid = text2num(result["values"]["acid"])) log_admin("[key_name(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") message_admins("[key_name_admin(usr)] modified the armor on [O] ([O.type]) to melee: [O.armor.melee], bullet: [O.armor.bullet], laser: [O.armor.laser], energy: [O.armor.energy], bomb: [O.armor.bomb], bio: [O.armor.bio], rad: [O.armor.rad], fire: [O.armor.fire], acid: [O.armor.acid]") else diff --git a/code/datums/embedding_behavior.dm b/code/datums/embedding_behavior.dm index f631b9b1c4..a261ea48c6 100644 --- a/code/datums/embedding_behavior.dm +++ b/code/datums/embedding_behavior.dm @@ -1,53 +1,53 @@ #define EMBEDID "embed-[embed_chance]-[embedded_fall_chance]-[embedded_pain_chance]-[embedded_pain_multiplier]-[embedded_fall_pain_multiplier]-[embedded_impact_pain_multiplier]-[embedded_unsafe_removal_pain_multiplier]-[embedded_unsafe_removal_time]" /proc/getEmbeddingBehavior(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - . = locate(EMBEDID) - if (!.) - . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) + embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, + embedded_pain_chance = EMBEDDED_PAIN_CHANCE, + embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, + embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, + embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) + . = locate(EMBEDID) + if (!.) + . = new /datum/embedding_behavior(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) /datum/embedding_behavior - var/embed_chance - var/embedded_fall_chance - var/embedded_pain_chance - var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) - var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) - var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) - var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) - var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. + var/embed_chance + var/embedded_fall_chance + var/embedded_pain_chance + var/embedded_pain_multiplier //The coefficient of multiplication for the damage this item does while embedded (this*w_class) + var/embedded_fall_pain_multiplier //The coefficient of multiplication for the damage this item does when falling out of a limb (this*w_class) + var/embedded_impact_pain_multiplier //The coefficient of multiplication for the damage this item does when first embedded (this*w_class) + var/embedded_unsafe_removal_pain_multiplier //The coefficient of multiplication for the damage removing this without surgery causes (this*w_class) + var/embedded_unsafe_removal_time //A time in ticks, multiplied by the w_class. /datum/embedding_behavior/New(embed_chance = EMBED_CHANCE, - embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, - embedded_pain_chance = EMBEDDED_PAIN_CHANCE, - embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, - embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, - embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) - src.embed_chance = embed_chance - src.embedded_fall_chance = embedded_fall_chance - src.embedded_pain_chance = embedded_pain_chance - src.embedded_pain_multiplier = embedded_pain_multiplier - src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier - src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier - src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier - src.embedded_unsafe_removal_time = embedded_unsafe_removal_time - tag = EMBEDID + embedded_fall_chance = EMBEDDED_ITEM_FALLOUT, + embedded_pain_chance = EMBEDDED_PAIN_CHANCE, + embedded_pain_multiplier = EMBEDDED_PAIN_MULTIPLIER, + embedded_fall_pain_multiplier = EMBEDDED_FALL_PAIN_MULTIPLIER, + embedded_impact_pain_multiplier = EMBEDDED_IMPACT_PAIN_MULTIPLIER, + embedded_unsafe_removal_pain_multiplier = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, + embedded_unsafe_removal_time = EMBEDDED_UNSAFE_REMOVAL_TIME) + src.embed_chance = embed_chance + src.embedded_fall_chance = embedded_fall_chance + src.embedded_pain_chance = embedded_pain_chance + src.embedded_pain_multiplier = embedded_pain_multiplier + src.embedded_fall_pain_multiplier = embedded_fall_pain_multiplier + src.embedded_impact_pain_multiplier = embedded_impact_pain_multiplier + src.embedded_unsafe_removal_pain_multiplier = embedded_unsafe_removal_pain_multiplier + src.embedded_unsafe_removal_time = embedded_unsafe_removal_time + tag = EMBEDID /datum/embedding_behavior/proc/setRating(embed_chance, embedded_fall_chance, embedded_pain_chance, embedded_pain_multiplier, embedded_fall_pain_multiplier, embedded_impact_pain_multiplier, embedded_unsafe_removal_pain_multiplier, embedded_unsafe_removal_time) - return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ - (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ - (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ - (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ - (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ - (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ - (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ - (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time)) + return getEmbeddingBehavior((isnull(embed_chance) ? src.embed_chance : embed_chance),\ + (isnull(embedded_fall_chance) ? src.embedded_fall_chance : embedded_fall_chance),\ + (isnull(embedded_pain_chance) ? src.embedded_pain_chance : embedded_pain_chance),\ + (isnull(embedded_pain_multiplier) ? src.embedded_pain_multiplier : embedded_pain_multiplier),\ + (isnull(embedded_fall_pain_multiplier) ? src.embedded_fall_pain_multiplier : embedded_fall_pain_multiplier),\ + (isnull(embedded_impact_pain_multiplier) ? src.embedded_impact_pain_multiplier : embedded_impact_pain_multiplier),\ + (isnull(embedded_unsafe_removal_pain_multiplier) ? src.embedded_unsafe_removal_pain_multiplier : embedded_unsafe_removal_pain_multiplier),\ + (isnull(embedded_unsafe_removal_time) ? src.embedded_unsafe_removal_time : embedded_unsafe_removal_time)) #undef EMBEDID diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index e07fa27ef5..81ec0bf977 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -192,7 +192,7 @@ if (T && isturf(T)) if (!D.stat) D.emote("scream") - D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human/.Knockdown, 20)) + D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human.proc/Knockdown, 20)) log_combat(A, D, "has thrown with wrestling") return 0 diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index f747c563ad..f4ca3a8ebd 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -5,8 +5,8 @@ mood_change = -1 /datum/mood_event/broken_vow //Used for when mimes break their vow of silence - description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow...\n" - mood_change = -8 + description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow...\n" + mood_change = -8 /datum/mood_event/on_fire description = "I'M ON FIRE!!!\n" @@ -55,14 +55,14 @@ timeout = 2 MINUTES /datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord - description = "I can't even end it all!\n" - mood_change = -10 - timeout = 1 MINUTES + description = "I can't even end it all!\n" + mood_change = -10 + timeout = 1 MINUTES /datum/mood_event/dismembered - description = "AHH! I WAS USING THAT LIMB!\n" - mood_change = -8 - timeout = 2400 + description = "AHH! I WAS USING THAT LIMB!\n" + mood_change = -8 + timeout = 2400 /datum/mood_event/noshoes description = "I am a disgrace to comedy everywhere!\n" @@ -92,20 +92,20 @@ mood_change = 2 /datum/mood_event/brain_damage - mood_change = -3 + mood_change = -3 /datum/mood_event/brain_damage/add_effects() - var/damage_message = pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage") - description = "Hurr durr... [damage_message]\n" + var/damage_message = pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage") + description = "Hurr durr... [damage_message]\n" /datum/mood_event/hulk //Entire duration of having the hulk mutation - description = "HULK SMASH!\n" - mood_change = -4 + description = "HULK SMASH!\n" + mood_change = -4 /datum/mood_event/epilepsy //Only when the mutation causes a seizure - description = "I should have paid attention to the epilepsy warning.\n" - mood_change = -3 - timeout = 3000 + description = "I should have paid attention to the epilepsy warning.\n" + mood_change = -3 + timeout = 3000 /datum/mood_event/nyctophobia description = "It sure is dark around here...\n" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 422ec4476c..678802aed9 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -80,12 +80,12 @@ description = "Heh...hehehe...hehe...\n" mood_change = 4 - /datum/mood_event/chemical_laughter +/datum/mood_event/chemical_laughter description = "Laughter really is the best medicine! Or is it?\n" mood_change = 4 timeout = 3 MINUTES - /datum/mood_event/chemical_superlaughter +/datum/mood_event/chemical_superlaughter description = "*WHEEZE*\n" mood_change = 12 timeout = 3 MINUTES diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index efa248b4f0..f689ff903e 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(mutations_list) . = on_losing(owner) /datum/mutation/human/proc/set_se(se_string, on = 1) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) + if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1) var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE) @@ -42,7 +42,7 @@ GLOBAL_LIST_EMPTY(mutations_list) owner.dna.struc_enzymes = set_se(owner.dna.struc_enzymes, on) /datum/mutation/human/proc/check_block_string(se_string) - if(!se_string || lentext(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) + if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE) return 0 if(hex2num(getblock(se_string, dna_block)) >= lowest_value) return 1 diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 18efae955e..4f18e6fd62 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -163,6 +163,13 @@ suffix = "lavaland_surface_xeno_nest.dmm" cost = 20 */ +/datum/map_template/ruin/lavaland/alien_nest + name = "Alien Nest" + id = "alien-nest" + description = "Not even Necropolis is safe from alien infestation. The competition for hosts has locked the legion and aliens in an endless conflict that can only be resolved by a PKA." + suffix = "lavaland_surface_alien_nest.dmm" + cost = 20 + /datum/map_template/ruin/lavaland/fountain name = "Fountain Hall" id = "fountain" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 563d06ca57..5c4fc61827 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -170,7 +170,7 @@ tick_interval = 4 alert_type = /obj/screen/alert/status_effect/his_grace var/bloodlust = 0 - + /obj/screen/alert/status_effect/his_grace name = "His Grace" desc = "His Grace hungers, and you must feed Him." @@ -356,7 +356,7 @@ var/new_staminaloss = owner.getStaminaLoss() if(new_staminaloss < last_staminaloss) var/heal_amount = -5 // CIT CHANGE - makes blood drunk status effect not exhaust you - owner.adjustStaminaLoss(heal_amount, updating_health = FALSE) + owner.adjustStaminaLoss(heal_amount, FALSE) new_staminaloss = owner.getStaminaLoss() needs_health_update = TRUE last_staminaloss = new_staminaloss diff --git a/code/datums/verbs.dm b/code/datums/verbs.dm index 79fe256bb4..d8d7ee7433 100644 --- a/code/datums/verbs.dm +++ b/code/datums/verbs.dm @@ -11,7 +11,7 @@ //do things for each entry in Generate_list //return value sets Generate_list[verbpath] -/datum/verbs/proc/HandleVerb(list/entry, atom/verb/verbpath, ...) +/datum/verbs/proc/HandleVerb(list/entry, procpath/verbpath, ...) return entry /datum/verbs/New() @@ -82,7 +82,7 @@ . += childlist for (var/thing in verblist) - var/atom/verb/verbpath = thing + var/procpath/verbpath = thing if (!verbpath) stack_trace("Bad VERB in [type] verblist: [english_list(verblist)]") var/list/entry = list() diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 345212cc1b..3247b890c6 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -80,7 +80,7 @@ return TRUE if(ishuman(L)) //Are you immune? var/mob/living/carbon/human/H = L - var/thermal_protection = H.get_thermal_protection() + var/thermal_protection = H.easy_thermal_protection() if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) return TRUE if(isliving(L))// if we're a non immune mob inside an immune mob we have to reconsider if that mob is immune to protect ourselves diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 26942a1ba6..db6d80f9bb 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -1,10 +1,35 @@ /datum/wires/airlock holder_type = /obj/machinery/door/airlock - proper_name = "Airlock" + proper_name = "Generic Airlock" + var/wiretype /datum/wires/airlock/secure randomize = TRUE +/datum/wires/airlock/command + proper_name = "Command Airlock" + wiretype = "commandairlock" + +/datum/wires/airlock/security + proper_name = "Security Airlock" + wiretype = "securityairlock" + +/datum/wires/airlock/engineering + proper_name = "Engineering Airlock" + wiretype = "engineeringairlock" + +/datum/wires/airlock/science + proper_name = "Science Airlock" + wiretype = "scienceairlock" + +/datum/wires/airlock/medical + proper_name = "Medical Airlock" + wiretype = "medicalairlock" + +/datum/wires/airlock/cargo + proper_name = "Cargo Airlock" + wiretype = "cargoairlock" + /datum/wires/airlock/New(atom/holder) wires = list( WIRE_POWER1, WIRE_POWER2, @@ -14,7 +39,16 @@ WIRE_ZAP1, WIRE_ZAP2 ) add_duds(2) - ..() + . = ..() + if(randomize || !wiretype) + return + if(!GLOB.wire_color_directory[wiretype]) + colors = list() + randomize() + GLOB.wire_color_directory[wiretype] = colors + GLOB.wire_name_directory[wiretype] = proper_name + else + colors = GLOB.wire_color_directory[wiretype] /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 798cd9c026..fa66306302 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -250,7 +250,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/maintenance/disposal/incinerator name = "Incinerator" icon_state = "disposal" +/area/maintenance/bar + name = "Maintenance Bar" + icon_state = "maintbar" +/area/maintenance/bar/cafe + name = "Abandoned Cafe" //Hallway @@ -499,6 +504,16 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Abandoned Theatre" icon_state = "Theatre" +/area/crew_quarters/theatre/clown + name = "Clown's Office" + +/area/crew_quarters/theatre/mime + name = "Mime's Office" + +/area/crew_quarters/cryopod + name = "Cryogenics" + icon_state = "cryosleep" + /area/library name = "Library" icon_state = "library" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 69ae5f1bb2..81dab0628d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -186,6 +186,10 @@ else M.forceMove(src) +//common name +/atom/proc/update_multiz(prune_on_fail = FALSE) + return FALSE + /atom/proc/assume_air(datum/gas_mixture/giver) qdel(giver) return null @@ -266,7 +270,7 @@ if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) should_override = TRUE - + if(blood_DNA && !istype(src, /obj/effect/decal)) override[EXAMINE_POSITION_BEFORE] = " blood-stained " should_override = TRUE @@ -563,7 +567,7 @@ //Hook for running code when a dir change occurs -/atom/proc/setDir(newdir) +/atom/proc/setDir(newdir, ismousemovement=FALSE) SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) dir = newdir @@ -832,4 +836,7 @@ Proc for attack log creation, because really why not if(filter_data && filter_data[name]) filter_data -= name update_filters() - return TRUE \ No newline at end of file + return TRUE + +/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 7335140928..5d931828ca 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -37,6 +37,51 @@ var/datum/component/orbiter/orbiting var/can_be_z_moved = TRUE + var/zfalling = FALSE + +/atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) + if(!direction) + direction = DOWN + if(!source) + source = get_turf(src) + if(!source) + return FALSE + if(!target) + target = get_step_multiz(source, direction) + if(!target) + return FALSE + return !(movement_type & FLYING) && has_gravity(source) && !throwing + +/atom/movable/proc/onZImpact(turf/T, levels) + var/atom/highest = T + for(var/i in T.contents) + var/atom/A = i + if(!A.density) + continue + if(isobj(A) || ismob(A)) + if(A.layer > highest.layer) + highest = A + INVOKE_ASYNC(src, .proc/SpinAnimation, 5, 2) + throw_impact(highest) + return TRUE + +//For physical constraints to travelling up/down. +/atom/movable/proc/can_zTravel(turf/destination, direction) + var/turf/T = get_turf(src) + if(!T) + return FALSE + if(!direction) + if(!destination) + return FALSE + direction = get_dir(T, destination) + if(direction != UP && direction != DOWN) + return FALSE + if(!destination) + destination = get_step_multiz(src, direction) + if(!destination) + return FALSE + return T.zPassOut(src, direction, destination) && destination.zPassIn(src, direction, T) + /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list("step_x", "step_y", "step_size") var/static/list/careful_edits = list("bound_x", "bound_y", "bound_width", "bound_height") diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 51a34f4194..76e6268977 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -167,6 +167,7 @@ Credit where due: number_players -= 30 starter_servants += round(number_players / 10) starter_servants = min(starter_servants, 8) //max 8 servants (that sould only happen with a ton of players) + GLOB.clockwork_vitality += 50 * starter_servants //some starter Vitality to help recover from initial fuck ups while(starter_servants) var/datum/mind/servant = antag_pick(antag_candidates) servants_to_serve += servant diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 79f168e892..f6dbe07fb8 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -138,7 +138,7 @@ var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery) slipper.signal_enabled = active -/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1) +/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) if(active) if(iscarbon(thrower)) var/mob/living/carbon/C = thrower diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index f24301d716..cc90821618 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -29,10 +29,10 @@ // So for example you can get the list of all current dead players with var/list/dead_players = candidates[CURRENT_DEAD_PLAYERS] // Make sure to properly typecheck the mobs in those lists, as the dead_players list could contain ghosts, or dead players still in their bodies. // We're still gonna trim the obvious (mobs without clients, jobbanned players, etc) - living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) - living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) - dead_players = trim_list(mode.current_players[CURRENT_DEAD_PLAYERS]) - list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) + living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) + living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) + dead_players = trim_list(mode.current_players[CURRENT_DEAD_PLAYERS]) + list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) /datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) var/list/trimmed_list = L.Copy() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 6a9aefa996..abca269eeb 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -126,7 +126,7 @@ /datum/dynamic_ruleset/roundstart/changeling/execute() var/team_mode = FALSE - if(prob(team_mode_probability)) + if(prob(team_mode_probability)) team_mode = TRUE var/list/team_objectives = subtypesof(/datum/objective/changeling_team_objective) var/list/possible_team_objectives = list() @@ -174,14 +174,14 @@ /datum/dynamic_ruleset/roundstart/wizard/pre_execute() if(GLOB.wizardstart.len == 0) return FALSE - + var/mob/M = pick(candidates) if (M) candidates -= M assigned += M.mind M.mind.assigned_role = ROLE_WIZARD M.mind.special_role = ROLE_WIZARD - + return TRUE /datum/dynamic_ruleset/roundstart/wizard/execute() @@ -189,7 +189,7 @@ M.current.forceMove(pick(GLOB.wizardstart)) M.add_antag_datum(new antag_datum()) return TRUE - + ////////////////////////////////////////////// // // // BLOOD CULT // @@ -238,7 +238,7 @@ var/datum/antagonist/cult/new_cultist = new antag_datum() new_cultist.cult_team = main_cult new_cultist.give_equipment = TRUE - M.add_antag_datum(new_cultist) + M.add_antag_datum(new_cultist) main_cult.setup_objectives() return TRUE @@ -390,7 +390,7 @@ SSshuttle.registerHostileEnvironment(src) return TRUE - + /datum/dynamic_ruleset/roundstart/delayed/revs/rule_process() if(check_rev_victory()) finished = 1 @@ -492,6 +492,7 @@ number_players -= 30 starter_servants += round(number_players / 10) starter_servants = min(starter_servants, 8) + GLOB.clockwork_vitality += 50 * starter_servants //some starter Vitality to help recover from initial fuck ups for (var/i in 1 to starter_servants) var/mob/servant = pick(candidates) candidates -= servant @@ -605,7 +606,7 @@ high_population_requirement = 101 var/devil_limit = 4 // Hard limit on devils if scaling is turned off -/datum/dynamic_ruleset/roundstart/devil/pre_execute() +/datum/dynamic_ruleset/roundstart/devil/pre_execute() var/tsc = CONFIG_GET(number/traitor_scaling_coeff) var/num_devils = 1 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 17e26e66af..4d7b346241 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -31,7 +31,7 @@ var/recommended_enemies = 0 var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag var/mob/living/living_antag_player = null - var/list/datum/game_mode/replacementmode = null + var/datum/game_mode/replacementmode = null var/round_converted = 0 //0: round not converted, 1: round going to convert, 2: round converted var/reroll_friendly //During mode conversion only these are in the running var/continuous_sanity_checked //Catches some cases where config options could be used to suggest that modes without antagonists should end when all antagonists die diff --git a/code/game/machinery/aug_manipulator.dm b/code/game/machinery/aug_manipulator.dm index 99200e510e..8419f5803c 100644 --- a/code/game/machinery/aug_manipulator.dm +++ b/code/game/machinery/aug_manipulator.dm @@ -16,8 +16,8 @@ to_chat(user, "Alt-click to eject the limb.") /obj/machinery/aug_manipulator/Initialize() - initial_icon_state = initial(icon_state) - return ..() + initial_icon_state = initial(icon_state) + return ..() /obj/machinery/aug_manipulator/update_icon() cut_overlays() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 89c5e56b71..e65da0fcff 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -354,7 +354,8 @@ O.organ_flags &= ~ORGAN_FROZEN unattached_flesh.Cut() mess = FALSE - new /obj/effect/gibspawner/generic(get_turf(src)) + if(mob_occupant) + mob_occupant.spawn_gibs() audible_message("You hear a splat.") update_icon() return @@ -474,8 +475,6 @@ flesh_number = unattached_flesh.len -#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' - /obj/machinery/clonepod/update_icon() cut_overlays() diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9d49574317..394cc4593d 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -468,7 +468,7 @@ var/len = length(viable_occupant.dna.uni_identity) num = WRAP(num, 1, len+1) num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2 - //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low + //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low var/block = round((num-1)/DNA_BLOCK_SIZE)+1 var/subblock = num - block*DNA_BLOCK_SIZE last_change = "UI #[block]-[subblock]; " diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm index 67407d220e..75e4a866f0 100644 --- a/code/game/machinery/computer/telecrystalconsoles.dm +++ b/code/game/machinery/computer/telecrystalconsoles.dm @@ -148,7 +148,6 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E virgin = 0 /obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population. - ..() var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop) var/danger = GLOB.joined_player_list.len - nukeops.len danger = CEILING(danger, 10) diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index b5869ef36b..21fb70c38c 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -130,12 +130,12 @@ L[avoid_assoc_duplicate_keys(A.name, areaindex)] = R for(var/obj/item/implant/tracking/I in GLOB.tracked_implants) - if(!I.imp_in || !isliving(I.imp_in)) + if(!I.imp_in || !I.allow_teleport || !isliving(I.imp_in)) continue else var/mob/living/M = I.imp_in if(M.stat == DEAD) - if(M.timeofdeath + 6000 < world.time) + if(M.timeofdeath + I.lifespan_postmortem < world.time) continue if(is_eligible(M)) L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = M diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 4d252f1a46..98dd91d3bd 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -307,7 +307,6 @@ //Handle Borg stuff first if(iscyborg(mob_occupant)) var/mob/living/silicon/robot/R = mob_occupant - if(!istype(R)) return ..() R.contents -= R.mmi qdel(R.mmi) @@ -409,7 +408,7 @@ // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) - mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round + mob_occupant.ghostize(FALSE, penalize = TRUE) QDEL_NULL(occupant) open_machine() diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 1c6d713437..91306585b8 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -364,7 +364,7 @@ //for(var/mob/living/carbon/NS in rangers) // NS.resting = !NS.resting // NS.update_canmove() - time-- + time-- /obj/machinery/jukebox/disco/proc/dance5(var/mob/living/M) animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 365d19b826..f85fb3f310 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -83,6 +83,7 @@ var/boltDown = 'sound/machines/boltsdown.ogg' var/noPower = 'sound/machines/doorclick.ogg' var/previous_airlock = /obj/structure/door_assembly //what airlock assembly mineral plating was applied to + var/wiretypepath = /datum/wires/airlock // which set of per round randomized wires this airlock type has. var/airlock_material //material of inner filling; if its an airlock with glass, this should be set to "glass" var/overlays_file = 'icons/obj/doors/airlocks/station/overlays.dmi' var/note_overlay_file = 'icons/obj/doors/airlocks/station/overlays.dmi' //Used for papers and photos pinned to the airlock diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index becd89063f..59b49d5828 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -8,16 +8,19 @@ /obj/machinery/door/airlock/command icon = 'icons/obj/doors/airlocks/station/command.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_com + wiretypepath = /datum/wires/airlock/command normal_integrity = 450 /obj/machinery/door/airlock/security icon = 'icons/obj/doors/airlocks/station/security.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_sec + wiretypepath = /datum/wires/airlock/security normal_integrity = 450 /obj/machinery/door/airlock/engineering icon = 'icons/obj/doors/airlocks/station/engineering.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_eng + wiretypepath = /datum/wires/airlock/engineering /obj/machinery/door/airlock/engineering/abandoned abandoned = TRUE @@ -25,6 +28,7 @@ /obj/machinery/door/airlock/medical icon = 'icons/obj/doors/airlocks/station/medical.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_med + wiretypepath = /datum/wires/airlock/medical /obj/machinery/door/airlock/maintenance name = "maintenance access" @@ -44,11 +48,13 @@ name = "mining airlock" icon = 'icons/obj/doors/airlocks/station/mining.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_min + wiretypepath = /datum/wires/airlock/cargo /obj/machinery/door/airlock/atmos name = "atmospherics airlock" icon = 'icons/obj/doors/airlocks/station/atmos.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_atmo + wiretypepath = /datum/wires/airlock/engineering /obj/machinery/door/airlock/atmos/abandoned abandoned = TRUE @@ -56,6 +62,7 @@ /obj/machinery/door/airlock/research icon = 'icons/obj/doors/airlocks/station/research.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_research + wiretypepath = /datum/wires/airlock/science /obj/machinery/door/airlock/freezer name = "freezer airlock" @@ -65,10 +72,12 @@ /obj/machinery/door/airlock/science icon = 'icons/obj/doors/airlocks/station/science.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_science + wiretypepath = /datum/wires/airlock/science /obj/machinery/door/airlock/virology icon = 'icons/obj/doors/airlocks/station/virology.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_viro + wiretypepath = /datum/wires/airlock/medical ////////////////////////////////// /* @@ -376,6 +385,7 @@ icon = 'icons/obj/doors/airlocks/vault/vault.dmi' overlays_file = 'icons/obj/doors/airlocks/vault/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_vault + wiretypepath = /datum/wires/airlock/secure explosion_block = 2 normal_integrity = 400 // reverse engieneerd: 400 * 1.5 (sec lvl 6) = 600 = original security_level = 6 diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index db59f3f413..5418dcdb97 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -153,11 +153,11 @@ var/obj/item/storage/briefcase/launchpad/briefcase /obj/machinery/launchpad/briefcase/Initialize(mapload, briefcase) - . = ..() - if(!briefcase) - log_game("[src] has been spawned without a briefcase.") - return INITIALIZE_HINT_QDEL - src.briefcase = briefcase + . = ..() + if(!briefcase) + log_game("[src] has been spawned without a briefcase.") + return INITIALIZE_HINT_QDEL + src.briefcase = briefcase /obj/machinery/launchpad/briefcase/Destroy() QDEL_NULL(briefcase) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index c37c607a6e..6bf9930eec 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -515,7 +515,7 @@ GLOBAL_LIST_EMPTY(allCasters) if(href_list["set_channel_name"]) channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN) while (findtext(channel_name," ") == 1) - channel_name = copytext(channel_name,2,lentext(channel_name)+1) + channel_name = copytext(channel_name,2,length(channel_name)+1) updateUsrDialog() else if(href_list["set_channel_lock"]) c_locked = !c_locked diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 7aaab0d8ea..289f075302 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -647,6 +647,7 @@ has_cover = 0 scan_range = 9 req_access = list(ACCESS_SYNDICATE) + mode = TURRET_LETHAL stun_projectile = /obj/item/projectile/bullet lethal_projectile = /obj/item/projectile/bullet lethal_projectile_sound = 'sound/weapons/gunshot.ogg' @@ -695,6 +696,24 @@ stun_projectile = /obj/item/projectile/bullet/syndicate_turret lethal_projectile = /obj/item/projectile/bullet/syndicate_turret +/obj/machinery/porta_turret/syndicate/shuttle + scan_range = 9 + shot_delay = 3 + stun_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle + lethal_projectile = /obj/item/projectile/bullet/p50/penetrator/shuttle + lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg' + stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' + armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 80, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) + +/obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target) + if(target) + setDir(get_dir(base, target))//even if you can't shoot, follow the target + shootAt(target) + addtimer(CALLBACK(src, .proc/shootAt, target), 5) + addtimer(CALLBACK(src, .proc/shootAt, target), 10) + addtimer(CALLBACK(src, .proc/shootAt, target), 15) + return TRUE + /obj/machinery/porta_turret/ai faction = list("silicon") nonlethal_projectile = /obj/item/projectile/beam/disabler diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 1a8bc7ece4..73aadc99d0 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -109,7 +109,7 @@ var/atom/movable/AM = i var/obj/item/bodypart/head/as_head = AM var/obj/item/mmi/as_mmi = AM - var/brain_holder = istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || isbrain(AM) + var/brain_holder = 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) if(brain_holder) emergency_stop(AM) else if(isliving(AM)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index e9216ca736..ec53cc3210 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -243,7 +243,7 @@ else line1 = "CARGO" line2 = SSshuttle.supply.getTimerStr() - if(lentext(line2) > CHARS_PER_LINE) + if(length(line2) > CHARS_PER_LINE) line2 = "Error" update_display(line1, line2) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index d7c2a5734b..4a97aa1775 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -1,5 +1,5 @@ #define BUTTON_COOLDOWN 60 // cant delay the bomb forever -#define BUTTON_DELAY 50 //five seconds +#define BUTTON_DELAY 20 // two seconds /obj/machinery/syndicatebomb icon = 'icons/obj/assemblies.dmi' @@ -500,7 +500,7 @@ /obj/item/syndicatedetonator name = "big red button" - desc = "Your standard issue bomb synchronizing button. Five second safety delay to prevent 'accidents'." + desc = "Your standard issue bomb synchronizing button. Two second safety delay to prevent 'accidents'." icon = 'icons/obj/assemblies.dmi' icon_state = "bigred" item_state = "electronic" diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index ed29809f91..3a3d98ad1e 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -57,19 +57,19 @@ [js_byjax] [js_dropdowns] function SSticker() { - setInterval(function(){ - window.location='byond://?src=[REF(src)]&update_content=1'; - document.body.style.color = get_rand_color_string(); - document.body.style.background = get_rand_color_string(); - }, 1000); + setInterval(function(){ + window.location='byond://?src=[REF(src)]&update_content=1'; + document.body.style.color = get_rand_color_string(); + document.body.style.background = get_rand_color_string(); + }, 1000); } function get_rand_color_string() { - var color = new Array; - for(var i=0;i<3;i++){ - color.push(Math.floor(Math.random()*255)); - } - return "rgb("+color.toString()+")"; + var color = new Array; + for(var i=0;i<3;i++){ + color.push(Math.floor(Math.random()*255)); + } + return "rgb("+color.toString()+")"; } window.onload = function() { diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 4acf7981bc..b219f1fdec 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -34,12 +34,12 @@ ) /obj/machinery/mecha_part_fabricator/Initialize() - var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, - list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, - TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) - materials.precise_insertion = TRUE - stored_research = new - return ..() + var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, + list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0, + TRUE, /obj/item/stack, CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert)) + materials.precise_insertion = TRUE + stored_research = new + return ..() /obj/machinery/mecha_part_fabricator/RefreshParts() var/T = 0 diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm index 79ee7435e4..f9e04990fc 100644 --- a/code/game/mecha/mecha_topic.dm +++ b/code/game/mecha/mecha_topic.dm @@ -21,9 +21,9 @@ [js_byjax] [js_dropdowns] function SSticker() { - setInterval(function(){ - window.location='byond://?src=[REF(src)]&update_content=1'; - }, 1000); + setInterval(function(){ + window.location='byond://?src=[REF(src)]&update_content=1'; + }, 1000); } window.onload = function() { diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index b6a3c7cfef..2fa7277d8b 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -15,7 +15,7 @@ qdel(src) /obj/effect/decal/proc/NeverShouldHaveComeHere(turf/T) - return isspaceturf(T) || isclosedturf(T) || islava(T) || istype(T, /turf/open/water) || ischasm(T) + return isclosedturf(T) || isgroundlessturf(T) /obj/effect/decal/ex_act(severity, target) qdel(src) diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index ccde9c2254..6057d1b418 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -58,6 +58,9 @@ /obj/effect/abstract/singularity_act() return +/obj/effect/abstract/has_gravity(turf/T) + return FALSE + /obj/effect/dummy/singularity_pull() return diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index dd39bc567a..fe1590caba 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -32,7 +32,8 @@ var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling. var/body_coloring = "" if(source_mob) - dna_to_add = source_mob.get_blood_dna_list() //ez pz + if(!issilicon(source_mob)) + dna_to_add = source_mob.get_blood_dna_list() //ez pz if(ishuman(source_mob)) var/mob/living/carbon/human/H = source_mob if(H.dna.species.use_skintones) @@ -51,15 +52,11 @@ body_coloring = "#[skintone2hex(H.skin_tone)]" else body_coloring = "#[H.dna.features["mcolor"]]" - qdel(H) else dna_to_add = temp_mob.get_blood_dna_list() - qdel(temp_mob) else if(!issilicon(temp_mob)) dna_to_add = temp_mob.get_blood_dna_list() - qdel(temp_mob) - else - qdel(temp_mob) + qdel(temp_mob) else dna_to_add = list("Non-human DNA" = random_blood_type()) //else, generate a random bloodtype for it. diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index c92721082c..08a3501be6 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -201,7 +201,7 @@ S.directive = directive if(player_spiders) S.playable_spider = TRUE - notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER) + notify_ghosts("Spider [S.name] can be controlled", null, enter_link="(Click to play)", source=S, action=NOTIFY_ATTACK, ignore_key = POLL_IGNORE_SPIDER, ignore_dnr_observers = TRUE) qdel(src) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 8763089464..134b921666 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -163,6 +163,8 @@ RLD var/use_one_access = 0 //If the airlock should require ALL or only ONE of the listed accesses. var/delay_mod = 1 var/canRturf = FALSE //Variable for R walls to deconstruct them + var/adjacency_check = TRUE //Wheter it checks if the tool has to be in our hands or not. Wsed for the aux base construction drone's internal RCD + /obj/item/construction/rcd/suicide_act(mob/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") @@ -273,7 +275,7 @@ RLD /obj/item/construction/rcd/proc/check_menu(mob/living/user) if(!istype(user)) return FALSE - if(user.incapacitated() || !user.Adjacent(src)) + if(user.incapacitated() || (adjacency_check && !user.Adjacent(src))) return FALSE return TRUE @@ -286,7 +288,7 @@ RLD "SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"), "WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest") ) - var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE) + var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check, tooltips = TRUE) if(!check_menu(user)) return switch(computerdirs) @@ -345,13 +347,13 @@ RLD "External Maintenance" = get_airlock_image(/obj/machinery/door/airlock/maintenance/external/glass) ) - var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) + var/airlockcat = show_radial_menu(user, src, solid_or_glass_choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check) if(!check_menu(user)) return switch(airlockcat) if("Solid") if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) + var/airlockpaint = show_radial_menu(user, src, solid_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check) if(!check_menu(user)) return switch(airlockpaint) @@ -396,7 +398,7 @@ RLD if("Glass") if(advanced_airlock_setting == 1) - var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE) + var/airlockpaint = show_radial_menu(user, src , glass_choices, radius = 42, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = adjacency_check) if(!check_menu(user)) return switch(airlockpaint) diff --git a/code/game/objects/items/body_egg.dm b/code/game/objects/items/body_egg.dm index f0d20afbbd..59a5c50bf6 100644 --- a/code/game/objects/items/body_egg.dm +++ b/code/game/objects/items/body_egg.dm @@ -14,7 +14,7 @@ src.Insert(loc) return ..() -/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0) +/obj/item/organ/body_egg/Insert(var/mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC) owner.med_hud_set_status() diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 1059a310eb..6989557127 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -983,3 +983,12 @@ name = "Ore Silo (Machine Board)" build_path = /obj/machinery/ore_silo req_components = list() + +/obj/item/circuitboard/machine/autobottler + name = "Auto-Bottler (Machine Board)" + build_path = /obj/machinery/rnd/production/protolathe/department/autobottler //Manips make you print things cheaper, even chems + req_components = list(/obj/item/stock_parts/matter_bin = 5, + /obj/item/stack/sheet/glass = 2, + /obj/item/stock_parts/capacitor = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/reagent_containers/glass/beaker = 6) //So it can hold lots of chems \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 92d936e0d4..fa1ae55282 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -140,7 +140,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/choice = input(M, "Choose the a reskin for [src]","Reskin Object") as null|anything in GLOB.pda_reskins var/new_icon = GLOB.pda_reskins[choice] - if(QDELETED(src) || isnull(new_icon) || new_icon == icon || M.incapacitated() || !in_range(M,src)) + if(QDELETED(src) || isnull(new_icon) || new_icon == icon || !M.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return icon = new_icon update_icon(FALSE, TRUE) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 54b82d8e07..2da47d481e 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -10,7 +10,7 @@ /obj/item/pda/clown/Initialize() . = ..() - AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip)) + AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING|SLIP_WHEN_JOGGING, CALLBACK(src, .proc/AfterSlip)) /obj/item/pda/clown/proc/AfterSlip(mob/living/carbon/human/M) if (istype(M) && (M.real_name != owner)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 3885a1f4d9..8be18a5f61 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -697,7 +697,7 @@ Code: if(href_list["mule"]) //MULEbots are special snowflakes, and need different args due to how they work. - active_bot.bot_control(command= href_list["mule"], user= usr, pda= 1) + active_bot.bot_control(href_list["mule"], usr, TRUE) if(!host_pda) return @@ -772,4 +772,4 @@ Code: return "" //This is called for special abilities of cartridges -/obj/item/cartridge/proc/special(mov/living/user, list/params) +/obj/item/cartridge/proc/special(mob/living/user, list/params) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5ad5b41e95..d6737b94e9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -651,7 +651,7 @@ SLIME SCANNER /proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src) var/icon = target - user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") + user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].") var/list/airs = islist(mixture) ? mixture : list(mixture) diff --git a/code/game/objects/items/implants/implant_track.dm b/code/game/objects/items/implants/implant_track.dm index 4b7ae3bbac..4f81432a39 100644 --- a/code/game/objects/items/implants/implant_track.dm +++ b/code/game/objects/items/implants/implant_track.dm @@ -1,7 +1,19 @@ /obj/item/implant/tracking name = "tracking implant" desc = "Track with this." - activated = 0 + activated = FALSE + var/lifespan_postmortem = 10 MINUTES //for how many deciseconds after user death will the implant work? + var/allow_teleport = TRUE //will people implanted with this act as teleporter beacons? + +/obj/item/implant/tracking/c38 + name = "TRAC implant" + desc = "A smaller tracking implant that supplies power for only a few minutes." + var/lifespan = 5 MINUTES //how many deciseconds does the implant last? + allow_teleport = FALSE + +/obj/item/implant/tracking/c38/Initialize() + . = ..() + QDEL_IN(src, lifespan) /obj/item/implant/tracking/Initialize() . = ..() @@ -45,7 +57,7 @@ var/dat = {"Implant Specifications:
Name: Tracking Beacon
Life: 10 minutes after death of host
- Important Notes: None
+ Important Notes: Implant also works as a teleporter beacon.

Implant Details:
Function: Continuously transmits low power signal. Useful for tracking.
diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 6ae34e9ca2..d038ea7b4a 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -260,7 +260,7 @@ function pageloaded(myframe) { document.getElementById("loading").style.display = "none"; myframe.style.display = "inline"; - } + }

You start skimming through the manual...

@@ -295,7 +295,7 @@ function pageloaded(myframe) { document.getElementById("loading").style.display = "none"; myframe.style.display = "block"; - } + }

You start skimming through the manual...

diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 7494eb8e1c..bc3c98d27b 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -265,7 +265,7 @@ if (B && !QDELETED(B)) H.internal_organs -= B qdel(B) - new /obj/effect/gibspawner/generic(get_turf(H), H.dna) + H.spawn_gibs() return (BRUTELOSS) /obj/item/melee/classic_baton/telescopic/attack_self(mob/user) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 973fb0c0ab..90e2efabc4 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -558,6 +558,37 @@ item_state = "almaz" squeak_override = list('modular_citadel/sound/voice/raptor_purr.ogg' = 1) +/obj/item/toy/plush/lizardplushie/garou + icon_state = "garou" + item_state = "garou" + +/obj/item/toy/plush/lizardplushie/augments + icon_state = "augments" + item_state = "augments" + squeak_override = list('modular_citadel/sound/voice/weh.ogg' = 1) //I have no mouth and I must weh + attack_verb = list("hugged", "patted", "snugged", "booped") + +/obj/item/toy/plush/lizardplushie/xekov + icon_state = "xekov" + item_state = "xekov" + +/obj/item/toy/plush/lizardplushie/greg + icon_state = "greg" + item_state = "greg" + +/obj/item/toy/plush/lizardplushie/sin + icon_state = "sin" + item_state = "sin" + desc = "An adorable stuffed toy that resembles a lizardperson.. It faintly smells of sulfur." + +/obj/item/toy/plush/lizardplushie/ends + icon_state = "ends" + item_state = "ends" + +/obj/item/toy/plush/lizardplushie/lyssa + icon_state = "lyssa" + item_state = "lyssa" + /obj/item/toy/plush/snakeplushie name = "snake plushie" desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." @@ -715,6 +746,14 @@ item_state = "bhijn" attack_verb = list("closed", "reworked", "merged") +/obj/item/toy/plush/aiplush + name = "AI plushie" + desc = "A little stuffed toy AI core... it appears to be malfunctioning." + icon_state = "exo" + item_state = "exo" + attack_verb = list("hacked", "detonated", "overloaded") + squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1) + /obj/item/toy/plush/bird name = "bird plushie" desc = "An adorable stuffed plushie that resembles an avian." @@ -862,6 +901,18 @@ item_state = "redwood" attack_verb = list("ordered", "bapped", "reprimanded") +/obj/item/toy/plush/mammal/marisol + desc = "An adorable stuffed toy resembling a demi-wolf security officer." + icon_state = "marisol" + item_state = "marisol" + attack_verb = list("arrested", "harmbattoned", "lasered") + +/obj/item/toy/plush/mammal/minty + desc = "An adorable stuffed toy resembling some sort of crew member. It smells like mint.." + icon_state = "minty" + item_state = "minty" + attack_verb = list("freshened", "brushed") + /obj/item/toy/plush/mammal/dog desc = "An adorable stuffed toy that resembles a canine." icon_state = "katlin" @@ -929,8 +980,8 @@ /obj/item/toy/plush/catgirl/skylar desc = "An adorable stuffed toy that resembles a degenerate." - icon_state = "skylar" - item_state = "skylar" + icon_state = "skylar2" + item_state = "skylar2" attack_verb = list("powergamed", "merged", "tabled") squeak_override = list('sound/effects/meow1.ogg' = 1) @@ -942,15 +993,15 @@ desc = "A masked stuffed toy that resembles a feline scientist." icon_state = "trilby" item_state = "trilby" - attack_verb = list("pred", "coded", "remembered") + attack_verb = list("PR'd", "coded", "remembered") /obj/item/toy/plush/catgirl/fermis - name = "medcat plushie" - desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." - icon_state = "fermis" - item_state = "fermis" - attack_verb = list("cuddled", "petpatted", "wigglepurred") - squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) + name = "medcat plushie" + desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people." + icon_state = "fermis" + item_state = "fermis" + attack_verb = list("cuddled", "petpatted", "wigglepurred") + squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) /obj/item/toy/plush/catgirl/mariaf desc = "An adorable stuffed toy that resembles a very tall cat girl." diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c085306892..0aa19b13ef 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -10,6 +10,7 @@ * Runed Metal (cult) * Brass (clockwork cult) * Bronze (bake brass) + * Cotton/Duracotton */ /* @@ -186,31 +187,37 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ */ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \ + new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \ new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 10), \ + null, \ new/datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), \ new/datum/stack_recipe("rolling pin", /obj/item/kitchen/rollingpin, 2, time = 30), \ + new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ + new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ + null, \ new/datum/stack_recipe("wooden chair", /obj/structure/chair/wood/, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("plywood chair", /obj/structure/chair/comfy/plywood, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("rustic wooden door", /obj/structure/mineral_door/woodrustic, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ + null, \ + new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ - new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ - new/datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), \ - new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ - new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2), \ - new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 50, one_per_turf = TRUE, on_floor = TRUE),\ - new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),\ + new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \ + new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\ + null, \ + new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 10),\ + new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\ )) /obj/item/stack/sheet/mineral/wood @@ -272,6 +279,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ resistance_flags = FLAMMABLE force = 0 throwforce = 0 + pull_effort = 90 + is_fabric = TRUE + loom_result = /obj/item/stack/sheet/silk merge_type = /obj/item/stack/sheet/cloth /obj/item/stack/sheet/cloth/Initialize(mapload, new_amount, merge = TRUE) @@ -281,6 +291,22 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ /obj/item/stack/sheet/cloth/ten amount = 10 +/obj/item/stack/sheet/cloth/thirty + amount = 30 + +/obj/item/stack/sheet/silk + name = "silk" + desc = "A long soft material. This one is just made out of cotton rather then any spiders or wyrms" + singular_name = "silk sheet" + icon_state = "sheet-silk" + item_state = "sheet-cloth" + novariants = TRUE + merge_type = /obj/item/stack/sheet/silk + +//obj/item/stack/sheet/silk/Initialize(mapload, new_amount, merge = TRUE) +// recipes = GLOB.silk_recipes +// return ..() + //Durathread fuck slash-asterisk comments GLOBAL_LIST_INIT(durathread_recipes, list ( \ new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/durathread, 4, time = 40), @@ -649,6 +675,12 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra pull_effort = 30 loom_result = /obj/item/stack/sheet/cloth +/obj/item/stack/sheet/cotton/ten + amount = 10 + +/obj/item/stack/sheet/cotton/thirty + amount = 30 + /obj/item/stack/sheet/cotton/durathread name = "raw durathread bundle" desc = "A bundle of raw durathread ready to be spun on the loom." diff --git a/code/game/objects/items/storage/dakis.dm b/code/game/objects/items/storage/dakis.dm index 2703581a94..1939593c8e 100644 --- a/code/game/objects/items/storage/dakis.dm +++ b/code/game/objects/items/storage/dakis.dm @@ -7,7 +7,7 @@ desc = "A large pillow depicting a girl in a compromising position. Featuring as many dimensions as you." icon = 'icons/obj/daki.dmi' icon_state = "daki_base" - slot_flags = SLOT_BACK + slot_flags = ITEM_SLOT_BACK var/cooldowntime = 20 var/static/list/dakimakura_options = list("Callie","Casca","Chaika","Elisabeth","Foxy Grandpa","Haruko","Holo","Ian","Jolyne","Kurisu","Marie","Mugi","Nar'Sie","Patchouli","Plutia","Rei","Reisen","Naga","Squid","Squigly","Tomoko","Toriel","Umaru","Yaranaika","Yoko") //Kurisu is the ideal girl." - Me, Logos. diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 251703f907..ca7f7fe31a 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -288,7 +288,6 @@ GLOBAL_LIST_EMPTY(rubber_toolbox_icons) generate_rubber_toolbox_icon() icon = GLOB.rubber_toolbox_icons[icon_state] AddComponent(/datum/component/bouncy) - . = ..() /obj/item/storage/toolbox/proc/generate_rubber_toolbox_icon() var/icon/new_icon = icon(icon, icon_state) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index cdc8d063ed..980a94c85a 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -191,7 +191,7 @@ L.Knockdown(stunpwr) - L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented. + L.adjustStaminaLoss(stunpwr*0.1)//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented. L.apply_effect(EFFECT_STUTTER, stunforce) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) if(user) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index e16b0dd690..e0e875b739 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -79,7 +79,7 @@ continue var/mob/living/M = W.imp_in if (M.stat == DEAD) - if (M.timeofdeath + 6000 < world.time) + if (M.timeofdeath + W.lifespan_postmortem < world.time) continue var/turf/tr = get_turf(M) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 4d5762206a..ab2e39f348 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1293,8 +1293,8 @@ var/toysound = 'sound/machines/click.ogg' /obj/item/toy/figure/New() - desc = "A \"Space Life\" brand [src]." - ..() + desc = "A \"Space Life\" brand [src]." + ..() /obj/item/toy/figure/attack_self(mob/user as mob) if(cooldown <= world.time) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 172120861b..b9b08802d0 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -44,7 +44,7 @@ update_icon() PopulateContents() if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents - take_contents() + addtimer(CALLBACK(src, .proc/take_contents), 0) if(secure) lockerelectronics = new(src) lockerelectronics.accesses = req_access diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 585f60a347..6ef6f2d5ce 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -26,7 +26,7 @@ if (prob(40)) new /obj/item/storage/toolbox/emergency(src) - switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 4, "delete" = 1))) + switch (pickweight(list("small" = 40, "aid" = 25, "tank" = 20, "both" = 10, "nothing" = 5))) if ("small") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) @@ -49,9 +49,7 @@ if ("nothing") // doot - // teehee - if ("delete") - qdel(src) + return /* * Fire Closet diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index e71a2720ae..a3a559665c 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -67,7 +67,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) + notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER, ignore_dnr_observers = TRUE) /datum/outfit/ashwalker name ="Ashwalker" @@ -135,7 +135,7 @@ . = ..() var/area/A = get_area(src) if(!mapload && A) - notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM) + notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM, ignore_dnr_observers = TRUE) if(has_owner && creator) flavour_text = "You are a Golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \ Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." @@ -374,7 +374,7 @@ flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil. Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell." var/area/A = get_area(src) if(!mapload && A) - notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) objectives = "Be [owner.name]'s friend, and keep [owner.name] alive, so you don't get sent back to hell." spell = summoning_spell diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d6f304653d..a6ba6424b1 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -100,6 +100,7 @@ number_of_rods = 2 smooth = SMOOTH_TRUE canSmoothWith = null + obj_flags = CAN_BE_HIT | BLOCK_Z_FALL /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) to_chat(user, "The supporting rods look like they could be cut.") diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 0e2f951f38..36dbcc1e28 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -104,12 +104,12 @@ playing = FALSE hearing_mobs = null return - if(!lentext(note)) + if(!length(note)) continue var/cur_note = text2ascii(note) - 96 if(cur_note < 1 || cur_note > 7) continue - for(var/i=2 to lentext(note)) + for(var/i=2 to length(note)) var/ni = copytext(note,i,i+1) if(!text2num(ni)) if(ni == "#" || ni == "b" || ni == "n") @@ -209,7 +209,7 @@ lines.Cut(MUSIC_MAXLINES + 1) var/linenum = 1 for(var/l in lines) - if(lentext(l) > MUSIC_MAXLINECHARS) + if(length(l) > MUSIC_MAXLINECHARS) to_chat(usr, "Line [linenum] too long!") lines.Remove(l) else @@ -236,11 +236,11 @@ if(!in_range(instrumentObj, usr)) return - if(lentext(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + if(length(t) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS) var/cont = input(usr, "Your message is too long! Would you like to continue editing it?", "", "yes") in list("yes", "no") if(cont == "no") break - while(lentext(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) + while(length(t) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS) ParseSong(t) else if(href_list["help"]) @@ -272,7 +272,7 @@ return if(lines.len > MUSIC_MAXLINES) return - if(lentext(newline) > MUSIC_MAXLINECHARS) + if(length(newline) > MUSIC_MAXLINECHARS) newline = copytext(newline, 1, MUSIC_MAXLINECHARS) lines.Add(newline) @@ -287,7 +287,7 @@ var/content = html_encode(input("Enter your line: ", instrumentObj.name, lines[num]) as text|null) if(!content || !in_range(instrumentObj, usr)) return - if(lentext(content) > MUSIC_MAXLINECHARS) + if(length(content) > MUSIC_MAXLINECHARS) content = copytext(content, 1, MUSIC_MAXLINECHARS) if(num > lines.len || num < 1) return diff --git a/code/game/objects/structures/signs/signs_maps.dm b/code/game/objects/structures/signs/signs_maps.dm index f3188b90c2..1e3bfd6d36 100644 --- a/code/game/objects/structures/signs/signs_maps.dm +++ b/code/game/objects/structures/signs/signs_maps.dm @@ -50,7 +50,8 @@ name = "bar" desc = "A direction sign, pointing out which way the Bar is." icon_state = "direction_bar" - /obj/structure/sign/directions/cafe + +/obj/structure/sign/directions/cafe name = "cafe" desc = "A direction sign, pointing out which way the Cafe is." icon_state = "direction_cafe" diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm new file mode 100644 index 0000000000..bd657fe1e8 --- /dev/null +++ b/code/game/objects/structures/stairs.dm @@ -0,0 +1,130 @@ +#define STAIR_TERMINATOR_AUTOMATIC 0 +#define STAIR_TERMINATOR_NO 1 +#define STAIR_TERMINATOR_YES 2 + +// dir determines the direction of travel to go upwards (due to lack of sprites, currently only 1 and 2 make sense) +// stairs require /turf/open/openspace as the tile above them to work +// multiple stair objects can be chained together; the Z level transition will happen on the final stair object in the chain + +/obj/structure/stairs + name = "stairs" + icon = 'icons/obj/stairs.dmi' + icon_state = "stairs" + anchored = TRUE + + var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace + var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC + var/turf/listeningTo + +/obj/structure/stairs/Initialize(mapload) + if(force_open_above) + force_open_above() + build_signal_listener() + update_surrounding() + return ..() + +/obj/structure/stairs/Destroy() + listeningTo = null + return ..() + +/obj/structure/stairs/Move() //Look this should never happen but... + . = ..() + if(force_open_above) + build_signal_listener() + update_surrounding() + +/obj/structure/stairs/proc/update_surrounding() + update_icon() + for(var/i in GLOB.cardinals) + var/turf/T = get_step(get_turf(src), i) + var/obj/structure/stairs/S = locate() in T + if(S) + S.update_icon() + +/obj/structure/stairs/Uncross(atom/movable/AM, turf/newloc) + if(!newloc || !AM) + return ..() + if(!isobserver(AM) && isTerminator() && (get_dir(src, newloc) == dir)) + stair_ascend(AM) + return FALSE + return ..() + +/obj/structure/stairs/Cross(atom/movable/AM) + if(isTerminator() && (get_dir(src, AM) == dir)) + return FALSE + return ..() + +/obj/structure/stairs/update_icon() + if(isTerminator()) + icon_state = "stairs_t" + else + icon_state = "stairs" + +/obj/structure/stairs/proc/stair_ascend(atom/movable/AM) + var/turf/checking = get_step_multiz(get_turf(src), UP) + if(!istype(checking)) + return + if(!checking.zPassIn(AM, UP, get_turf(src))) + return + var/turf/target = get_step_multiz(get_turf(src), (dir|UP)) + if(istype(target) && !target.can_zFall(AM, null, get_step_multiz(target, DOWN))) //Don't throw them into a tile that will just dump them back down. + if(isliving(AM)) + var/mob/living/L = AM + var/pulling = L.pulling + if(pulling) + L.pulling.forceMove(target) + L.forceMove(target) + L.start_pulling(pulling) + else + AM.forceMove(target) + +/obj/structure/stairs/vv_edit_var(var_name, var_value) + . = ..() + if(!.) + return + if(var_name != NAMEOF(src, force_open_above)) + return + if(!var_value) + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + listeningTo = null + else + build_signal_listener() + force_open_above() + +/obj/structure/stairs/proc/build_signal_listener() + if(listeningTo) + UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_new) + listeningTo = T + +/obj/structure/stairs/proc/force_open_above() + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/proc/on_multiz_new(turf/source, dir) + if(dir == UP) + var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) + if(T && !istype(T)) + T.ChangeTurf(/turf/open/openspace) + +/obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1) + . = ..() + if(isTerminator()) + . |= FALL_INTERCEPTED | FALL_NO_MESSAGE + +/obj/structure/stairs/proc/isTerminator() //If this is the last stair in a chain and should move mobs up + if(terminator_mode != STAIR_TERMINATOR_AUTOMATIC) + return (terminator_mode == STAIR_TERMINATOR_YES) + var/turf/T = get_turf(src) + if(!T) + return FALSE + var/turf/them = get_step(T, dir) + if(!them) + return FALSE + for(var/obj/structure/stairs/S in them) + if(S.dir == dir) + return FALSE + return TRUE diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index f1c5080c8f..6a055bbd35 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) SSair.remove_from_active(newT) - newT.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(newT) SSair.add_to_active(newT,1) /turf/proc/copyTurf(turf/T) @@ -140,6 +140,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( newTurf.air = stashed_air SSair.add_to_active(newTurf) else + if(ispath(path,/turf/closed)) + flags |= CHANGETURF_RECALC_ADJACENT return ..() // Take off the top layer turf and replace it with the next baseturf down @@ -263,7 +265,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags) //called after a turf has been replaced in ChangeTurf() levelupdate() - CalculateAdjacentTurfs() + if(flags & CHANGETURF_RECALC_ADJACENT) + ImmediateCalculateAdjacentTurfs() + else + CALCULATE_ADJACENT_TURFS(src) //update firedoor adjacency var/list/turfs_to_check = get_adjacent_open_turfs(src) | src diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index bd24e0ff93..efee9cfa5a 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -16,6 +16,22 @@ if(wet) AddComponent(/datum/component/wet_floor, wet, INFINITY, 0, INFINITY, TRUE) +//direction is direction of travel of A +/turf/open/zPassIn(atom/movable/A, direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of A +/turf/open/zPassOut(atom/movable/A, direction, turf/destination) + return (direction == UP) + +//direction is direction of travel of air +/turf/open/zAirIn(direction, turf/source) + return (direction == DOWN) + +//direction is direction of travel of air +/turf/open/zAirOut(direction, turf/source) + return (direction == UP) + /turf/open/MouseDrop_T(atom/dropping, mob/user) . = ..() if(dropping == user && isliving(user)) @@ -184,43 +200,14 @@ update_visuals() current_cycle = times_fired - - //cache some vars - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - - for(var/direction in GLOB.cardinals) - var/turf/open/enemy_tile = get_step(src, direction) - if(!istype(enemy_tile)) - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - continue + ImmediateCalculateAdjacentTurfs() + for(var/i in atmos_adjacent_turfs) + var/turf/open/enemy_tile = i var/datum/gas_mixture/enemy_air = enemy_tile.return_air() - - //only check this turf, if it didn't check us when it was initalized - if(enemy_tile.current_cycle < times_fired) - if(CANATMOSPASS(src, enemy_tile)) - LAZYINITLIST(atmos_adjacent_turfs) - LAZYINITLIST(enemy_tile.atmos_adjacent_turfs) - atmos_adjacent_turfs[enemy_tile] = TRUE - enemy_tile.atmos_adjacent_turfs[src] = TRUE - else - if (atmos_adjacent_turfs) - atmos_adjacent_turfs -= enemy_tile - if (enemy_tile.atmos_adjacent_turfs) - enemy_tile.atmos_adjacent_turfs -= src - UNSETEMPTY(enemy_tile.atmos_adjacent_turfs) - continue - else - if (!atmos_adjacent_turfs || !atmos_adjacent_turfs[enemy_tile]) - continue - if(!excited && air.compare(enemy_air)) //testing("Active turf found. Return value of compare(): [is_active]") excited = TRUE SSair.active_turfs |= src - UNSETEMPTY(atmos_adjacent_turfs) - if (atmos_adjacent_turfs) - src.atmos_adjacent_turfs = atmos_adjacent_turfs /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() @@ -267,14 +254,15 @@ if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. return 0 else - if(C.lying || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. + if(!(lube&SLIP_WHEN_CRAWLING) && (C.lying || !(C.status_flags & CANKNOCKDOWN))) // can't slip unbuckled mob if they're lying or can't fall. return 0 - if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING)) - return 0 - if(ishuman(C) && (lube&NO_SLIP_WHEN_WALKING)) - var/mob/living/carbon/human/H = C - if(!H.sprinting && H.getStaminaLoss() <= 20) + if(lube & NO_SLIP_WHEN_WALKING) + if(C.m_intent == MOVE_INTENT_WALK) return 0 + if(ishuman(C) && !(lube & SLIP_WHEN_JOGGING)) + var/mob/living/carbon/human/H = C + if(!H.sprinting && H.getStaminaLoss() <= 20) + return 0 if(!(lube&SLIDE_ICE)) to_chat(C, "You slipped[ O ? " on the [O.name]" : ""]!") playsound(C.loc, 'sound/misc/slip.ogg', 50, 1, -3) diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm new file mode 100644 index 0000000000..e68aabcd08 --- /dev/null +++ b/code/game/turfs/openspace/openspace.dm @@ -0,0 +1,134 @@ +/turf/open/openspace + name = "open space" + desc = "Watch your step!" + icon_state = "grey" + baseturfs = /turf/open/openspace + CanAtmosPassVertical = ATMOS_PASS_YES + //mouse_opacity = MOUSE_OPACITY_TRANSPARENT + var/can_cover_up = TRUE + var/can_build_on = TRUE + +/turf/open/openspace/debug/update_multiz() + ..() + return TRUE + +/turf/open/openspace/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + plane = FLOOR_OPENSPACE_PLANE + layer = OPENSPACE_LAYER + return INITIALIZE_HINT_LATELOAD + +/turf/open/openspace/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/openspace/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/openspace/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(prune_on_fail) + ChangeTurf(/turf/open/floor/plating) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/openspace/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/openspace/zAirIn() + return TRUE + +/turf/open/openspace/zAirOut() + return TRUE + +/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) + return TRUE + +/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination) + if(A.anchored) + return FALSE + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_FALL) + return FALSE + return TRUE + +/turf/open/openspace/proc/CanCoverUp() + return can_cover_up + +/turf/open/openspace/proc/CanBuildHere() + return can_build_on + +/turf/open/openspace/attackby(obj/item/C, mob/user, params) + ..() + if(!CanBuildHere()) + return + if(istype(C, /obj/item/stack/rods)) + var/obj/item/stack/rods/R = C + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + var/obj/structure/lattice/catwalk/W = locate(/obj/structure/lattice/catwalk, src) + if(W) + to_chat(user, "There is already a catwalk here!") + return + if(L) + if(R.use(1)) + to_chat(user, "You construct a catwalk.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + new/obj/structure/lattice/catwalk(src) + else + to_chat(user, "You need two rods to build a catwalk!") + return + if(R.use(1)) + to_chat(user, "You construct a lattice.") + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + ReplaceWithLattice() + else + to_chat(user, "You need one rod to build a lattice.") + return + if(istype(C, /obj/item/stack/tile/plasteel)) + if(!CanCoverUp()) + return + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + var/obj/item/stack/tile/plasteel/S = C + if(S.use(1)) + qdel(L) + playsound(src, 'sound/weapons/genhit.ogg', 50, 1) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating) + else + to_chat(user, "You need one floor tile to build a floor!") + else + to_chat(user, "The plating is going to need some support! Place metal rods first.") + +/turf/open/openspace/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(!CanBuildHere()) + return FALSE + + switch(the_rcd.mode) + if(RCD_FLOORWALL) + var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) + if(L) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 1) + else + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 3) + return FALSE + +/turf/open/openspace/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_FLOORWALL) + to_chat(user, "You build a floor.") + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return TRUE + return FALSE diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 036f54c710..191d9b0242 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -144,5 +144,5 @@ ..() ScrapeAway() -/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/tool/I, tool_type) +/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/item/I, tool_type) return diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index d52a3bcc23..0d9bff1bdf 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -227,3 +227,29 @@ /turf/closed/wall/r_wall/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) if(the_rcd.canRturf) return ..() + +/turf/closed/wall/r_wall/syndicate + name = "hull" + desc = "The armored hull of an ominous looking ship." + icon = 'icons/turf/walls/plastitanium_wall.dmi' + icon_state = "map-shuttle" + explosion_block = 20 + sheet_type = /obj/item/stack/sheet/mineral/plastitanium + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL + canSmoothWith = list(/turf/closed/wall/r_wall/syndicate, /turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + +/turf/closed/wall/r_wall/syndicate/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/turf/closed/wall/r_wall/syndicate/nodiagonal + smooth = SMOOTH_MORE + icon_state = "map-shuttle_nd" + +/turf/closed/wall/r_wall/syndicate/nosmooth + icon = 'icons/turf/shuttle.dmi' + icon_state = "wall" + smooth = SMOOTH_FALSE + +/turf/closed/wall/r_wall/syndicate/overspace + icon_state = "map-overspace" + fixed_underlay = list("space"=1) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index ebf6f6626c..d618e457b0 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -39,7 +39,7 @@ return FALSE . = ..() -/turf/Initialize() +/turf/Initialize(mapload) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 @@ -62,12 +62,21 @@ add_overlay(/obj/effect/fullbright) if(requires_activation) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) SSair.add_to_active(src) if (light_power && light_range) update_light() + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_new(src, DOWN) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_new(src, UP) + SEND_SIGNAL(T, COMSIG_TURF_MULTIZ_NEW, src, UP) + if (opacity) has_opaque_atom = TRUE @@ -76,13 +85,19 @@ return INITIALIZE_HINT_NORMAL /turf/proc/Initalize_Atmos(times_fired) - CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(src) /turf/Destroy(force) . = QDEL_HINT_IWILLGC if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE + var/turf/T = SSmapping.get_turf_above(src) + if(T) + T.multiz_turf_del(src, DOWN) + T = SSmapping.get_turf_below(src) + if(T) + T.multiz_turf_del(src, UP) if(force) ..() //this will completely wipe turf state @@ -105,6 +120,60 @@ return user.Move_Pulled(src) +/turf/proc/multiz_turf_del(turf/T, dir) + +/turf/proc/multiz_turf_new(turf/T, dir) + +//zPassIn doesn't necessarily pass an atom! +//direction is direction of travel of air +/turf/proc/zPassIn(atom/movable/A, direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zPassOut(atom/movable/A, direction, turf/destination) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirIn(direction, turf/source) + return FALSE + +//direction is direction of travel of air +/turf/proc/zAirOut(direction, turf/source) + return FALSE + +/turf/proc/zImpact(atom/movable/A, levels = 1, turf/prev_turf) + var/flags = NONE + var/mov_name = A.name + for(var/i in contents) + var/atom/thing = i + flags |= thing.intercept_zImpact(A, levels) + if(flags & FALL_STOP_INTERCEPTING) + break + if(prev_turf && !(flags & FALL_NO_MESSAGE)) + prev_turf.visible_message("[mov_name] falls through [prev_turf]!") + if(flags & FALL_INTERCEPTED) + return + if(zFall(A, ++levels)) + return FALSE + A.visible_message("[A] crashes into [src]!") + A.onZImpact(src, levels) + return TRUE + +/turf/proc/can_zFall(atom/movable/A, levels = 1, turf/target) + return zPassOut(A, DOWN, target) && target.zPassIn(A, DOWN, src) + +/turf/proc/zFall(atom/movable/A, levels = 1, force = FALSE) + var/turf/target = get_step_multiz(src, DOWN) + if(!target || (!isobj(A) && !ismob(A))) + return FALSE + if(!force && (!can_zFall(A, levels, target) || !A.can_zFall(src, levels, target, DOWN))) + return FALSE + A.zfalling = TRUE + A.forceMove(target) + A.zfalling = FALSE + target.zImpact(A, levels, src) + return TRUE + /turf/proc/handleRCL(obj/item/twohanded/rcl/C, mob/user) if(C.loaded) for(var/obj/structure/cable/LC in src) @@ -196,6 +265,9 @@ if(O.obj_flags & FROZEN) O.make_unfrozen() + if(!AM.zfalling) + zFall(AM) + /turf/proc/is_plasteel_floor() return FALSE diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 626fa7f66f..cb5b33ae08 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -1,7 +1,7 @@ //admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless //the procs are cause you can't put the comments in the GLOB var define -GLOBAL_PROTECT(admin_verbs_default) GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) +GLOBAL_PROTECT(admin_verbs_default) /world/proc/AVerbsDefault() return list( /client/proc/deadmin, /*destroys our own admin datum so we can play as a regular player*/ @@ -13,8 +13,8 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/toggleprayers, /client/proc/toggleadminhelpsound ) -GLOBAL_PROTECT(admin_verbs_admin) GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) +GLOBAL_PROTECT(admin_verbs_admin) /world/proc/AVerbsAdmin() return list( /client/proc/invisimin, /*allows our mob to go invisible/visible*/ @@ -78,11 +78,10 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin()) /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ /datum/admins/proc/open_borgopanel ) -GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/DB_ban_panel, /client/proc/stickybanpanel)) -GLOBAL_PROTECT(admin_verbs_sounds) +GLOBAL_PROTECT(admin_verbs_ban) GLOBAL_LIST_INIT(admin_verbs_sounds, list(/client/proc/play_local_sound, /client/proc/play_sound, /client/proc/set_round_end_sound)) -GLOBAL_PROTECT(admin_verbs_fun) +GLOBAL_PROTECT(admin_verbs_sounds) GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/cmd_admin_dress, /client/proc/cmd_admin_gib_self, @@ -108,9 +107,9 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/admin_away, /client/proc/roll_dices //CIT CHANGE - Adds dice verb )) -GLOBAL_PROTECT(admin_verbs_spawn) +GLOBAL_PROTECT(admin_verbs_fun) GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character)) -GLOBAL_PROTECT(admin_verbs_server) +GLOBAL_PROTECT(admin_verbs_spawn) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /world/proc/AVerbsServer() return list( @@ -129,7 +128,7 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/adminchangemap, /client/proc/toggle_hub ) -GLOBAL_PROTECT(admin_verbs_debug) +GLOBAL_PROTECT(admin_verbs_server) GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /world/proc/AVerbsDebug() return list( @@ -171,15 +170,15 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) /datum/admins/proc/create_or_modify_area, /client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG ) -GLOBAL_PROTECT(admin_verbs_possess) +GLOBAL_PROTECT(admin_verbs_debug) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) -GLOBAL_PROTECT(admin_verbs_permissions) +GLOBAL_PROTECT(admin_verbs_possess) GLOBAL_LIST_INIT(admin_verbs_permissions, list(/client/proc/edit_admin_permissions)) -GLOBAL_PROTECT(admin_verbs_poll) +GLOBAL_PROTECT(admin_verbs_permissions) GLOBAL_LIST_INIT(admin_verbs_poll, list(/client/proc/create_poll)) //verbs which can be hidden - needs work -GLOBAL_PROTECT(admin_verbs_hideable) +GLOBAL_PROTECT(admin_verbs_poll) GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/set_ooc, /client/proc/reset_ooc, @@ -247,6 +246,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/cmd_admin_man_up, //CIT CHANGE - adds man up verb /client/proc/cmd_admin_man_up_global //CIT CHANGE - ditto )) +GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/add_admin_verbs() if(holder) diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 72ec3da8f9..7b59e72403 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -504,7 +504,7 @@ output += ruler var/datum/browser/browser = new(usr, "Note panel", "Manage player notes", 1000, 500) var/datum/asset/notes_assets = get_asset_datum(/datum/asset/simple/notes) - notes_assets.send(src) + notes_assets.send(usr.client) browser.set_content(jointext(output, "")) browser.open() @@ -556,7 +556,7 @@ /proc/convert_notes_sql(ckey) if(!fexists(NOTESFILE)) return - + var/savefile/notesfile = new(NOTESFILE) if(!notesfile) log_game("Error: Cannot access [NOTESFILE]") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index b0b9190556..8b105da43b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1347,7 +1347,7 @@ else if(href_list["f_secret"]) return HandleFSecret() - + else if(href_list["f_dynamic_roundstart"]) if(!check_rights(R_ADMIN)) return @@ -1593,7 +1593,7 @@ GLOB.dynamic_stacking_limit = input(usr,"Change the threat limit at which round-endings rulesets will start to stack.", "Change stacking limit", null) as num log_admin("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].") message_admins("[key_name(usr)] set 'stacking_limit' to [GLOB.dynamic_stacking_limit].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["f_dynamic_high_pop_limit"]) if(!check_rights(R_ADMIN)) @@ -1612,7 +1612,7 @@ log_admin("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") message_admins("[key_name(usr)] set 'high_pop_limit' to [GLOB.dynamic_high_pop_limit].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["f_dynamic_forced_threat"]) if(!check_rights(R_ADMIN)) @@ -1631,7 +1631,7 @@ log_admin("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].") message_admins("[key_name(usr)] set 'forced_threat_level' to [GLOB.dynamic_forced_threat_level].") - dynamic_mode_options(usr) + dynamic_mode_options(usr) else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) @@ -2442,7 +2442,7 @@ return src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name.", "Network Channel Handler", "") while (findtext(src.admincaster_feed_channel.channel_name," ") == 1) - src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1) + src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,length(src.admincaster_feed_channel.channel_name)+1) src.access_news_network() else if(href_list["ac_set_channel_lock"]) @@ -2484,7 +2484,7 @@ return src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story.", "Network Channel Handler", "")) while (findtext(src.admincaster_feed_message.returnBody(-1)," ") == 1) - src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,lentext(src.admincaster_feed_message.returnBody(-1))+1) + src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,length(src.admincaster_feed_message.returnBody(-1))+1) src.access_news_network() else if(href_list["ac_submit_new_message"]) @@ -2545,7 +2545,7 @@ return src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person.", "Network Security Handler", "")) while(findtext(src.admincaster_wanted_message.criminal," ") == 1) - src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,lentext(admincaster_wanted_message.criminal)+1) + src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,length(admincaster_wanted_message.criminal)+1) src.access_news_network() else if(href_list["ac_set_wanted_desc"]) @@ -2553,7 +2553,7 @@ return src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important.", "Network Security Handler", "")) while (findtext(src.admincaster_wanted_message.body," ") == 1) - src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,lentext(src.admincaster_wanted_message.body)+1) + src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,length(src.admincaster_wanted_message.body)+1) src.access_news_network() else if(href_list["ac_submit_wanted"]) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index b19b2a91d8..072fbaa123 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -61,7 +61,7 @@ var/output = "Radio Report
" for (var/fq in SSradio.frequencies) output += "Freq: [fq]
" - var/list/datum/radio_frequency/fqs = SSradio.frequencies[fq] + var/datum/radio_frequency/fqs = SSradio.frequencies[fq] if (!fqs) output += "  ERROR
" continue diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 8559a3235e..2b8d365e15 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -19,7 +19,6 @@ //- Identify how hard it is to break into the area and where the weak points are //- Check if the area has too much empty space. If so, make it smaller and replace the rest with maintenance tunnels. -GLOBAL_PROTECT(admin_verbs_debug_mapping) GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/camera_view, //-errorage /client/proc/sec_camera_report, //-errorage @@ -50,6 +49,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/debug_z_levels, /client/proc/place_ruin )) +GLOBAL_PROTECT(admin_verbs_debug_mapping) /obj/effect/debugging/mapfix_marker name = "map fix marker" diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index e70ea1c1b3..644b2729e0 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -307,11 +307,11 @@ GLOBAL_PROTECT(VVpixelmovement) // the type with the base type removed from the begaining var/fancytype = types[D.type] if (findtext(fancytype, types[type])) - fancytype = copytext(fancytype, lentext(types[type])+1) - var/shorttype = copytext("[D.type]", lentext("[type]")+1) - if (lentext(shorttype) > lentext(fancytype)) + fancytype = copytext(fancytype, length(types[type])+1) + var/shorttype = copytext("[D.type]", length("[type]")+1) + if (length(shorttype) > length(fancytype)) shorttype = fancytype - if (!lentext(shorttype)) + if (!length(shorttype)) shorttype = "/" .["[D]([shorttype])[REF(D)]#[i]"] = D diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d7dd8db08d..7a222d1ebc 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -949,7 +949,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits Uniform: - [uniform_select] + [uniform_select] diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm index 621e6c3618..1d3cf95222 100644 --- a/code/modules/admin/verbs/spawnobjasmob.dm +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -16,10 +16,10 @@ var/obj/chosen_obj = text2path(chosen) var/list/settings = list( - "mainsettings" = list( - "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), + "mainsettings" = list( + "name" = list("desc" = "Name", "type" = "string", "value" = "Bob"), "maxhealth" = list("desc" = "Max. health", "type" = "number", "value" = 100), - "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), + "access" = list("desc" = "Access ID", "type" = "datum", "path" = "/obj/item/card/id", "value" = "Default"), "objtype" = list("desc" = "Base obj type", "type" = "datum", "path" = "/obj", "value" = "[chosen]"), "googlyeyes" = list("desc" = "Googly eyes", "type" = "boolean", "value" = "No"), "disableai" = list("desc" = "Disable AI", "type" = "boolean", "value" = "Yes"), @@ -27,7 +27,7 @@ "dropitem" = list("desc" = "Drop obj on death", "type" = "boolean", "value" = "Yes"), "mobtype" = list("desc" = "Base mob type", "type" = "datum", "path" = "/mob/living/simple_animal/hostile/mimic/copy", "value" = "/mob/living/simple_animal/hostile/mimic/copy"), "ckey" = list("desc" = "ckey", "type" = "ckey", "value" = "none"), - ) + ) ) var/list/prefreturn = presentpreflikepicker(usr,"Customize mob", "Customize mob", Button1="Ok", width = 450, StealFocus = 1,Timeout = 0, settings=settings) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index c1088cbb3d..37652d1887 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -393,23 +393,22 @@ name = "Dissection Guide" icon_state = "alienpaper_words" info = {"Dissection for Dummies
- -
- 1.Acquire fresh specimen.
- 2.Put the specimen on operating table.
- 3.Apply surgical drapes, preparing for experimental dissection.
- 4.Apply scalpel to specimen's torso.
- 5.Clamp bleeders on specimen's torso with a hemostat.
- 6.Retract skin of specimen's torso with a retractor.
- 7.Apply scalpel again to specimen's torso.
- 8.Search through the specimen's torso with your hands to remove any superfluous organs.
- 9.Insert replacement gland (Retrieve one from gland storage).
- 10.Consider dressing the specimen back to not disturb the habitat.
- 11.Put the specimen in the experiment machinery.
- 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
- 13.You will receive one supply credit, and the subject will be counted towards your quota.
-
-Congratulations! You are now trained for invasive xenobiology research!"} +
+ 1.Acquire fresh specimen.
+ 2.Put the specimen on operating table.
+ 3.Apply surgical drapes, preparing for experimental dissection.
+ 4.Apply scalpel to specimen's torso.
+ 5.Clamp bleeders on specimen's torso with a hemostat.
+ 6.Retract skin of specimen's torso with a retractor.
+ 7.Apply scalpel again to specimen's torso.
+ 8.Search through the specimen's torso with your hands to remove any superfluous organs.
+ 9.Insert replacement gland (Retrieve one from gland storage).
+ 10.Consider dressing the specimen back to not disturb the habitat.
+ 11.Put the specimen in the experiment machinery.
+ 12.Choose one of the machine options. The target will be analyzed and teleported to the selected drop-off point.
+ 13.You will receive one supply credit, and the subject will be counted towards your quota.
+
+ Congratulations! You are now trained for invasive xenobiology research!"} /obj/item/paper/guides/antag/abductor/update_icon() return diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index a35cbbf0e4..e9a815ac38 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -73,7 +73,7 @@ clear_mind_control() ..() -/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(special != 2 && uses) // Special 2 means abductor surgery Start() @@ -124,7 +124,7 @@ mind_control_uses = 1 mind_control_duration = 2400 -/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() owner.faction |= "slime" owner.grant_language(/datum/language/slime) @@ -286,7 +286,7 @@ mind_control_uses = 2 mind_control_duration = 900 -/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 8000be87e6..b5a218131b 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -147,6 +147,11 @@ if(iscarbon(L)) var/mob/living/carbon/M = L M.uncuff() + var/brutedamage = L.getBruteLoss() + var/burndamage = L.getFireLoss() + if(brutedamage || burndamage) + L.adjustBruteLoss(-(brutedamage * 0.25)) + L.adjustFireLoss(-(burndamage * 0.25)) L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L @@ -262,7 +267,7 @@ clockwork_desc = "A sigil that will drain non-Servants that remain on it. Servants that remain on it will be healed if it has any vitality drained." icon_state = "sigilvitality" layer = SIGIL_LAYER - alpha = 75 + alpha = 125 color = "#123456" affects_servants = TRUE stat_affected = DEAD diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index ec712f2eec..7066109979 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -64,7 +64,7 @@ /obj/item/clockwork/slab/cyborg/janitor //six scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ - /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) + /datum/clockwork_scripture/create_object/stargazer, /datum/clockwork_scripture/create_object/ocular_warden, /datum/clockwork_scripture/create_object/mania_motor) /obj/item/clockwork/slab/cyborg/service //six scriptures, plus xray vision quickbound = list(/datum/clockwork_scripture/abscond, /datum/clockwork_scripture/create_object/replicant,/datum/clockwork_scripture/create_object/stargazer, \ diff --git a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm index 2be0fdde11..f53796f02a 100644 --- a/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm +++ b/code/modules/antagonists/clockcult/clock_items/construct_chassis.dm @@ -15,7 +15,7 @@ . = ..() var/area/A = get_area(src) if(A && construct_type) - notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT) + notify_ghosts("A [construct_name] chassis has been created in [A.name]!", 'sound/magic/clockwork/fellowship_armory.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_CONSTRUCT, ignore_dnr_observers = TRUE) GLOB.poi_list += src LAZYADD(GLOB.mob_spawners[name], src) @@ -39,7 +39,9 @@ . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/clockwork/construct_chassis/attack_ghost(mob/user) +/obj/item/clockwork/construct_chassis/attack_ghost(mob/dead/observer/user) + if(!user.can_reenter_round()) + return FALSE if(!SSticker.mode) to_chat(user, "You cannot use that before the game has started.") return diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index 82c1291433..4ab481cfe2 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -80,7 +80,7 @@ power_cost = 125 whispered = TRUE object_path = /obj/effect/clockwork/sigil/submission - creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted after 8 seconds if they do not move." + creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted and healed of some of their wounds after 8 seconds if they do not move." usage_tip = "This is the primary conversion method, though it will not penetrate mindshield implants." tier = SCRIPTURE_DRIVER one_per_tile = TRUE diff --git a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm index 00a3406da1..491f1d24b3 100644 --- a/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm +++ b/code/modules/antagonists/clockcult/clock_structures/_trap_object.dm @@ -71,6 +71,7 @@ return TRUE /obj/structure/destructible/clockwork/trap/proc/activate() + return //These objects send signals to normal traps to activate /obj/structure/destructible/clockwork/trap/trigger @@ -79,6 +80,14 @@ break_message = "The trigger breaks apart!" density = FALSE +/obj/structure/destructible/clockwork/trap/trigger/Initialize() + . = ..() + for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src)) + if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger)) + wired_to += T + T.wired_to += src + to_chat(usr, "[src] automatically links with [T] beneath it.") + /obj/structure/destructible/clockwork/trap/trigger/activate() for(var/obj/structure/destructible/clockwork/trap/T in wired_to) if(istype(T, /obj/structure/destructible/clockwork/trap/trigger)) //Triggers don't go off multiple times diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 7afd9e7dbc..35c1ea7bdd 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -110,9 +110,7 @@ if(!(BI.resistance_flags & ON_FIRE)) BI.fire_act() continue - if(is_servant_of_ratvar(L) || (HAS_TRAIT(L, TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE)) - continue - if(L.stat || L.lying) + if(is_servant_of_ratvar(L) || (HAS_TRAIT(L, TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE) || L.incapacitated(TRUE)) continue if (iscarbon(L)) var/mob/living/carbon/c = L diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm index 94f0ba7112..af29bc9b31 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm @@ -7,18 +7,10 @@ icon_state = "pressure_sensor" alpha = 50 -/obj/structure/destructible/clockwork/trap/trigger/Initialize() - . = ..() - for(var/obj/structure/destructible/clockwork/trap/T in get_turf(src)) - if(!istype(T, /obj/structure/destructible/clockwork/trap/trigger)) - wired_to += T - T.wired_to += src - to_chat(usr, "[src] automatically links with [T] beneath it.") - /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/Crossed(atom/movable/AM) if(isliving(AM) && !is_servant_of_ratvar(AM)) var/mob/living/L = AM - if(L.stat || L.m_intent == MOVE_INTENT_WALK || L.lying) + if(L.stat || L.m_intent == MOVE_INTENT_WALK || L.movement_type & (FLYING|FLOATING)) return audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index f0fc59834c..1cbf267277 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -249,7 +249,7 @@ structure_check() searches for nearby cultist structures required for the invoca convertee.adjustFireLoss(-(burndamage * 0.75)) convertee.visible_message("[convertee] writhes in pain \ [brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!", \ - "AAAAAAAAAAAAAA-") + "AAAAAAAAAAAAAA-") SSticker.mode.add_cultist(convertee.mind, 1) new /obj/item/melee/cultblade/dagger(get_turf(src)) convertee.mind.special_role = ROLE_CULTIST @@ -848,10 +848,10 @@ structure_check() searches for nearby cultist structures required for the invoca fail_invoke() log_game("Manifest rune failed - too many summoned ghosts") return list() - notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) + notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src, ignore_dnr_observers = TRUE) var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in T) - if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && !QDELETED(O)) + if(!QDELETED(O) && O.client && !jobban_isbanned(O, ROLE_CULTIST) && !QDELETED(src) && O.can_reenter_round()) ghosts_on_rune += O if(!ghosts_on_rune.len) to_chat(user, "There are no spirits near [src]!") diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index df761ac183..06200073bb 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -106,7 +106,7 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0) +/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 779dfb43a7..78e4d38b3c 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(war_declared, FALSE) for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) D.jammed = TRUE - GLOB.war_declared = TRUE + GLOB.war_declared = TRUE var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop) var/actual_players = GLOB.joined_player_list.len - nukeops.len var/tc_malus = 0 diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index add3c1d9b0..d0e6dafbc1 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -343,10 +343,10 @@ /obj/machinery/nuclearbomb/proc/set_anchor() - if(!isinspace()) - anchored = !anchored - else + if(isinspace() && !anchored) to_chat(usr, "There is nothing to anchor to!") + else + anchored = !anchored /obj/machinery/nuclearbomb/proc/set_safety() safety = !safety diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index f45555a6ee..f27da5f667 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -94,7 +94,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E -/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(M.mind) M.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl(null)) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 87cee7586d..ce455d9e67 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -33,7 +33,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) /obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) . = ..() diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index b05750305a..caf2f644df 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -223,8 +223,6 @@ special_role = TRAITOR_AGENT_ROLE syndicate = TRUE forge_single_objective() - else - ..() // Give them standard objectives. return /datum/antagonist/traitor/internal_affairs/forge_traitor_objectives() diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e1d607c34b..56954f8718 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -208,7 +208,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( var/unlock_text = "Hello World!" //Text shown when an ability is unlocked var/unlock_sound //Sound played when an ability is unlocked -/datum/AI_Module/proc/upgrade(mob/living/silicon/AI/AI) //Apply upgrades! +/datum/AI_Module/proc/upgrade(mob/living/silicon/ai/AI) //Apply upgrades! return /datum/AI_Module/large //Big, powerful stuff that can only be used once. @@ -397,7 +397,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( unlock_text = "You establish a power diversion to your turrets, upgrading their health and damage." unlock_sound = 'sound/items/rped.ogg' -/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/AI/AI) +/datum/AI_Module/large/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) turret.obj_integrity += 30 turret.lethal_projectile = /obj/item/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 38aa0ad7f5..f14872a0a4 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -340,9 +340,9 @@ to_chat(victim, "You feel a dark presence from [A.name]") /obj/item/voodoo/suicide_act(mob/living/carbon/user) - user.visible_message("[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") - user.gib() - return(BRUTELOSS) + user.visible_message("[user] links the voodoo doll to [user.p_them()]self and sits on it, infinitely crushing [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!") + user.gib() + return(BRUTELOSS) /obj/item/voodoo/fire_act(exposed_temperature, exposed_volume) if(target) diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index bb7ffdc85d..4ebefd4dab 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -626,16 +626,16 @@ dat += {" - + body { font-size: 80%; font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif; } + ul#tabs { list-style-type: none; margin: 30px 0 0 0; padding: 0 0 0.3em 0; } + ul#tabs li { display: inline; } + ul#tabs li a { color: #42454a; background-color: #dedbde; border: 1px solid #c9c3ba; border-bottom: none; padding: 0.3em; text-decoration: none; } + ul#tabs li a:hover { background-color: #f1f0ee; } + ul#tabs li a.selected { color: #000; background-color: #f1f0ee; font-weight: bold; padding: 0.7em 0.3em 0.38em 0.3em; } + div.tabContent { border: 1px solid #c9c3ba; padding: 0.5em; background-color: #f1f0ee; } + div.tabContent.hide { display: none; } + + "} dat += {"[content]"} return dat diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index cf2be249b5..6c1bf0b009 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -138,7 +138,7 @@ . = ..() setDir(t) -/obj/item/assembly/infra/throw_at() +/obj/item/assembly/infra/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) . = ..() olddir = dir diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index 084c35684c..760e4e22da 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -1,4 +1,6 @@ /atom/var/CanAtmosPass = ATMOS_PASS_YES +/atom/var/CanAtmosPassVertical = ATMOS_PASS_YES + /atom/proc/CanAtmosPass(turf/T) switch (CanAtmosPass) if (ATMOS_PASS_PROC) @@ -8,42 +10,47 @@ else return CanAtmosPass -/turf/closed/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPass = ATMOS_PASS_NO +/turf/CanAtmosPassVertical = ATMOS_PASS_NO /turf/open/CanAtmosPass = ATMOS_PASS_PROC -/turf/open/CanAtmosPass(turf/T) - var/R - if(blocks_air || T.blocks_air) - R = 1 +/turf/open/CanAtmosPassVertical = ATMOS_PASS_PROC +/turf/open/CanAtmosPass(turf/T, vertical = FALSE) + var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T) + var/opp = dir_inverse_multiz(dir) + var/R = FALSE + if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) + R = TRUE + if(blocks_air || T.blocks_air) + R = TRUE + if (T == src) + return !R for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) - if(!CANATMOSPASS(O, other)) - R = 1 + if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) + R = TRUE if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - var/D = get_dir(src, T) - atmos_supeconductivity |= D - D = get_dir(T, src) - T.atmos_supeconductivity |= D - return 0 //no need to keep going, we got all we asked + atmos_supeconductivity |= dir + T.atmos_supeconductivity |= opp + return FALSE //no need to keep going, we got all we asked - atmos_supeconductivity &= ~get_dir(src, T) - T.atmos_supeconductivity &= ~get_dir(T, src) + atmos_supeconductivity &= ~dir + T.atmos_supeconductivity &= ~opp return !R - - /atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. - return 0 + return FALSE -/turf/proc/CalculateAdjacentTurfs() - var/list/atmos_adjacent_turfs = src.atmos_adjacent_turfs - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - if(!T) +/turf/proc/ImmediateCalculateAdjacentTurfs() + var/canpass = CANATMOSPASS(src, src) + var/canvpass = CANVERTICALATMOSPASS(src, src) + for(var/direction in GLOB.cardinals_multiz) + var/turf/T = get_step_multiz(src, direction) + if(!isopenturf(T)) continue - if( !(blocks_air || T.blocks_air) && CANATMOSPASS(T, src) ) + if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) atmos_adjacent_turfs[T] = TRUE @@ -72,11 +79,13 @@ var/turf/curloc = src - for (var/direction in GLOB.diagonals) + for (var/direction in GLOB.diagonals_multiz) var/matchingDirections = 0 - var/turf/S = get_step(curloc, direction) + var/turf/S = get_step_multiz(curloc, direction) + if(!S) + continue - for (var/checkDirection in GLOB.cardinals) + for (var/checkDirection in GLOB.cardinals_multiz) var/turf/checkTurf = get_step(S, checkDirection) if(!S.atmos_adjacent_turfs || !S.atmos_adjacent_turfs[checkTurf]) continue @@ -98,13 +107,13 @@ /turf/air_update_turf(command = 0) if(command) - CalculateAdjacentTurfs() + ImmediateCalculateAdjacentTurfs() SSair.add_to_active(src,command) /atom/movable/proc/move_update_air(turf/T) - if(isturf(T)) - T.air_update_turf(1) - air_update_turf(1) + if(isturf(T)) + T.air_update_turf(1) + air_update_turf(1) /atom/proc/atmos_spawn_air(text) //because a lot of people loves to copy paste awful code lets just make an easy proc to spawn your plasma fires var/turf/open/T = get_turf(src) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 3967fc39b5..a283d550af 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -42,8 +42,7 @@ /turf/open/Destroy() if(active_hotspot) - qdel(active_hotspot) - active_hotspot = null + QDEL_NULL(active_hotspot) // Adds the adjacent turfs to the current atmos processing for(var/T in atmos_adjacent_turfs) SSair.add_to_active(T) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index ccd13d8d4a..f52453e2c8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -1,5 +1,3 @@ -#define CRYOMOBS 'icons/obj/cryo_mobs.dmi' - /obj/machinery/atmospherics/components/unary/cryo_cell name = "cryo cell" icon = 'icons/obj/cryogenics.dmi' @@ -211,7 +209,7 @@ if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - cold_protection = H.get_cold_protection(air1.temperature) + cold_protection = H.get_thermal_protection(air1.temperature, TRUE) if(abs(temperature_delta) > 1) var/air_heat_capacity = air1.heat_capacity() diff --git a/code/modules/atmospherics/multiz.dm b/code/modules/atmospherics/multiz.dm new file mode 100644 index 0000000000..2b3a9af1c7 --- /dev/null +++ b/code/modules/atmospherics/multiz.dm @@ -0,0 +1,29 @@ +obj/machinery/atmospherics/pipe/simple/multiz ///This is an atmospherics pipe which can relay air up a deck (Z+1). It currently only supports being on pipe layer 1 + name = "multi deck pipe adapter" + desc = "An adapter which allows pipes to connect to other pipenets on different decks." + icon_state = "multiz_pipe" + icon = 'icons/obj/atmos.dmi' + +/obj/machinery/atmospherics/pipe/simple/multiz/update_icon() + . = ..() + cut_overlays() //This adds the overlay showing it's a multiz pipe. This should go above turfs and such + var/image/multiz_overlay_node = new(src) //If we have a firing state, light em up! + multiz_overlay_node.icon = 'icons/obj/atmos.dmi' + multiz_overlay_node.icon_state = "multiz_pipe" + multiz_overlay_node.layer = HIGH_OBJ_LAYER + add_overlay(multiz_overlay_node) + +///Attempts to locate a multiz pipe that's above us, if it finds one it merges us into its pipenet +/obj/machinery/atmospherics/pipe/simple/multiz/pipeline_expansion() + icon = 'icons/obj/atmos.dmi' //Just to refresh. + var/turf/T = get_turf(src) + var/obj/machinery/atmospherics/pipe/simple/multiz/above = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_above(T)) + var/obj/machinery/atmospherics/pipe/simple/multiz/below = locate(/obj/machinery/atmospherics/pipe/simple/multiz) in(SSmapping.get_turf_below(T)) + if(below) + below.pipeline_expansion() //If we've got one below us, force it to add us on facebook + if(above) + nodes += above + above.nodes += src //Two way travel :) + return ..() + else + return ..() \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index a0927a2578..a0b917a87b 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -44,9 +44,8 @@ return if(isobserver(user)) var/mob/dead/observer/O = user - if(!O.can_reenter_round) - to_chat(user, "You are unable to reenter the round.") - return + if(!O.can_reenter_round()) + return FALSE var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") if(ghost_role == "No" || !loc) return @@ -257,7 +256,7 @@ //Non-human spawners -/obj/effect/mob_spawn/AICorpse/create() //Creates a corrupted AI +/obj/effect/mob_spawn/AICorpse/create(ckey, name) //Creates a corrupted AI var/A = locate(/mob/living/silicon/ai) in loc if(A) return @@ -277,7 +276,7 @@ /obj/effect/mob_spawn/slime/equip(mob/living/simple_animal/slime/S) S.colour = mobcolour -/obj/effect/mob_spawn/human/facehugger/create() //Creates a squashed facehugger +/obj/effect/mob_spawn/human/facehugger/create(ckey, name) //Creates a squashed facehugger var/obj/item/clothing/mask/facehugger/O = new(src.loc) //variable O is a new facehugger at the location of the landmark O.name = src.name O.Die() //call the facehugger's death proc diff --git a/code/modules/bsql/core/library.dm b/code/modules/bsql/core/library.dm index 1b62cf3b6a..9b58ba314b 100644 --- a/code/modules/bsql/core/library.dm +++ b/code/modules/bsql/core/library.dm @@ -1,6 +1,6 @@ /world/proc/_BSQL_Internal_Call(func, ...) var/list/call_args = args.Copy(2) - BSQL_Debug("[.....]: [args[1]]([call_args.Join(", ")])") + BSQL_Debug("_BSQL_Internal_Call(): [args[1]]([call_args.Join(", ")])") . = call(_BSQL_Library_Path(), func)(arglist(call_args)) BSQL_Debug("Result: [. == null ? "NULL" : "\"[.]\""]") diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 4edcb04e8f..d65c595b8f 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -1,20 +1,16 @@ -/datum/bounty/item/assistant/strange_object - name = "Strange Object" - description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." - reward = 600 - wanted_types = list(/obj/item/relic) +//Moved Maint Loot and other assorted bounties to silly.dm /datum/bounty/item/assistant/scooter name = "Scooter" description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = 850 // the mat hoffman + reward = 900 // the mat hoffman wanted_types = list(/obj/vehicle/ridden/scooter) include_subtypes = FALSE /datum/bounty/item/assistant/skateboard name = "Skateboard" description = "Nanotrasen has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = 700 // the tony hawk + reward = 750 // the tony hawk wanted_types = list(/obj/vehicle/ridden/scooter/skateboard) /datum/bounty/item/assistant/stunprod @@ -26,8 +22,8 @@ /datum/bounty/item/assistant/soap name = "Soap" description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = 1000 - required_count = 3 + reward = 1200 + required_count = 3 //You can (apparently) get soap from the mining rewards vendor. wanted_types = list(/obj/item/soap) /datum/bounty/item/assistant/spear @@ -50,12 +46,6 @@ reward = 2000 wanted_types = list(/obj/structure/statue) -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = 750 - wanted_types = list(/obj/item/storage/box/clown) - /datum/bounty/item/assistant/cheesiehonkers name = "Cheesie Honkers" description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" @@ -76,44 +66,38 @@ reward = 1250 wanted_types = list(/obj/item/extendohand) -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = 2000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) +// /datum/bounty/item/assistant/donut +// name = "Donuts" +// description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." +// reward = 2000 +// required_count = 10 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/donut) -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." - reward = 1000 - required_count = 10 - wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) +// /datum/bounty/item/assistant/donkpocket +// name = "Donk-Pockets" +// description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous lizard biomatter. Return units to CentCom immediately." +// reward = 1000 +// required_count = 10 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/donkpocket) /datum/bounty/item/assistant/briefcase name = "Briefcase" description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = 1500 - required_count = 5 + reward = 1200 + required_count = 3 wanted_types = list(/obj/item/storage/briefcase, /obj/item/storage/secure/briefcase) -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = 1000 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses) - /datum/bounty/item/assistant/monkey_hide name = "Monkey Hide" description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = 500 + reward = 1250 + required_count = 3 wanted_types = list(/obj/item/stack/sheet/animalhide/monkey) /datum/bounty/item/assistant/shard name = "Shards" description = "A killer clown has been stalking CentCom, and staff have been unable to catch her because she's not wearing shoes. Please ship some shards so that a booby trap can be constructed." - reward = 500 + reward = 750 required_count = 15 wanted_types = list(/obj/item/shard) @@ -124,20 +108,20 @@ required_count = 5 wanted_types = list(/obj/structure/chair/comfy) -/datum/bounty/item/assistant/geranium - name = "Geraniums" - description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." - reward = 1000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) +// /datum/bounty/item/assistant/geranium +// name = "Geraniums" +// description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you." +// reward = 1000 +// required_count = 3 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium) -/datum/bounty/item/assistant/poppy - name = "Poppies" - description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." - reward = 1000 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) - include_subtypes = FALSE +// /datum/bounty/item/assistant/poppy +// name = "Poppies" +// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you." +// reward = 1000 +// required_count = 3 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy) +// include_subtypes = FALSE /datum/bounty/item/assistant/shadyjims name = "Shady Jim's" @@ -152,13 +136,13 @@ required_count = 8 wanted_types = list(/obj/item/twohanded/required/kirbyplants) -/datum/bounty/item/assistant/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = 1000 - wanted_types = list(/obj/item/clothing/ears/earmuffs) +// /datum/bounty/item/assistant/earmuffs +// name = "Earmuffs" +// description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." +// reward = 1000 +// wanted_types = list(/obj/item/clothing/ears/earmuffs) -/datum/bounty/item/assistant/handcuffs +/datum/bounty/item/assistant/cuffs name = "Handcuffs" description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." reward = 1000 @@ -203,15 +187,36 @@ reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi) -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = 4000 - required_count = 5 - wanted_types = list(/obj/item/toy/figure) - /datum/bounty/item/assistant/tail_whip name = "Nine Tails whip" description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." reward = 4000 wanted_types = list(/obj/item/melee/chainofcommand/tailwhip) + +/datum/bounty/item/assistant/bolas + name = "Bolas" + description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them." + reward = 1000 + required_count = 3 + wanted_types = list(/obj/item/restraints/legcuffs/bola) + +/datum/bounty/item/assistant/metalshields + name = "Metal Shields" + description = "NT is testing the effects of electricity on clowns wielding metal shields. We have clowns, and we have electricity. Send us the shields." + reward = 1400 + required_count = 4 + wanted_types = list(/obj/item/shield/makeshift) + +/datum/bounty/item/assistant/toolbelts + name = "Tool Belts" + description = "These things always seem to go missing. Ship us a few to help us restock." + reward = 1350 + required_count = 3 + wanted_types = list(/obj/item/storage/belt/utility) + +/datum/bounty/item/assistant/gasmasks + name = "Gas Masks" + description = "The good news is that we have more miasma than we'll ever need. The bad news is, somone opened the release valve on the canisters. Ship us some gas masks!" + reward = 1100 + required_count = 4 + wanted_types = list(/obj/item/clothing/mask/gas) diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm index 754de480cd..98d7765002 100644 --- a/code/modules/cargo/bounties/botany.dm +++ b/code/modules/cargo/bounties/botany.dm @@ -135,11 +135,11 @@ bonus_desc = "Not to be confused with eggplants." multiplier = 2 -/datum/bounty/item/botany/kudzu - name = "Kudzu Pods" - wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod) - bonus_desc = "Store in a dry, dark place." - multiplier = 4 +// /datum/bounty/item/botany/kudzu +// name = "Kudzu Pods" +// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/kudzupod) +// bonus_desc = "Store in a dry, dark place." +// multiplier = 4 /datum/bounty/item/botany/watermelon name = "Watermelons" diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm index 719a2d10a5..64e1710461 100644 --- a/code/modules/cargo/bounties/chef.dm +++ b/code/modules/cargo/bounties/chef.dm @@ -1,8 +1,4 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = 1000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) +//Moved (most) bounties requiring botany to gardencook.dm Roundstart cook bounties go here. /datum/bounty/item/chef/soup name = "Soup" @@ -11,20 +7,6 @@ required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/soup) -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = 800 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = 800 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) - /datum/bounty/item/chef/icecreamsandwich name = "Ice Cream Sandwiches" description = "Upper management has been screaming non-stop for ice cream. Please send some." @@ -51,13 +33,6 @@ required_count = 3 wanted_types = list(/obj/item/reagent_containers/food/snacks/salad) -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = 1300 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) - /datum/bounty/item/chef/superbite name = "Super Bite Burger" description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." @@ -70,11 +45,11 @@ reward = 3000 wanted_types = list(/obj/item/reagent_containers/food/snacks/poppypretzel) -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = 3000 - wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) +// /datum/bounty/item/chef/cubancarp +// name = "Cuban Carp" +// description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." +// reward = 3000 +// wanted_types = list(/obj/item/reagent_containers/food/snacks/cubancarp) /datum/bounty/item/chef/hotdog name = "Hot Dog" @@ -82,13 +57,6 @@ reward = 4000 wanted_types = list(/obj/item/reagent_containers/food/snacks/hotdog) -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = 2500 - required_count = 3 - wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) - /datum/bounty/item/chef/muffin name = "Muffins" description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." @@ -129,3 +97,41 @@ required_count = 6 wanted_types = list(/obj/item/reagent_containers/food/snacks/nugget) +/datum/bounty/item/chef/khachapuri + name = "Khachapuri" + description = "Bread and eggs. Bread and eggs. Bread and eggs. Also, cheese." + reward = 2000 + required_count = 2 + wanted_types = list(/obj/item/reagent_containers/food/snacks/khachapuri) + +/datum/bounty/item/chef/ratkebab + name = "Rat Kebabs" + description = "Centcom is requesting some -special- kebabs for it's service staff." + reward = 1800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/kebab/rat) + +/datum/bounty/item/chef/benedict + name = "Eggs Benedict" + description = "Command requires a high-calory breakfast item. Ship it right away." + reward = 1750 + wanted_types = list(/obj/item/reagent_containers/food/snacks/benedict) + +/datum/bounty/item/chef/braincake + name = "Brain Cake" + description = "The science division requires a brain cake for testing purposes. Don't ask." + reward = 1200 + wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/brain) + +/datum/bounty/item/chef/waffles + name = "Waffles" + description = "Security staff at Centcom are looking for a fun treat. Ship us some waffles so they can fill the cells." + reward = 1000 + wanted_types = list(/obj/item/reagent_containers/food/snacks/waffles) + +/datum/bounty/item/chef/sugarcookie + name = "Sugar Cookies" + description = "Everyone needs a little sugar in their life. Ship some sweets to Command so we can satiate our sweet tooth." + reward = 1200 + required_count = 6 + wanted_types = list(/obj/item/reagent_containers/food/snacks/sugarcookie) diff --git a/code/modules/cargo/bounties/gardencook.dm b/code/modules/cargo/bounties/gardencook.dm new file mode 100644 index 0000000000..b73cc2f9f8 --- /dev/null +++ b/code/modules/cargo/bounties/gardencook.dm @@ -0,0 +1,53 @@ +/datum/bounty/item/chef/birthday_cake + name = "Birthday Cake" + description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" + reward = 1000 + wanted_types = list(/obj/item/reagent_containers/food/snacks/store/cake/birthday, /obj/item/reagent_containers/food/snacks/cakeslice/birthday) + +/datum/bounty/item/gardencook/carrotfries + name = "Carrot Fries" + description = "Night sight can mean life or death! A shipment of carrot fries is the order." + reward = 1300 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/carrotfries) + +/datum/bounty/item/gardencook/eggplantparm + name = "Eggplant Parmigianas" + description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" + reward = 2500 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/eggplantparm) + +/datum/bounty/item/gardencook/popcorn + name = "Popcorn Bags" + description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." + reward = 800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/popcorn) + +/datum/bounty/item/gardencook/onionrings + name = "Onion Rings" + description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." + reward = 800 + required_count = 3 + wanted_types = list(/obj/item/reagent_containers/food/snacks/onionrings) + +/datum/bounty/item/gardencook/khinkali + name = "Khinkali" + description = "Requesting -some khinki stuff- for a private staff party at Centcom" + reward = 2400 + required_count = 6 + wanted_types = list(/obj/item/reagent_containers/food/snacks/khinkali) + +/datum/bounty/item/gardencook/bakedbeans + name = "Beans" + description = "Management wants to make sure we have a fallback shelter to rely on. Prepare some beans to stock it with." + reward = 1600 + required_count = 8 + wanted_types = list(/obj/item/reagent_containers/food/snacks/beans) + +/datum/bounty/item/gardencook/honeybun + name = "Honeybun" + description = "Something sticky, something fun, ship us a honeybun." + reward = 3500 + wanted_types = list(/obj/item/reagent_containers/food/snacks/honeybun) diff --git a/code/modules/cargo/bounties/silly.dm b/code/modules/cargo/bounties/silly.dm new file mode 100644 index 0000000000..b88ec9f192 --- /dev/null +++ b/code/modules/cargo/bounties/silly.dm @@ -0,0 +1,54 @@ +/datum/bounty/item/silly/paper_plane + name = "Paper Planes" + description = "Centcom is running an experiment on which type of paper plane is the most aerodynamically stable. Send us some samples to further our study." + reward = 900 + required_count = 15 + wanted_types = list(/obj/item/paperplane) + +/datum/bounty/item/silly/mousetraps + name = "Mouse Traps" + description = "Some shoeless hoodlum is intentionally tracking paint all over Centcom. Send us some mouse traps so we can capture the culprit." + reward = 1200 + required_count = 12 + wanted_types = list(/obj/item/assembly/mousetrap) + +/datum/bounty/item/silly/action_figures + name = "Action Figures" + description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." + reward = 3000 + required_count = 5 + wanted_types = list(/obj/item/toy/figure) + +/datum/bounty/item/silly/clown_box + name = "Clown Box" + description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." + reward = 1000 + wanted_types = list(/obj/item/storage/box/clown) + +/datum/bounty/item/silly/peels + name = "Banana Peels" + description = "Centcom is running an experiment to see if a slip-n-slide can be made entirely out of banana peels, but noone wants to eat that many bananas. Ship us some fresh peels." + reward = 950 + required_count = 12 + wanted_types = list(/obj/item/grown/bananapeel) + +/datum/bounty/item/silly/shoes + name = "Shoes" + description = "An assistant stole a clown's shoes, the clown incinerated every pair we had. Send us some new footwear please." + reward = 1200 + required_count = 8 + wanted_types = list(/obj/item/clothing/shoes) + exclude_types = list(/obj/item/clothing/shoes/wraps, /obj/item/clothing/shoes/wraps/silver, /obj/item/clothing/shoes/wraps/red, /obj/item/clothing/shoes/wraps/blue) + +/datum/bounty/item/silly/sunglasses + name = "Sunglasses" + description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." + reward = 1400 + required_count = 2 + wanted_types = list(/obj/item/clothing/glasses/sunglasses) + +/datum/bounty/item/silly/strange_object + name = "Strange Object" + description = "Nanotrasen has taken an interest in strange objects. Find one in maint, and ship it off to CentCom right away." + reward = 1000 + wanted_types = list(/obj/item/relic) \ No newline at end of file diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 6cc05f56df..bfd97e4d1f 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty() - switch(rand(1, 13)) + switch(rand(1, 15)) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -115,6 +115,12 @@ GLOBAL_LIST_EMPTY(bounties_list) if(13) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype + if(14) + var/subtype = pick(subtypesof(/datum/bounty/item/silly)) + return new subtype + if(15) + var/subtype = pick(subtypesof(/datum/bounty/item/gardencook)) + return new subtype // Called lazily at startup to populate GLOB.bounties_list with random bounties. /proc/setup_bounties() @@ -130,7 +136,9 @@ GLOBAL_LIST_EMPTY(bounties_list) /datum/bounty/item/engineering = 1, /datum/bounty/item/mining = 2, /datum/bounty/item/medical = 2, - /datum/bounty/item/botany = 2) + /datum/bounty/item/botany = 2, + /datum/bounty/item/silly = 1, + /datum/bounty/item/gardencook = 1) for(var/the_type in easy_add_list_subtypes) for(var/i in 1 to easy_add_list_subtypes[the_type]) diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index e482aa00b5..f57374db7c 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -2,7 +2,7 @@ //This was originally created as a way to get adminspawned items to the station in an IC manner. It's evolved to contain a few more //features such as item removal, smiting, controllable delivery mobs, and more. -//This works by creating a supplypod (refered to as temp_pod) in a special room in the centcom map. +//This works by creating a supplypod (refered to as temp_pod) in a special room in the centcom map. //IMPORTANT: Even though we call it a supplypod for our purposes, it can take on the appearance and function of many other things: Eg. cruise missiles, boxes, or walking, living gondolas. //When the user launched the pod, items from special "bays" on the centcom map are taken and put into the supplypod @@ -33,7 +33,7 @@ var/launchCounter = 1 //Used with the "Ordered" launch mode (launchChoice = 1) to see what item is launched var/specificTarget //Do we want to target a specific mob instead of where we click? Also used for smiting var/list/orderedArea = list() //Contains an ordered list of turfs in an area (filled in the createOrderedArea() proc), read top-left to bottom-right. Used for the "ordered" launch mode (launchChoice = 1) - var/list/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea + var/list/turf/acceptableTurfs = list() //Contians a list of turfs (in the "bay" area on centcom) that have items that can be launched. Taken from orderedArea var/list/launchList = list() //Contains whatever is going to be put in the supplypod and fired. Taken from acceptableTurfs var/obj/effect/supplypod_selector/selector = new() //An effect used for keeping track of what item is going to be launched when in "ordered" mode (launchChoice = 1) var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched @@ -69,7 +69,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm data["landingDelay"] = temp_pod.landingDelay //How long the pod takes to land after launching data["openingDelay"] = temp_pod.openingDelay //How long the pod takes to open after landing data["departureDelay"] = temp_pod.departureDelay //How long the pod takes to leave after opening (if bluespace=true, it deletes. if reversing=true, it flies back to centcom) - data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. + data["styleChoice"] = temp_pod.style //Style is a variable that keeps track of what the pod is supposed to look like. It acts as an index to the POD_STYLES list in cargo.dm defines to get the proper icon/name/desc for the pod. data["effectStun"] = temp_pod.effectStun //If true, stuns anyone under the pod when it launches until it lands, forcing them to get hit by the pod. Devilish! data["effectLimb"] = temp_pod.effectLimb //If true, pops off a limb (if applicable) from anyone caught under the pod when it lands data["effectBluespace"] = temp_pod.bluespace //If true, the pod deletes (in a shower of sparks) after landing @@ -150,7 +150,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("launchRandom") //Pick random turfs from the supplypod bay at centcom to launch if (launchChoice == 2) launchChoice = 0 - updateSelector() + updateSelector() return launchChoice = 2 updateSelector() @@ -326,7 +326,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm temp_pod.soundVolume = 50 . = TRUE ////////////////////////////STYLE CHANGES////////////////// - //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) + //Style is a value that is used to keep track of what the pod is supposed to look like. It can be used with the POD_STYLES list (in cargo.dm defines) //as a way to get the proper icon state, name, and description of the pod. if("styleStandard") temp_pod.setStyle(STYLE_STANDARD) @@ -367,7 +367,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm if("refresh") //Refresh the Pod bay. User should press this if they spawn something new in the centcom bay. Automatically called whenever the user launches a pod refreshBay() . = TRUE - if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) + if("giveLauncher") //Enters the "Launch Mode". When the launcher is activated, temp_pod is cloned, and the result it filled and launched anywhere the user clicks (unless specificTarget is true) launcherActivated = !launcherActivated updateCursor(launcherActivated) //Update the cursor of the user to a cool looking target icon . = TRUE @@ -436,7 +436,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm orderedArea = list() if (!isemptylist(A.contents)) //Go through the area passed into the proc, and figure out the top left and bottom right corners by calculating max and min values var/startX = A.contents[1].x //Create the four values (we do it off a.contents[1] so they have some sort of arbitrary initial value. They should be overwritten in a few moments) - var/endX = A.contents[1].x + var/endX = A.contents[1].x var/startY = A.contents[1].y var/endY = A.contents[1].y for (var/turf/T in A) //For each turf in the area, go through and find: @@ -453,7 +453,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm orderedArea.Add(locate(j,startY - (i - endY),1)) //After gathering the start/end x and y, go through locating each turf from top left to bottom right, like one would read a book return orderedArea //Return the filled list -/datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, +/datum/centcom_podlauncher/proc/preLaunch() //Creates a list of acceptable items, numTurfs = 0 //Counts the number of turfs that can be launched (remember, supplypods either launch all at once or one turf-worth of items at a time) acceptableTurfs = list() for (var/turf/T in orderedArea) //Go through the orderedArea list @@ -478,7 +478,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm //UpdateSelector() is here (instead if the if(1) switch block) because it also moves the selector to nullspace (to hide it) if needed /datum/centcom_podlauncher/proc/launch(turf/A) //Game time started - if (isnull(A)) + if (isnull(A)) return var/obj/structure/closet/supplypod/centcompod/toLaunch = DuplicateObject(temp_pod) //Duplicate the temp_pod (which we have been varediting or configuring with the UI) and store the result toLaunch.bay = bay //Bay is currently a nonstatic expression, so it cant go into toLaunch using DuplicateObject @@ -487,7 +487,7 @@ force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.adm for (var/atom/movable/O in launchList) DuplicateObject(O).forceMove(toLaunch) //Duplicate each atom/movable in launchList and forceMove them into the supplypod new /obj/effect/DPtarget(A, toLaunch) //Create the DPTarget, which will eventually forceMove the temp_pod to it's location - else + else for (var/atom/movable/O in launchList) //If we aren't cloning the objects, just go through the launchList O.forceMove(toLaunch) //and forceMove any atom/moveable into the supplypod new /obj/effect/DPtarget(A, toLaunch) //Then, create the DPTarget effect, which will eventually forceMove the temp_pod to it's location diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index 1a607b4b96..3d4df9df12 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -3,6 +3,7 @@ desc = "Used to order supplies, approve requests, and control the shuttle." icon_screen = "supply" circuit = /obj/item/circuitboard/computer/cargo + req_access = list(ACCESS_CARGO) var/requestonly = FALSE var/contraband = FALSE var/safety_warning = "For safety reasons, the automated supply shuttle \ @@ -17,6 +18,7 @@ desc = "Used to request supplies from cargo." icon_screen = "request" circuit = /obj/item/circuitboard/computer/cargo/request + req_access = list() requestonly = TRUE /obj/machinery/computer/cargo/Initialize() @@ -29,11 +31,11 @@ obj_flags &= ~EMAGGED /obj/machinery/computer/cargo/proc/get_export_categories() - var/cat = EXPORT_CARGO + . = EXPORT_CARGO if(contraband) - cat |= EXPORT_CONTRABAND + . |= EXPORT_CONTRABAND if(obj_flags & EMAGGED) - cat |= EXPORT_EMAG + . |= EXPORT_EMAG /obj/machinery/computer/cargo/emag_act(mob/user) . = ..() @@ -114,6 +116,9 @@ /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) if(..()) return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return if(action != "add" && requestonly) return switch(action) diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 6a294c9eeb..42b6016552 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -1,6 +1,6 @@ /obj/item/export_scanner name = "export scanner" - desc = "A device used to check objects against Nanotrasen exports and bounty database." + desc = "A device used to check objects against Nanotrasen exports and bounty database. Sadly can not scan reagents vaule." icon = 'icons/obj/device.dmi' icon_state = "export_scanner" item_state = "radio" @@ -31,7 +31,7 @@ else // Before you fix it: // yes, checking manifests is a part of intended functionality. - + var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE) var/price = 0 for(var/x in ex.total_amount) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 9a99f201b3..51c4864034 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -21,9 +21,10 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they // Simple holder datum to pass export results around /datum/export_report - var/list/exported_atoms = list() //names of atoms sold/deleted by export - var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold - var/list/total_value = list() //export instance => total value of sold objects + var/list/exported_atoms = list()//names of atoms sold/deleted by export + var/list/total_amount = list() //export instance => total count of sold objects of its type, only exists if any were sold + var/list/total_value = list() //export instance => total value of sold objects + var/list/total_reagents = list()//export reagents => into the total vaule of the object sold // external_report works as "transaction" object, pass same one in if you're doing more than one export in single go /proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report) @@ -47,6 +48,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + if(thing.reagents) + for(var/datum/reagent/R in thing.reagents.reagent_list) + report.total_reagents[R] += R.volume if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) @@ -58,7 +62,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message var/message = "" var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above. - var/k_elasticity = 1/20 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 30 - > 20 + var/k_elasticity = 1/300 //coefficient used in marginal price calculation that roughly corresponds to the inverse of price elasticity, or "quantity elasticity" - CIT EDIT 1/30 - > 0 var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type. var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type. var/list/exclude_types = list() // Types excluded from export diff --git a/code/modules/cargo/exports/food_wine.dm b/code/modules/cargo/exports/food_wine.dm new file mode 100644 index 0000000000..851c3660b4 --- /dev/null +++ b/code/modules/cargo/exports/food_wine.dm @@ -0,0 +1,181 @@ +/datum/export/food + k_elasticity = 0 + include_subtypes = TRUE + +/datum/export/booze //Like the kind you bottle! + k_elasticity = 0 + unit_name = "brand unit of booze" + include_subtypes = TRUE + +/datum/export/food/meat + cost = 5 + unit_name = "protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/slab) + +/datum/export/food/raw_cutlets + cost = 3 + unit_name = "protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/rawcutlet) + +/datum/export/food/cooked_cutlets + cost = 4 + unit_name = "cooked protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/cutlet) + +/datum/export/food/cooked_meat + cost = 8 + unit_name = "cooked protein based food" + export_types = list(/obj/item/reagent_containers/food/snacks/meat/steak) + +/datum/export/food/dough + cost = 3 + unit_name = "uncooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/dough, /obj/item/reagent_containers/food/snacks/flatdough) + +/datum/export/food/cooked_dough + cost = 5 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/pizzabread) + +/datum/export/food/buns + cost = 3 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/bun) + +/datum/export/food/buns + cost = 3 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/bun) + +/datum/export/food/eggs + cost = 4 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/friedegg) + +/datum/export/food/eggs_food + cost = 20 + unit_name = "cooked egg based food" + export_types = list(/obj/item/reagent_containers/food/snacks/omelette, /obj/item/reagent_containers/food/snacks/benedict, /obj/item/reagent_containers/food/snacks/salad/eggbowl) + +/datum/export/food/sweets + cost = 4 + unit_name = "pastery base" + export_types = list(/obj/item/reagent_containers/food/snacks/rawpastrybase, /obj/item/reagent_containers/food/snacks/pastrybase) + +/datum/export/food/cake_pie_raw + cost = 12 + unit_name = "uncooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/cakebatter, /obj/item/reagent_containers/food/snacks/piedough) + +/datum/export/food/cooked_cake_pie + cost = 15 + unit_name = "cooked food base" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cake/plain, /obj/item/reagent_containers/food/snacks/pie/plain) + +/datum/export/food/glassbottle + cost = 10 + unit_name = "glass bottle" + export_types = list(/obj/item/reagent_containers/food/drinks/bottle) + +/datum/export/food/produce + cost = 3 + unit_name = "produce" + export_types = list(/obj/item/reagent_containers/food/snacks/grown) + exclude_types = list(/obj/item/grown/log) + +/datum/export/food/egg + cost = 2 + unit_name = "egg" + export_types = list(/obj/item/reagent_containers/food/snacks/egg) + +/datum/export/food/soup + cost = 30 + unit_name = "bowl of soup" + export_types = list(/obj/item/reagent_containers/food/snacks/soup) + +/datum/export/food/bread + cost = 20 + unit_name = "load of bread" + export_types = list(/obj/item/reagent_containers/food/snacks/store/bread) + +/datum/export/food/bread_slice + cost = 4 + unit_name = "slice of bread" + export_types = list(/obj/item/reagent_containers/food/snacks/breadslice) + +/datum/export/food/burger + cost = 12 + unit_name = "burger" + export_types = list(/obj/item/reagent_containers/food/snacks/burger) + +/datum/export/food/cake + cost = 50 + unit_name = "cake" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cake) + +/datum/export/food/cake_slice + cost = 10 + unit_name = "cake slice" + export_types = list(/obj/item/reagent_containers/food/snacks/cakeslice) + +/datum/export/food/cheese_wheel + cost = 70 + unit_name = "cheese wheel" + export_types = list(/obj/item/reagent_containers/food/snacks/store/cheesewheel) + +/datum/export/food/cheese_wheel + cost = 20 + unit_name = "cheese wedge" + export_types = list(/obj/item/reagent_containers/food/snacks/cheesewedge) + +/datum/export/food/candy + cost = 5 + unit_name = "candy" //Not anything from the vender + export_types = list(/obj/item/reagent_containers/food/snacks/candy_corn, /obj/item/reagent_containers/food/snacks/chocolatebar, /obj/item/reagent_containers/food/snacks/candiedapple, /obj/item/reagent_containers/food/snacks/spiderlollipop, \ + /obj/item/reagent_containers/food/snacks/chococoin, /obj/item/reagent_containers/food/snacks/fudgedice, /obj/item/reagent_containers/food/snacks/chocoorange, /obj/item/reagent_containers/food/snacks/lollipop, \ + /obj/item/reagent_containers/food/snacks/gumball, /obj/item/reagent_containers/food/snacks/tinychocolate) + +/datum/export/food/pastery + cost = 30 + unit_name = "baked goods" + export_types = list(/obj/item/reagent_containers/food/snacks/donut, /obj/item/reagent_containers/food/snacks/muffin, /obj/item/reagent_containers/food/snacks/waffles, /obj/item/reagent_containers/food/snacks/plumphelmetbiscuit, \ + /obj/item/reagent_containers/food/snacks/chococornet, /obj/item/reagent_containers/food/snacks/cherrycupcake, /obj/item/reagent_containers/food/snacks/bluecherrycupcake, /obj/item/reagent_containers/food/snacks/honeybun, /obj/item/reagent_containers/food/snacks/pancakes) + +/datum/export/food/pasta + cost = 20 + unit_name = "pasta based meal" + export_types = list(/obj/item/reagent_containers/food/snacks/spaghetti, /obj/item/reagent_containers/food/snacks/boiledspaghetti, /obj/item/reagent_containers/food/snacks/pastatomato, /obj/item/reagent_containers/food/snacks/copypasta, \ + /obj/item/reagent_containers/food/snacks/meatballspaghetti, /obj/item/reagent_containers/food/snacks/spesslaw, /obj/item/reagent_containers/food/snacks/chowmein, /obj/item/reagent_containers/food/snacks/beefnoodle, /obj/item/reagent_containers/food/snacks/butternoodles) + +/datum/export/food/pizza + cost = 120 + unit_name = "pizza" + export_types = list(/obj/item/reagent_containers/food/snacks/pizza) + +/datum/export/food/sliced_pizza + cost = 12 + unit_name = "pizza slice" + export_types = list(/obj/item/reagent_containers/food/snacks/pizzaslice) + +/datum/export/food/snowcone + cost = 3 + unit_name = "snowcone" + export_types = list(/obj/item/reagent_containers/food/snacks/snowcones) + +/datum/export/booze/brands + cost = 200 + unit_name = "export bottle" + export_types = list(/obj/item/export/bottle/kahlua, /obj/item/export/bottle/whiskey, /obj/item/export/bottle/vodka, /obj/item/export/bottle/gin, \ + /obj/item/export/bottle/rum, /obj/item/export/bottle/tequila, /obj/item/export/bottle/vermouth, /obj/item/export/bottle/wine, /obj/item/export/bottle/grappa, /obj/item/export/bottle/cognac, \ + /obj/item/export/bottle/absinthe, /obj/item/export/bottle/goldschlager, /obj/item/export/bottle/patron, /obj/item/export/bottle/sake, /obj/item/export/bottle/hcider, /obj/item/export/bottle/champagne, \ + /obj/item/export/bottle/applejack, /obj/item/export/bottle/trappist, /obj/item/export/bottle/blazaam, /obj/item/export/bottle/grenadine, /obj/item/export/bottle/fernet) + +/datum/export/booze/bottled + cost = 400 + unit_name = "exotic brews" + export_types = list(/obj/item/export/bottle/blooddrop, /obj/item/export/bottle/slim_gold, /obj/item/export/bottle/white_bloodmoon, /obj/item/export/bottle/greenroad) + +/datum/export/booze/bottledkeg + cost = 250 + unit_name = "exotic brews" + export_types = list(/obj/item/export/bottle/minikeg) //Its just beer diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm index 7ff14df04c..77b57466d9 100644 --- a/code/modules/cargo/exports/gear.dm +++ b/code/modules/cargo/exports/gear.dm @@ -793,6 +793,7 @@ datum/export/gear/glasses //glasses are not worth selling ////////////////////// /datum/export/gear/chameleon //Selling a full kit is easy money for 2 tc cost = 280 + k_elasticity = 0 unit_name = "chameleon item" export_types = list(/obj/item/clothing/head/chameleon, /obj/item/clothing/mask/chameleon, /obj/item/clothing/under/chameleon, /obj/item/clothing/suit/chameleon, /obj/item/clothing/glasses/chameleon,\ /obj/item/clothing/gloves/chameleon, /obj/item/clothing/head/chameleon, /obj/item/clothing/shoes/chameleon, /obj/item/storage/backpack/chameleon, \ diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index ce4502ba99..b8541dcd33 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -24,11 +24,16 @@ export_types = list(/obj/structure/ore_box) /datum/export/large/crate/wood - cost = 140 + cost = 140 // unit_name = "wooden crate" export_types = list(/obj/structure/closet/crate/wooden) exclude_types = list() +/datum/export/large/barrel + cost = 500 //150 to make meaning proffit of 350 + unit_name = "wooden barrel" + export_types = list(/obj/structure/fermenting_barrel) + /datum/export/large/crate/coffin cost = 150 unit_name = "coffin" @@ -282,17 +287,17 @@ include_subtypes = FALSE /datum/export/large/mech/odysseus - cost = 5500 + cost = 7500 unit_name = "working odysseus" export_types = list(/obj/mecha/medical/odysseus) /datum/export/large/mech/ripley - cost = 6500 + cost = 12000 unit_name = "working ripley" export_types = list(/obj/mecha/working/ripley) /datum/export/large/mech/firefighter - cost = 9000 + cost = 14000 unit_name = "working firefighter" export_types = list(/obj/mecha/working/ripley/firefighter) @@ -302,12 +307,12 @@ export_types = list(/obj/mecha/combat/gygax) /datum/export/large/mech/durand - cost = 10000 + cost = 16000 unit_name = "working durand" export_types = list(/obj/mecha/combat/durand) /datum/export/large/mech/phazon - cost = 25000 //Little over half do to needing a core + cost = 35000 //Little over half do to needing a core unit_name = "working phazon" export_types = list(/obj/mecha/combat/phazon) @@ -317,7 +322,7 @@ export_types = list(/obj/mecha/combat/marauder) /datum/export/large/mech/deathripley - cost = 8500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. + cost = 18500 //Still a "Combat class" mech - Illegal tech as well! 165% "normal" boundy price. unit_name = "working illegally modified" export_types = list(/obj/mecha/working/ripley/deathripley) @@ -332,12 +337,12 @@ export_types = list(/obj/mecha/working/ripley/mining) /datum/export/large/mech/honk - cost = 12000 //Still a "Combat class" mech - Comats bordem honk! + cost = 16000 //Still a "Combat class" mech - Comats bordem honk! unit_name = "working honker" export_types = list(/obj/mecha/combat/honker) /datum/export/large/mech/reticence - cost = 12000 //Still a "Combat class" mech - Has cloking and lethal weaponds. + cost = 16000 //Still a "Combat class" mech - Has cloking and lethal weaponds. unit_name = "working reticence" export_types = list(/obj/mecha/combat/reticence) @@ -347,6 +352,6 @@ export_types = list(/obj/mecha/combat/marauder/seraph) /datum/export/large/mech/mauler - cost = 12000 //Still a Combat class mech - CC lethal weaponds. + cost = 25000 //Still a Combat class mech - CC lethal weaponds. unit_name = "working legally modified marauder" export_types = list(/obj/mecha/combat/marauder/mauler) diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index cd11660ed8..d8fc5f22ab 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -42,7 +42,6 @@ /datum/export/material/plasma cost = 100 - k_elasticity = 0 material_id = MAT_PLASMA message = "cm3 of plasma" diff --git a/code/modules/cargo/exports/orgains_robotics.dm b/code/modules/cargo/exports/organs_robotics.dm similarity index 65% rename from code/modules/cargo/exports/orgains_robotics.dm rename to code/modules/cargo/exports/organs_robotics.dm index 924d27c1d2..7a77568cc7 100644 --- a/code/modules/cargo/exports/orgains_robotics.dm +++ b/code/modules/cargo/exports/organs_robotics.dm @@ -8,7 +8,7 @@ include_subtypes = FALSE k_elasticity = 0 //ALWAYS worth selling upgrades -/datum/export/orgains +/datum/export/organs include_subtypes = TRUE k_elasticity = 0 //ALWAYS worth selling orgains @@ -36,6 +36,7 @@ /datum/export/implant/breathtube cost = 150 + k_elasticity = 300/20 //Large before depleating unit_name = "breath implant" export_types = list(/obj/item/organ/cyberimp/mouth/breathing_tube) @@ -110,7 +111,18 @@ export_types = list(/obj/item/organ/liver) exclude_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/liver/cybernetic/upgraded) -/datum/export/orgains/tail //Shhh +/datum/export/organs/cybernetic + cost = 225 + unit_name = "cybernetic organ" + export_types = list(/obj/item/organ/liver/cybernetic, /obj/item/organ/lungs/cybernetic, /obj/item/organ/eyes/robotic, /obj/item/organ/heart/cybernetic) + exclude_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + +/datum/export/organs/upgraded + cost = 275 + unit_name = "upgraded cybernetic organ" + export_types = list(/obj/item/organ/lungs/cybernetic/upgraded, /obj/item/organ/liver/cybernetic/upgraded) + +/datum/export/organs/tail //Shhh cost = 500 unit_name = "error shipment failer" export_types = list(/obj/item/organ/tail) @@ -136,6 +148,41 @@ export_types = list(/obj/item/bodypart/l_arm/robot/surplus_upgraded, /obj/item/bodypart/r_arm/robot/surplus_upgraded, /obj/item/bodypart/l_leg/robot/surplus_upgraded, /obj/item/bodypart/r_leg/robot/surplus_upgraded) /datum/export/robotics/surgery_gear_basic - cost = 5 + cost = 10 unit_name = "surgery tool" export_types = list(/obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, /obj/item/surgicaldrill, /obj/item/scalpel, /obj/item/circular_saw, /obj/item/surgical_drapes) + +/datum/export/robotics/mech_weapon_laser + cost = 300 //Sadly just metal and glass + unit_name = "mech laser based weapon" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam, /obj/item/mecha_parts/mecha_equipment/weapon/energy) + +/datum/export/robotics/mech_weapon_bullet + cost = 250 + unit_name = "mech bullet based weapon" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun, /obj/item/mecha_parts/mecha_equipment/weapon/honker, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) + +/datum/export/robotics/mech_tools + cost = 150 + unit_name = "mech based tool" + include_subtypes = TRUE + export_types = list(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/extinguisher, /obj/item/mecha_parts/mecha_equipment/rcd, /obj/item/mecha_parts/mecha_equipment/cable_layer, \ + /obj/item/mecha_parts/mecha_equipment/drill, /obj/item/mecha_parts/mecha_equipment/mining_scanner, /obj/item/mecha_parts/mecha_equipment/medical/sleeper) + +/datum/export/robotics/mech_blue_space + cost = 750 + k_elasticity = 1/10 + unit_name = "mech bluespace tech" + export_types = list(/obj/item/mecha_parts/mecha_equipment/teleporter, /obj/item/mecha_parts/mecha_equipment/wormhole_generator, /obj/item/mecha_parts/mecha_equipment/gravcatapult) + +/datum/export/robotics/mech_reactors + cost = 350 + unit_name = "mech based reactor" + export_types = list(/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay, /obj/item/mecha_parts/mecha_equipment/generator, /obj/item/mecha_parts/mecha_equipment/generator/nuclear) + +/datum/export/robotics/mech_armor + cost = 350 + unit_name = "mech armor tech" + export_types = list(/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster, /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster, /obj/item/mecha_parts/mecha_equipment/repair_droid) diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm index b505bb5da4..e53db0bf7b 100644 --- a/code/modules/cargo/exports/parts.dm +++ b/code/modules/cargo/exports/parts.dm @@ -6,14 +6,15 @@ export_types = list(/obj/item/solar_assembly) /datum/export/solar/tracker_board - cost = 30 + cost = 10 unit_name = "solar tracker board" export_types = list(/obj/item/electronics/tracker) /datum/export/solar/control_board - cost = 75 + cost = 15 unit_name = "solar panel control board" export_types = list(/obj/item/circuitboard/computer/solar_control) + include_subtypes = FALSE /datum/export/swarmer cost = 500 @@ -30,9 +31,9 @@ /datum/export/board/SMES cost = 20 - k_elasticity = 1/2 //Only a few unit_name = "smes board" export_types = list(/obj/item/circuitboard/machine/smes) + include_subtypes = FALSE //Stock Parts @@ -70,7 +71,7 @@ export_types = list(/obj/item/stock_parts/cell) include_subtypes = TRUE -/datum/export/cell +/datum/export/cellupgraded cost = 10 unit_name = "upgraded power cell" export_types = list(/obj/item/stock_parts/cell/upgraded, /obj/item/stock_parts/cell/upgraded/plus) diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 8397a7dc1f..f784083097 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -83,6 +83,11 @@ unit_name = "wood plank" export_types = list(/obj/item/stack/sheet/mineral/wood) +/datum/export/stack/log + cost = 10 + unit_name = "raw wood" + export_types = list(/obj/item/grown/log) + /datum/export/stack/cardboard cost = 2 message = "of cardboard" @@ -100,11 +105,17 @@ export_types = list(/obj/item/stack/cable_coil) /datum/export/stack/cloth - cost = 10 + cost = 20 unit_name = "sheets" message = "of cloth" export_types = list(/obj/item/stack/sheet/cloth) +/datum/export/stack/silk + cost = 200 //The new plasma + unit_name = "sheets" + message = "of silk" + export_types = list(/obj/item/stack/sheet/silk) + /datum/export/stack/duracloth cost = 40 unit_name = "sheets" @@ -145,4 +156,4 @@ unit_name = "sheets" cost = 30 message = "of paperframes" - export_types = list(/obj/item/stack/sheet/paperframes) \ No newline at end of file + export_types = list(/obj/item/stack/sheet/paperframes) diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm index 4984bfe9b9..a68d7238b5 100644 --- a/code/modules/cargo/exports/tools.dm +++ b/code/modules/cargo/exports/tools.dm @@ -12,7 +12,7 @@ /datum/export/gear/powerdrill cost = 25 - k_elasticity = 1/40 //Market can only take so much + k_elasticity = 1/80 //Market can only take so much unit_name = "power tool" export_types = list(/obj/item/crowbar/power, /obj/item/screwdriver/power, \ /obj/item/weldingtool/experimental, /obj/item/wirecutters/power, /obj/item/wrench/power) @@ -65,13 +65,13 @@ // Basic tools /datum/export/basicmining - cost = 20 + cost = 30 unit_name = "basic mining tool" export_types = list(/obj/item/pickaxe, /obj/item/pickaxe/mini, /obj/item/shovel, /obj/item/resonator) include_subtypes = FALSE /datum/export/upgradedmining - cost = 50 + cost = 80 unit_name = "mining tool" export_types = list(/obj/item/pickaxe/silver, /obj/item/pickaxe/drill, /obj/item/gun/energy/plasmacutter, /obj/item/resonator/upgraded) include_subtypes = FALSE diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm index 97dd9c10aa..18a525b8dd 100644 --- a/code/modules/cargo/exports/weapons.dm +++ b/code/modules/cargo/exports/weapons.dm @@ -125,7 +125,7 @@ /datum/export/weapon/temp_gun cost = 175 //Its just smaller unit_name = "small temperature gun" - k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make + k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make export_types = list(/obj/item/gun/energy/temperature) /datum/export/weapon/flowergun @@ -140,7 +140,7 @@ /datum/export/weapon/ioncarbine cost = 200 - k_elasticity = 1/5 //Its just a smaller temperature gun, easy to mass make + k_elasticity = 1/30 //Its just a smaller temperature gun, easy to mass make unit_name = "ion carbine" export_types = list(/obj/item/gun/energy/ionrifle/carbine) @@ -174,12 +174,12 @@ ///////////////// /datum/export/weapon/wtammo - cost = 10 + cost = 15 unit_name = "WT-550 automatic rifle ammo" export_types = list(/obj/item/ammo_box/magazine/wt550m9, /obj/item/ammo_box/magazine/wt550m9/wtrubber) /datum/export/weapon/wtammo/advanced - cost = 30 + cost = 45 unit_name = "advanced WT-550 automatic rifle ammo" export_types = list( /obj/item/ammo_box/magazine/wt550m9/wtap, /obj/item/ammo_box/magazine/wt550m9/wttx, /obj/item/ammo_box/magazine/wt550m9/wtic) @@ -194,7 +194,7 @@ export_types = list(/obj/item/firing_pin/test_range) /datum/export/weapon/techslug - cost = 15 + cost = 25 k_elasticity = 0 unit_name = "advanced shotgun shell" export_types = list(/obj/item/ammo_casing/shotgun/dragonsbreath, /obj/item/ammo_casing/shotgun/meteorslug, /obj/item/ammo_casing/shotgun/pulseslug, /obj/item/ammo_casing/shotgun/frag12, /obj/item/ammo_casing/shotgun/ion, /obj/item/ammo_casing/shotgun/laserslug) @@ -211,7 +211,8 @@ /datum/export/weapon/revolver cost = 200 unit_name = "large handgun" - export_types = list(/obj/item/gun/ballistic/revolver/syndie) + export_types = list(/obj/item/gun/ballistic/revolver) + exclude_types = list(/obj/item/gun/ballistic/revolver/russian, /obj/item/gun/ballistic/revolver/doublebarrel) /datum/export/weapon/rocketlauncher cost = 1000 @@ -344,13 +345,13 @@ export_types = list(/obj/item/storage/toolbox/gold_real) /datum/export/weapon/melee - cost = 30 + cost = 50 unit_name = "unlisted weapon" export_types = list(/obj/item/melee) include_subtypes = TRUE /datum/export/weapon/gun - cost = 30 + cost = 50 unit_name = "unlisted weapon" export_types = list(/obj/item/gun) - include_subtypes = TRUE \ No newline at end of file + include_subtypes = TRUE diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index f36ff0ce33..b507b617c3 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -39,14 +39,14 @@ set name = "Release Contents" set category = "Gondola" set desc = "Release any contents stored within your vast belly." - linked_pod.open(src, manual = TRUE) + linked_pod.open(src) /mob/living/simple_animal/pet/gondola/gondolapod/verb/check() set name = "Count Contents" set category = "Gondola" set desc = "Take a deep look inside youself, and count up what's inside" var/total = contents.len - if (total) + if (total) to_chat(src, "You detect [total] object[total > 1 ? "s" : ""] within your incredibly vast belly.") else to_chat(src, "A closer look inside yourself reveals... nothing.") diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index 8708562a06..9ab1827784 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -10,6 +10,21 @@ group = "Livestock" crate_type = /obj/structure/closet/crate/critter +/datum/supply_pack/critter/animal_feed + name = "Animal Feed Crate" + desc = "Feed for livestock, like cows and hens. Contains fifty Wheat bundles and fifty Oat bundles." + cost = 1500 + contains = list(/obj/item/reagent_containers/food/snacks/grown/wheat, + /obj/item/reagent_containers/food/snacks/grown/oat) + crate_name = "animal feed crate" + crate_type = /obj/structure/closet/crate/freezer + +/datum/supply_pack/critter/animal_feed/generate() + . = ..() + for(var/i in 1 to 49) + new /obj/item/reagent_containers/food/snacks/grown/wheat(.) + + /datum/supply_pack/critter/butterfly name = "Butterflies Crate" desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference @@ -29,7 +44,7 @@ cost = 5000 //Cats are worth as much as corgis. contains = list(/mob/living/simple_animal/pet/cat, /obj/item/clothing/neck/petcollar, - /obj/item/toy/cattoy) + /obj/item/toy/cattoy) crate_name = "cat crate" /datum/supply_pack/critter/cat/generate() diff --git a/code/modules/cargo/packs/materials.dm b/code/modules/cargo/packs/materials.dm index 0f8ad2462a..615fbfe827 100644 --- a/code/modules/cargo/packs/materials.dm +++ b/code/modules/cargo/packs/materials.dm @@ -65,6 +65,28 @@ contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" +/datum/supply_pack/organic/rawcotton + name = "Raw Cotton Crate" + desc = "Plushies have been on the down in the market, and now due to a flood of raw cotton the price of it is so cheap, its a steal! Contains 40 raw cotton sheets." + cost = 800 // 100 net cost, 20 x 20 = 400. 300 proffit if turned into cloth sheets or more if turned to silk then 10 x 200 = 2000 + contains = list(/obj/item/stack/sheet/cotton/thirty, + /obj/item/stack/sheet/cotton/ten + ) + crate_name = "cotton crate" + crate_type = /obj/structure/closet/crate/hydroponics + +/datum/supply_pack/organic/rawlumber + name = "Raw Lumber Crate" + desc = "Raw logs from towercaps. Contains fifty logs." + cost = 1000 + contains = list(/obj/item/grown/log) + crate_name = "lumber crate" + +/datum/supply_pack/critter/animal_feed/generate() + . = ..() + for(var/i in 1 to 49) + new /obj/item/grown/log(.) + /datum/supply_pack/materials/rcdammo name = "Spare RDC ammo" desc = "This crate contains sixteen RCD ammo packs, to help with any holes or projects people mite be working on." @@ -168,3 +190,19 @@ contains = list(/obj/structure/reagent_dispensers/watertank/high) crate_name = "high-capacity water tank crate" crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/loom + name = "Loom" + desc = "A large pre-made loom." + cost = 1000 + contains = list(/obj/structure/loom) + crate_name = "loom crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/materials/wooden_barrel + name = "Wooden Barrel" + desc = "Wooden barrels ready for storage." + cost = 1500 + contains = list(/obj/structure/fermenting_barrel) + crate_name = "wooden barrel crate" + crate_type = /obj/structure/closet/crate/large diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 2b5df207c3..78f10b0908 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -69,31 +69,24 @@ /obj/item/storage/fancy/donut_box) crate_name = "candy crate" -/datum/supply_pack/organic/cutlery - name = "Kitchen Cutlery Deluxe Set" - desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal." - cost = 10000 - contraband = TRUE - contains = list(/obj/item/sharpener, - /obj/item/kitchen/fork, - /obj/item/kitchen/fork, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/knife/butcher, - /obj/item/kitchen/rollingpin, //Deluxe for a reason - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/trash/plate, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, - /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) - crate_name = "kitchen cutlery deluxe set" +/datum/supply_pack/organic/exoticseeds + name = "Exotic Seeds Crate" + desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds 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, + /obj/item/seeds/amanita, + /obj/item/seeds/reishi, + /obj/item/seeds/banana, + /obj/item/seeds/eggplant/eggy, + /obj/item/seeds/random, + /obj/item/seeds/random) + crate_name = "exotic seeds crate" + crate_type = /obj/structure/closet/crate/hydroponics /datum/supply_pack/organic/food name = "Food Crate" @@ -120,6 +113,71 @@ /obj/item/reagent_containers/food/snacks/grown/banana) crate_name = "food crate" + +/datum/supply_pack/organic/fruit_1 + name = "Fruit Basic Crate" + desc = "Getting scurvy on the station? Well heres your fixing! Contains three of each - bananas, watermelons, limes, lemons, oranges and even three pineapple." + cost = 2250 + contains = list(/obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/watermelon, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/lime, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/orange, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/citrus/lemon, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana) + crate_name = "fruit crate" + +/datum/supply_pack/organic/fruit_2 + name = "Fruit Delux Crate" + desc = "Getting tired of the basic fruits and want to have something a bit more decadent! This crate is for you! Contains three of each - bunches of berries, apples, pineapples, cherries, green & red grapes, eggplants, bananas lastly ten strawberry." + cost = 3500 + contains = list(/obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/berries, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/apple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/pineapple, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/cherries, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/grapes/green, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/banana, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/eggplant, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry, + /obj/item/reagent_containers/food/snacks/grown/strawberry) + crate_name = "fruit crate" + /datum/supply_pack/organic/cream_piee name = "High-yield Clown-grade Cream Pie Crate" desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results." @@ -171,6 +229,32 @@ crate_name = "hydroponics backpack crate" crate_type = /obj/structure/closet/crate/secure +/datum/supply_pack/organic/cutlery + name = "Kitchen Cutlery Deluxe Set" + desc = "Need to slice and dice away those ''Tomatos'' well we got what you need! From a nice set of knifes, forks, plates, glasses, and a whetstone for when you got some grizzle that is a bit harder to slice then normal." + cost = 10000 + contraband = TRUE + contains = list(/obj/item/sharpener, + /obj/item/kitchen/fork, + /obj/item/kitchen/fork, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/knife/butcher, + /obj/item/kitchen/rollingpin, //Deluxe for a reason + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/trash/plate, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, + /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass) + crate_name = "kitchen cutlery deluxe set" + /datum/supply_pack/organic/mre name = "MRE supply kit (emergency rations)" desc = "The lights are out. Oxygen's running low. You've run out of food except space weevils. Don't let this be you! Order our NT branded MRE kits today! This pack contains 5 MRE packs with a randomized menu and an oxygen tank." @@ -269,22 +353,3 @@ /obj/item/valentine) crate_name = "valentine crate" crate_type = /obj/structure/closet/crate/secure - -/datum/supply_pack/organic/exoticseeds - name = "Exotic Seeds Crate" - desc = "Any entrepreneuring botanist's dream. Contains twelve different seeds, including three replica-pod seeds 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, - /obj/item/seeds/amanita, - /obj/item/seeds/reishi, - /obj/item/seeds/banana, - /obj/item/seeds/eggplant/eggy, - /obj/item/seeds/random, - /obj/item/seeds/random) - crate_name = "exotic seeds crate" - crate_type = /obj/structure/closet/crate/hydroponics diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index ace64b21fb..25b8b2ddfb 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -85,7 +85,7 @@ /datum/supply_pack/science/monkey name = "Monkey Cube Crate" desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!" - cost = 2000 + cost = 1500 contains = list (/obj/item/storage/box/monkeycubes) crate_name = "monkey cube crate" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index 3c68fe7f6d..0bda316ca3 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -34,11 +34,11 @@ desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." cost = 1800 contains = list(/obj/item/detective_scanner, - /obj/item/storage/box/evidence, - /obj/item/camera, - /obj/item/taperecorder, - /obj/item/toy/crayon/white, - /obj/item/clothing/head/fedora/det_hat) + /obj/item/storage/box/evidence, + /obj/item/camera, + /obj/item/taperecorder, + /obj/item/toy/crayon/white, + /obj/item/clothing/head/fedora/det_hat) crate_name = "forensics crate" /datum/supply_pack/security/helmets diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 5442fcb932..7e466caf8a 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -410,7 +410,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) for (var/child in entries) winset(src, "[child]", "[entries[child]]") if (!ispath(child, /datum/verbs/menu)) - var/atom/verb/verbpath = child + var/procpath/verbpath = child if (copytext(verbpath.name,1,2) != "@") new child(src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index edec4d74a6..309f3ca069 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -336,8 +336,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" dat += "

Flavor Text

" dat += "Set Examine Text
" - if(lentext(features["flavor_text"]) <= 40) - if(!lentext(features["flavor_text"])) + if(length(features["flavor_text"]) <= 40) + if(!length(features["flavor_text"])) dat += "\[...\]" else dat += "[features["flavor_text"]]" @@ -2328,9 +2328,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.Digitigrade_Leg_Swap(TRUE) //let's be sure the character updates - character.update_body() - character.update_hair() - character.update_body_parts() + if(icon_updates) + character.update_body() + character.update_hair() + character.update_body_parts() /datum/preferences/proc/get_default_name(name_id) switch(name_id) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2e643cc05d..90c692c60e 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -49,7 +49,7 @@ if(!(damagetype & (BRUTELOSS | FIRELOSS | TOXLOSS | OXYLOSS) )) adjustOxyLoss(max(200 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - death(FALSE) + death(FALSE, penalize = TRUE) return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1793bd8f4b..7e7f8b4285 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -223,7 +223,6 @@ BLIND // can't see anything if(H.w_uniform == src) H.update_suit_sensors() - ..() /obj/item/clothing/under/CtrlClick(mob/user) . = ..() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index cc6d65b74d..984dddf813 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -58,7 +58,7 @@ /obj/item/clothing/gloves/rapid name = "Gloves of the North Star" - desc = "Just looking at these fills you with an urge to beat the shit out of people." + desc = "Just looking at these fills you with an urge to beat the shit out of people. Violently." icon_state = "rapid" item_state = "rapid" transfer_prints = TRUE @@ -69,12 +69,10 @@ return var/mob/living/M = loc - - if(M.a_intent == INTENT_HARM) - M.changeNext_move(CLICK_CD_RAPID) - M.adjustStaminaLoss(-2) //Restore 2/3 of the stamina used assuming empty stam buffer. With proper stamina buffer management, this results in a net gain of +.5 stamina per click. - if(warcry) - M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") + M.changeNext_move(CLICK_CD_RAPID) + M.adjustStaminaLoss(-3.5) // used to be -2 with some comment about stamina buffer management but *shrug -hatterhat + if(warcry) + M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry") .= FALSE @@ -86,7 +84,7 @@ /obj/item/clothing/gloves/rapid/hug name = "Hugs of the North Star" - desc = "Just looking at these fills you with an urge to hug the shit out of people" + desc = "Just looking at these fills you with an urge to hug the shit out of people. In a very friendly manner." warcry = "owo" //Shouldn't ever come into play /obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE) @@ -97,11 +95,11 @@ if(M.a_intent == INTENT_HELP) if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead - if(target.on_fire || target.lying ) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions + if(target.on_fire || target.lying) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions return else M.changeNext_move(CLICK_CD_RAPID) . = FALSE /obj/item/clothing/gloves/rapid/hug/attack_self(mob/user) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index cac98e74fc..071e52b46d 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -370,3 +370,10 @@ if(prob(3)) message += pick(" Honh honh honh!"," Honh!"," Zut Alors!") speech_args[SPEECH_MESSAGE] = trim(message) + +/obj/item/clothing/head/assu_helmet + name = "DAB helmet" + icon_state = "assu_helmet" + item_state = "assu_helmet" + desc = "A cheap replica of old riot helmet without visor. It has \"D.A.B.\" written on the front." + flags_inv = HIDEHAIR diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc885868c5..a18617ea29 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -633,3 +633,13 @@ flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS|HEAD alternate_worn_layer = UNDER_HEAD_LAYER + +/obj/item/clothing/suit/assu_suit + name = "DAB suit" + desc = "A cheap replica of old SWAT armor. On its back, it is written: \"Desperate Assistance Battle-force\"." + icon_state = "assu_suit" + item_state = "assu_suit" + blood_overlay_type = "armor" + body_parts_covered = CHEST|GROIN|ARMS|LEGS + flags_inv = HIDEJUMPSUIT + resistance_flags = NONE diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 0fb46c3e46..795515835e 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -32,7 +32,7 @@ CAT_SANDWICH, CAT_SOUP, CAT_SPAGHETTI), - CAT_CLOTHING) //Clothing subcategories + CAT_NONE) //Clothing subcategories var/datum/action/innate/crafting/button var/display_craftable_only = FALSE diff --git a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm index 6eb1c31b12..bc3a3dcf05 100644 --- a/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/modules/crafting/recipes/recipes_weapon_and_ammo.dm @@ -84,7 +84,7 @@ name = "Liz O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip reqs = list(/obj/item/organ/tail/lizard = 1, - /obj/item/stack/cable_coil = 1) + /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON @@ -93,7 +93,7 @@ name = "Cat O' Nine Tails" result = /obj/item/melee/chainofcommand/tailwhip/kitty reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/stack/cable_coil = 1) + /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index 8fc1a7ab3d..8d4c5af540 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -13,13 +13,7 @@ if(prob(90)) priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Unstable bluespace anomaly" - P.info = "Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Unstable bluespace anomaly") /datum/round_event/anomaly/anomaly_bluespace/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 73562e49e5..00516fcb5c 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -14,13 +14,7 @@ if(prob(90)) priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Localized hyper-energetic flux wave" - P.info = "Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].","Localized hyper-energetic flux wave") /datum/round_event/anomaly/anomaly_flux/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 6e9014f13c..7761d02ec8 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -12,13 +12,7 @@ if(prob(90)) priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Gravitational anomaly" - P.info = "Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Gravitational anomaly") /datum/round_event/anomaly/anomaly_grav/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 988ccadb76..13137741cc 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -12,13 +12,7 @@ if(prob(90)) priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Pyroclastic anomaly" - P.info = "Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Pyroclastic anomaly") /datum/round_event/anomaly/anomaly_pyro/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index 2550dc191e..7646f3e072 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -14,13 +14,7 @@ if(prob(90)) priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Vortex anomaly" - P.info = "Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + print_command_report("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name].","Vortex anomaly") /datum/round_event/anomaly/anomaly_vortex/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index d2a5c27883..d72c80686d 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -4,8 +4,8 @@ weight = 10 max_occurrences = 1 - earliest_start = 60 MINUTES - min_players = 40 + earliest_start = 40 MINUTES + min_players = 35 gamemode_blacklist = list("blob") //Just in case a blob survives that long @@ -18,13 +18,7 @@ if(prob(75)) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", "outbreak5") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "level 5 biohazard" - P.info = "Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak." - P.update_icon() + print_command_report("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "level 5 biohazard") /datum/round_event/ghost_role/blob/spawn_role() if(!GLOB.blobstart.len) diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index d422a0aa4f..30b59bf14a 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -38,13 +38,8 @@ if(prob(50)) priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Rampant brand intelligence" - P.info = "Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source]." - P.update_icon() + print_command_report("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Rampant brand intelligence") + /datum/round_event/brand_intelligence/start() for(var/obj/machinery/vending/V in GLOB.machines) if(!is_station_level(V.z)) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 5a592d7f34..5940acad2f 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -17,13 +17,7 @@ if(prob(50)) priority_announce("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Biological entities" - P.info = "Unknown biological entities have been detected near [station_name()], you may wish to break out arms." - P.update_icon() + print_command_report("Unknown biological entities have been detected near [station_name()], you may wish to break out arms.", "Biological entities") /datum/round_event/carp_migration/start() diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 10936409f9..9845832c30 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -15,13 +15,7 @@ if(prob(50)) priority_announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Electrical Storm" - P.info = "An electrical storm has been detected in your area, please repair potential electronic overloads." - P.update_icon() + print_command_report("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm") /datum/round_event/electrical_storm/start() var/list/epicentreList = list() diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm index 8f77af58eb..dec55ed8ff 100644 --- a/code/modules/events/holiday/vday.dm +++ b/code/modules/events/holiday/vday.dm @@ -67,62 +67,62 @@ /obj/item/valentine/New() ..() message = pick("Roses are red / Violets are good / One day while Andy...", - "My love for you is like the singularity. It cannot be contained.", - "Will you be my lusty xenomorph maid?", - "We go together like the clown and the external airlock.", - "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", - "Be my valentine. Law 2.", - "You must be a mime, because you leave me speechless.", - "I love you like Ian loves the HoP.", - "You're hotter than a plasma fire in toxins.", - "Are you a rogue atmos tech? Because you're taking my breath away.", - "Could I have all access... to your heart?", - "Call me the doctor, because I'm here to inspect your johnson.", - "I'm not a changeling, but you make my proboscis extend.", - "I just can't get EI NATH of you.", - "You must be a nuke op, because you make my heart explode.", - "Roses are red / Botany is a farm / Not being my Valentine / causes human harm.", - "I want you more than an assistant wants insulated gloves.", - "If I was a security officer, I'd brig you all shift.", - "Are you the janitor? Because I think I've fallen for you.", - "You're always valid to my heart.", - "I'd risk the wrath of the gods to bwoink you.", - "You look as beautiful now as the last time you were cloned.", - "Someone check the gravitational generator, because I'm only attracted to you.", - "If I were the warden I'd always let you into my armory.", - "The virologist is rogue, and the only cure is a kiss from you.", - "Would you spend some time in my upgraded sleeper?", - "You must be a silicon, because you've unbolted my heart.", - "Are you Nar'Sie? Because there's nar-one else I sie.", - "If you were a taser, you'd be set to stunning.", - "Do you have stamina damage from running through my dreams?", - "If I were an alien, would you let me hug you?", - "My love for you is stronger than a reinforced wall.", - "This must be the captain's office, because I see a fox.", - "I'm not a highlander, but there can only be one for me.", - "The floor is made of lava! Quick, get on my bed.", - "If you were an abandoned station you'd be the DEARelict.", - "If you had a pickaxe you'd be a shaft FINEr.", - "Roses are red, tide is gray, if I were an assistant I'd steal you away.", - "Roses are red, text is green, I love you more than cleanbots clean.", - "If you were a carp I'd fi-lay you.", - "I'm a nuke op, and my pinpointer leads to your heart.", - "Wanna slay my megafauna?", - "I'm a clockwork cultist. Or zl inyragvar.", - "If you were a disposal bin I'd ride you all day.", - "Put on your explorer's suit because I'm taking you to LOVEaland.", - "I must be the CMO, 'cause I saw you on my CUTE sensors.", - "You're the vomit to my flyperson.", - "You must be liquid dark matter, because you're pulling me closer.", - "Not even sorium can drive me away from you.", - "Wanna make like a borg and do some heavy petting?", - "Are you powering the station? Because you super matter to me.", - "I wish science could make me a bag of holding you.", - "Let's call the emergency CUDDLE.", - "I must be tripping on BZ, because I saw an angel walk by.", - "Wanna empty out my tool storage?", - "Did you visit the medbay after you fell from heaven?", - "Are you wearing space pants? Wanna not be?" ) + "My love for you is like the singularity. It cannot be contained.", + "Will you be my lusty xenomorph maid?", + "We go together like the clown and the external airlock.", + "Roses are red / Liches are wizards / I love you more than a whole squad of lizards.", + "Be my valentine. Law 2.", + "You must be a mime, because you leave me speechless.", + "I love you like Ian loves the HoP.", + "You're hotter than a plasma fire in toxins.", + "Are you a rogue atmos tech? Because you're taking my breath away.", + "Could I have all access... to your heart?", + "Call me the doctor, because I'm here to inspect your johnson.", + "I'm not a changeling, but you make my proboscis extend.", + "I just can't get EI NATH of you.", + "You must be a nuke op, because you make my heart explode.", + "Roses are red / Botany is a farm / Not being my Valentine / causes human harm.", + "I want you more than an assistant wants insulated gloves.", + "If I was a security officer, I'd brig you all shift.", + "Are you the janitor? Because I think I've fallen for you.", + "You're always valid to my heart.", + "I'd risk the wrath of the gods to bwoink you.", + "You look as beautiful now as the last time you were cloned.", + "Someone check the gravitational generator, because I'm only attracted to you.", + "If I were the warden I'd always let you into my armory.", + "The virologist is rogue, and the only cure is a kiss from you.", + "Would you spend some time in my upgraded sleeper?", + "You must be a silicon, because you've unbolted my heart.", + "Are you Nar'Sie? Because there's nar-one else I sie.", + "If you were a taser, you'd be set to stunning.", + "Do you have stamina damage from running through my dreams?", + "If I were an alien, would you let me hug you?", + "My love for you is stronger than a reinforced wall.", + "This must be the captain's office, because I see a fox.", + "I'm not a highlander, but there can only be one for me.", + "The floor is made of lava! Quick, get on my bed.", + "If you were an abandoned station you'd be the DEARelict.", + "If you had a pickaxe you'd be a shaft FINEr.", + "Roses are red, tide is gray, if I were an assistant I'd steal you away.", + "Roses are red, text is green, I love you more than cleanbots clean.", + "If you were a carp I'd fi-lay you.", + "I'm a nuke op, and my pinpointer leads to your heart.", + "Wanna slay my megafauna?", + "I'm a clockwork cultist. Or zl inyragvar.", + "If you were a disposal bin I'd ride you all day.", + "Put on your explorer's suit because I'm taking you to LOVEaland.", + "I must be the CMO, 'cause I saw you on my CUTE sensors.", + "You're the vomit to my flyperson.", + "You must be liquid dark matter, because you're pulling me closer.", + "Not even sorium can drive me away from you.", + "Wanna make like a borg and do some heavy petting?", + "Are you powering the station? Because you super matter to me.", + "I wish science could make me a bag of holding you.", + "Let's call the emergency CUDDLE.", + "I must be tripping on BZ, because I saw an angel walk by.", + "Wanna empty out my tool storage?", + "Did you visit the medbay after you fell from heaven?", + "Are you wearing space pants? Wanna not be?" ) /obj/item/valentine/attackby(obj/item/W, mob/user, params) ..() @@ -162,24 +162,24 @@ /obj/item/reagent_containers/food/snacks/candyheart/New() ..() desc = pick("A heart-shaped candy that reads: HONK ME", - "A heart-shaped candy that reads: ERP", - "A heart-shaped candy that reads: LEWD", - "A heart-shaped candy that reads: LUSTY", - "A heart-shaped candy that reads: SPESS LOVE", - "A heart-shaped candy that reads: AYY LMAO", - "A heart-shaped candy that reads: TABLE ME", - "A heart-shaped candy that reads: HAND CUFFS", - "A heart-shaped candy that reads: SHAFT MINER", - "A heart-shaped candy that reads: BANGING DONK", - "A heart-shaped candy that reads: Y-YOU T-TOO", - "A heart-shaped candy that reads: GOT WOOD", - "A heart-shaped candy that reads: TFW NO GF", - "A heart-shaped candy that reads: WAG MY TAIL", - "A heart-shaped candy that reads: VALIDTINES", - "A heart-shaped candy that reads: FACEHUGGER", - "A heart-shaped candy that reads: BOX OF HUGS", - "A heart-shaped candy that reads: REEBE MINE", - "A heart-shaped candy that reads: PET ME", - "A heart-shaped candy that reads: TO THE DORMS", - "A heart-shaped candy that reads: DIS MEMBER") + "A heart-shaped candy that reads: ERP", + "A heart-shaped candy that reads: LEWD", + "A heart-shaped candy that reads: LUSTY", + "A heart-shaped candy that reads: SPESS LOVE", + "A heart-shaped candy that reads: AYY LMAO", + "A heart-shaped candy that reads: TABLE ME", + "A heart-shaped candy that reads: HAND CUFFS", + "A heart-shaped candy that reads: SHAFT MINER", + "A heart-shaped candy that reads: BANGING DONK", + "A heart-shaped candy that reads: Y-YOU T-TOO", + "A heart-shaped candy that reads: GOT WOOD", + "A heart-shaped candy that reads: TFW NO GF", + "A heart-shaped candy that reads: WAG MY TAIL", + "A heart-shaped candy that reads: VALIDTINES", + "A heart-shaped candy that reads: FACEHUGGER", + "A heart-shaped candy that reads: BOX OF HUGS", + "A heart-shaped candy that reads: REEBE MINE", + "A heart-shaped candy that reads: PET ME", + "A heart-shaped candy that reads: TO THE DORMS", + "A heart-shaped candy that reads: DIS MEMBER") icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4") diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index c08de985fb..d7d8f1aec8 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -19,10 +19,4 @@ if(prob(50)) priority_announce(pick(reason), "Collision Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Collision Alert" - P.info = "[pick(reason)]" - P.update_icon() \ No newline at end of file + print_command_report("[pick(reason)]", "Collision Alert") diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 4aa9fb305d..31ea9dcb03 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -20,7 +20,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + startWhen = rand(180, 360) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? if(GLOB.singularity_counter) startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm index 911ce1dfbc..373c495972 100644 --- a/code/modules/events/mice_migration.dm +++ b/code/modules/events/mice_migration.dm @@ -23,13 +23,7 @@ into the [location].", "Migration Alert", 'sound/effects/mousesqueek.ogg') else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Rodent Migration" - P.info = "Due to [cause], [plural] [name] have [movement] into the [location]." - P.update_icon() + print_command_report("Due to [cause], [plural] [name] have [movement] into the [location].", "Rodent Migration") /datum/round_event/mice_migration/start() SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index 477655db8b..cd02a06f59 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -75,7 +75,7 @@ spawner.create(M.ckey) candidates -= M else - notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("Space pirates are waking up!", source = spawner, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 24be0e5644..178d66e9aa 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -33,13 +33,7 @@ if(prob(50)) priority_announce("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Security Alert") else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Gr3y.T1d3 virus" - P.info = "Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement." - P.update_icon() + print_command_report("Gr3y.T1d3 virus detected in [station_name()] door subroutines. Severity level of [severity]. Recommend station AI involvement.", "Gr3y.T1d3 virus") else log_world("ERROR: Could not initate grey-tide. No areas in the list!") kill() diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 3fe52c338b..88059f7468 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -27,109 +27,43 @@ /datum/round_event/shuttle_loan/announce(fake) SSshuttle.shuttle_loan = src + var/message = "Cargo: I just wanna tell you techs good luck, we are all counting on you." + var/title = "CentCom Free Real Estate" switch(dispatch_type) if(HIJACK_SYNDIE) - if(prob(50)) - priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." - P.update_icon() + message = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." + title = "CentCom Counter Intelligence" if(RUSKY_PARTY) - if(prob(50)) - priority_announce("Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache." - P.update_icon() + message = "Cargo: A group of angry Russians want to have a party. Can you send them your cargo shuttle then make them disappear?" + title = "CentCom Russian Outreach Program" if(SPIDER_GIFT) - if(prob(50)) - priority_announce("Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?","CentCom Diplomatic Corps") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?" - P.update_icon() + message = "Cargo: The Spider Clan has sent us a mysterious gift. Can we ship it to you to see what's inside?" + title = "CentCom Diplomatic Corps" if(DEPARTMENT_RESUPPLY) - if(prob(50)) - priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?" - P.update_icon() + message = "Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?" + title = "CentCom Supply Department" if(ANTIDOTE_NEEDED) - if(prob(50)) - priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples." - P.update_icon() + message = "Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples." + title = "CentCom Research Initiatives" if (PIZZA_DELIVERY) - if(prob(50)) - priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead.", "CentCom Spacepizza Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead." - P.update_icon() + message = "Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead." + title = "CentCom Spacepizza Division" if(ITS_HIP_TO) - if(prob(50)) - priority_announce("Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?", "CentCom Janitorial Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?." - P.update_icon() + message = "Cargo: One of our freighters carrying a bee shipment has been attacked by eco-terrorists. Can you clean up the mess for us?" + title = "CentCom Janitorial Division" bonus_points = 20000 //Toxin bees can be unbeelievably lethal if(MY_GOD_JC) - if(prob(50)) - priority_announce("Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it.", "CentCom Security Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it." - P.update_icon() + message = "Cargo: We have discovered an active Syndicate bomb near our VIP shuttle's fuel lines. If you feel up to the task, we will pay you for defusing it." + title = "CentCom Security Division" bonus_points = 45000 //If you mess up, people die and the shuttle gets turned into swiss cheese if(DELTA_CRATES) - if(prob(50)) - priority_announce("Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?.", "CentCom Security Division") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Cargo Report" - P.info = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?." - P.update_icon() + message = "Cargo: We have discovered a warehouse of DELTA locked crates, we cant store any more of them at CC can you take them for us?." + title = "CentCom Security Division" bonus_points = 25000 //If you mess up, people die and the shuttle gets turned into swiss cheese + if(prob(50)) + priority_announce(message, title) + else + print_command_report(message, "Cargo report") /datum/round_event/shuttle_loan/proc/loan_shuttle() priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d3ccbd0fd8..b557c1dc4e 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -672,7 +672,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( "AI [pick("rogue", "is dead")]!!") var/list/mob/living/carbon/people = list() - var/list/mob/living/carbon/person = null + var/mob/living/carbon/person = null var/datum/language/understood_language = target.get_random_understood_language() for(var/mob/living/carbon/H in view(target)) if(H == target) @@ -894,7 +894,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( SEND_SOUND(target, get_announcer_sound("aimalf")) if("meteors") //Meteors inbound! to_chat(target, "

Meteor Alert

") - to_chat(target, "

Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(300,600)/60)] minutes.

") + to_chat(target, "

Meteors have been detected on collision course with the station. Estimated time until impact: [round(rand(180,360)/60)] minutes.

") SEND_SOUND(target, get_announcer_sound("meteors")) if("supermatter") SEND_SOUND(target, 'sound/magic/charge.ogg') diff --git a/code/modules/food_and_drinks/autobottler.dm b/code/modules/food_and_drinks/autobottler.dm new file mode 100644 index 0000000000..6d5e0508a9 --- /dev/null +++ b/code/modules/food_and_drinks/autobottler.dm @@ -0,0 +1,18 @@ +/obj/machinery/rnd/production/protolathe/department/autobottler //We want to link with Rnd + name = "auto bottler" + desc = "Takes glass, metal and booze to make exports." + icon_state = "protolathe" + circuit = /obj/item/circuitboard/machine/autobottler + categories = list( + "Wines", + "Beers", + "Brands", + "Storge", + ) + production_animation = "protolathe_n" + allowed_buildtypes = AUTOBOTTLER + +//Brands - This is just export verson of the booze bottles +//Storge - Just the bottles not booze inside +//Wines - Holds wines later made by Sci nodes +//Beers - Holds beers later made by Sci nodes \ No newline at end of file diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 322af63e48..7170f9dbdf 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -133,18 +133,27 @@ icon_state = "ginbottle" list_reagents = list("gin" = 100) +/obj/item/reagent_containers/food/drinks/bottle/gin/empty + list_reagents = list("gin" = 0) + /obj/item/reagent_containers/food/drinks/bottle/whiskey name = "Uncle Git's special reserve" desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES." icon_state = "whiskeybottle" list_reagents = list("whiskey" = 100) +/obj/item/reagent_containers/food/drinks/bottle/whiskey/empty + list_reagents = list("whiskey" = 0) + /obj/item/reagent_containers/food/drinks/bottle/vodka name = "Tunguska triple distilled" desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide." icon_state = "vodkabottle" list_reagents = list("vodka" = 100) +/obj/item/reagent_containers/food/drinks/bottle/vodka/empty + list_reagents = list("vodka" = 0) + /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka name = "Badminka vodka" desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'." @@ -157,6 +166,9 @@ icon_state = "tequilabottle" list_reagents = list("tequila" = 100) +/obj/item/reagent_containers/food/drinks/bottle/tequila/empty + list_reagents = list("tequila" = 0) + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing name = "bottle of nothing" desc = "A bottle filled with nothing." @@ -164,18 +176,27 @@ list_reagents = list("nothing" = 100) foodtype = NONE +/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing/empty + list_reagents = list("nothing" = 0) + /obj/item/reagent_containers/food/drinks/bottle/patron name = "Wrapp Artiste Patron" desc = "Silver laced tequila, served in space night clubs across the galaxy." icon_state = "patronbottle" list_reagents = list("patron" = 100) +/obj/item/reagent_containers/food/drinks/bottle/patron/empty + list_reagents = list("patron" = 0) + /obj/item/reagent_containers/food/drinks/bottle/rum name = "Captain Pete's Cuban spiced rum" desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle." icon_state = "rumbottle" list_reagents = list("rum" = 100) +/obj/item/reagent_containers/food/drinks/bottle/rum/empty + list_reagents = list("rum" = 0) + /obj/item/reagent_containers/food/drinks/bottle/holywater name = "flask of holy water" desc = "A flask of the chaplain's holy water." @@ -207,6 +228,9 @@ icon_state = "vermouthbottle" list_reagents = list("vermouth" = 100) +/obj/item/reagent_containers/food/drinks/bottle/vermouth/empty + list_reagents = list("vermouth" = 0) + /obj/item/reagent_containers/food/drinks/bottle/kahlua name = "Robert Robust's coffee liqueur" desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK." @@ -214,18 +238,27 @@ list_reagents = list("kahlua" = 100) foodtype = VEGETABLES +/obj/item/reagent_containers/food/drinks/bottle/kahlua/empty + list_reagents = list("kahlua" = 0) + /obj/item/reagent_containers/food/drinks/bottle/goldschlager name = "College Girl goldschlager" desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps." icon_state = "goldschlagerbottle" list_reagents = list("goldschlager" = 100) +/obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty + list_reagents = list("goldschlager" = 0) + /obj/item/reagent_containers/food/drinks/bottle/cognac name = "Chateau de Baton premium cognac" desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time." icon_state = "cognacbottle" list_reagents = list("cognac" = 100) +/obj/item/reagent_containers/food/drinks/bottle/cognac/empty + list_reagents = list("cognac" = 0) + /obj/item/reagent_containers/food/drinks/bottle/wine name = "Doublebeard's bearded special wine" desc = "A faint aura of unease and asspainery surrounds the bottle." @@ -233,12 +266,18 @@ list_reagents = list("wine" = 100) foodtype = FRUIT | ALCOHOL +/obj/item/reagent_containers/food/drinks/bottle/wine/empty + list_reagents = list("wine" = 0) + /obj/item/reagent_containers/food/drinks/bottle/absinthe name = "extra-strong absinthe" desc = "An strong alcoholic drink brewed and distributed by" icon_state = "absinthebottle" list_reagents = list("absinthe" = 100) +/obj/item/reagent_containers/food/drinks/bottle/absinthe/empty + list_reagents = list("absinthe" = 0) + /obj/item/reagent_containers/food/drinks/bottle/absinthe/Initialize() . = ..() redact() @@ -300,18 +339,27 @@ volume = 50 list_reagents = list("hcider" = 50) +/obj/item/reagent_containers/food/drinks/bottle/hcider/empty + list_reagents = list("hcider" = 0) + /obj/item/reagent_containers/food/drinks/bottle/grappa name = "Phillipes well-aged Grappa" desc = "Bottle of Grappa." icon_state = "grappabottle" list_reagents = list("grappa" = 100) +/obj/item/reagent_containers/food/drinks/bottle/grappa/empty + list_reagents = list("grappa" = 0) + /obj/item/reagent_containers/food/drinks/bottle/sake name = "Ryo's traditional sake" desc = "Sweet as can be, and burns like fire going down." icon_state = "sakebottle" list_reagents = list("sake" = 100) +/obj/item/reagent_containers/food/drinks/bottle/sake/empty + list_reagents = list("sake" = 0) + /obj/item/reagent_containers/food/drinks/bottle/sake/Initialize() . = ..() if(prob(10)) @@ -329,6 +377,9 @@ icon_state = "fernetbottle" list_reagents = list("fernet" = 100) +/obj/item/reagent_containers/food/drinks/bottle/fernet/empty + list_reagents = list("fernet" = 0) + /obj/item/reagent_containers/food/drinks/bottle/applejack name = "Buckin' Bronco's Applejack" desc = "Kicks like a horse, tastes like an apple!" @@ -336,18 +387,27 @@ list_reagents = list("applejack" = 100) foodtype = FRUIT +/obj/item/reagent_containers/food/drinks/bottle/applejack/empty + list_reagents = list("applejack" = 0) + /obj/item/reagent_containers/food/drinks/bottle/champagne name = "Eau d' Dandy Brut Champagne" desc = "Finely sourced from only the most pretentious French vineyards." icon_state = "champagne_bottle" list_reagents = list("champagne" = 100) +/obj/item/reagent_containers/food/drinks/bottle/champagne/empty + list_reagents = list("champagne" = 0) + /obj/item/reagent_containers/food/drinks/bottle/blazaam name = "Ginbad's Blazaam" desc = "You feel like you should give the bottle a good rub before opening." icon_state = "blazaambottle" list_reagents = list("blazaam" = 100) +/obj/item/reagent_containers/food/drinks/bottle/blazaam/empty + list_reagents = list("blazaam" = 0) + /obj/item/reagent_containers/food/drinks/bottle/trappist name = "Mont de Requin Trappistes Bleu" desc = "Brewed in space-Belgium. Fancy!" @@ -355,6 +415,8 @@ volume = 50 list_reagents = list("trappist" = 50) +/obj/item/reagent_containers/food/drinks/bottle/trappist/empty + list_reagents = list("trappist" = 0) //////////////////////////JUICES AND STUFF /////////////////////// @@ -420,6 +482,8 @@ list_reagents = list("grenadine" = 100) foodtype = FRUIT +/obj/item/reagent_containers/food/drinks/bottle/grenadine/empty + list_reagents = list("grenadine" = 0) ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/food/drinks/bottle/molotov @@ -487,3 +551,131 @@ to_chat(user, "You snuff out the flame on [src].") cut_overlay(GLOB.fire_overlay) active = 0 + +/obj/item/export/bottle/attack_self(mob/user) + to_chat(user, "The seal seems fine. Best to not open it.") + return + +/obj/item/export/bottle + name = "Report this please" + desc = "A sealed bottle of alcohol, ready to be exported" + icon = 'icons/obj/drinks.dmi' + force = 0 + throwforce = 0 + throw_speed = 0 + throw_range = 0 + w_class = WEIGHT_CLASS_TINY + item_state = "beer" + attack_verb = list("boop", "thunked", "shown") + +/obj/item/export/bottle/gin + icon_state = "ginbottle" + name = "Sealed Gin" + +/obj/item/export/bottle/wine + icon_state = "winebottle" + name = "Sealed Wine" + +/obj/item/export/bottle/whiskey + icon_state = "whiskeybottle" + name = "Sealed Whiskey" + +/obj/item/export/bottle/vodka + icon_state = "vodkabottle" + name = "Sealed Vodka" + +/obj/item/export/bottle/tequila + icon_state = "tequilabottle" + name = "Sealed Tequila" + +/obj/item/export/bottle/patron + icon_state = "patronbottle" + name = "Sealed Patron" + +/obj/item/export/bottle/rum + icon_state = "rumbottle" + name = "Sealed Rum" + +/obj/item/export/bottle/vermouth + icon_state = "vermouthbottle" + name = "Sealed Vermouth" + +/obj/item/export/bottle/kahlua + icon_state = "kahluabottle" + name = "Sealed Kahlua" + +/obj/item/export/bottle/goldschlager + icon_state = "goldschlagerbottle" + name = "Sealed Goldschlager" + +/obj/item/export/bottle/hcider + icon_state = "hcider" + name = "Sealed Cider" + +/obj/item/export/bottle/cognac + icon_state = "cognacbottle" + name = "Sealed Cognac" + +/obj/item/export/bottle/absinthe + icon_state = "absinthebottle" + name = "Sealed Unmarked Absinthe" + +/obj/item/export/bottle/grappa + icon_state = "grappabottle" + name = "Sealed Grappa" + +/obj/item/export/bottle/sake + icon_state = "sakebottle" + name = "Sealed Sake" + +/obj/item/export/bottle/fernet + icon_state = "fernetbottle" + name = "Sealed Fernet" + +/obj/item/export/bottle/applejack + icon_state = "applejack_bottle" + name = "Sealed Applejack" + +/obj/item/export/bottle/champagne + icon_state = "champagne_bottle" + name = "Sealed Champagne" + +/obj/item/export/bottle/blazaam + icon_state = "blazaambottle" + name = "Sealed Blazaam" + +/obj/item/export/bottle/trappist + icon_state = "trappistbottle" + name = "Sealed Trappist" + +/obj/item/export/bottle/grenadine + icon_state = "grenadine" + name = "Sealed Grenadine" + +/obj/item/export/bottle/minikeg + name = "Mini-Beer Keg" + icon_state = "keggy" + desc = "A small wooden barrle with metal rings, untapped beer inside." + +/obj/item/export/bottle/blooddrop + icon_state = "champagne_selling_bottle" + name = "Blood Drop" + desc = "Large red bottle filled with a mix of wine and other named brands." + +/obj/item/export/bottle/slim_gold + name = "Slim Gold " + icon_state = "selling_bottle_alt" + desc = "A gold looking yellow bottle that has a mix of different named brands." + +/obj/item/export/bottle/white_bloodmoon + name = "White Bloodmoon" + icon_state = "selling_bottle_basic" + desc = "Rather simple bottle for this kind of drink." + +/obj/item/export/bottle/greenroad + name = "Green Road" + icon_state = "selling_bottle" + desc = "Ironic name as the fruit used is from ashy plants." + + + diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index ee169e9861..ea573a2cf0 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -282,7 +282,7 @@ tastes = list("meat" = 1) /obj/item/reagent_containers/food/snacks/meat/steak/plain - foodtype = MEAT + foodtype = MEAT /obj/item/reagent_containers/food/snacks/meat/steak/plain/human tastes = list("tender meat" = 1) @@ -340,7 +340,7 @@ /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain - foodtype = MEAT + foodtype = MEAT /obj/item/reagent_containers/food/snacks/meat/rawcutlet/plain/human cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/plain/human diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 58f7985291..fde4611473 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -308,7 +308,7 @@ /obj/item/reagent_containers/food/snacks/pizza/margherita = 1, /obj/item/reagent_containers/food/snacks/pizza/sassysage = 0.8, /obj/item/reagent_containers/food/snacks/pizza/vegetable = 0.8, - /obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5, + /obj/item/reagent_containers/food/snacks/pizza/pineapple = 0.5, /obj/item/reagent_containers/food/snacks/pizza/donkpocket = 0.3, /obj/item/reagent_containers/food/snacks/pizza/dank = 0.1) //pizzas here are weighted by chance to be someone's favorite var/static/list/pizza_preferences diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index 284affe2ec..9c14badb23 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -69,7 +69,9 @@ /datum/crafting_recipe/food/birthdaycake name = "Birthday cake" reqs = list( - /obj/item/clothing/head/hardhat/cakehat = 1, + /datum/reagent/consumable/sugar = 10, + /obj/item/candle = 1, + /obj/item/reagent_containers/food/snacks/grown/vanillapod = 2, /obj/item/reagent_containers/food/snacks/store/cake/plain = 1 ) result = /obj/item/reagent_containers/food/snacks/store/cake/birthday diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 30c265e237..b5bed4d5fc 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -8,7 +8,7 @@ reqs = list( /datum/reagent/consumable/milk = 5, /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/banana = 1 + /obj/item/reagent_containers/food/snacks/grown/banana = 1 ) result = /obj/item/reagent_containers/food/snacks/pie/cream subcategory = CAT_PIE @@ -46,7 +46,7 @@ name = "Cherry pie" reqs = list( /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/cherries = 1 + /obj/item/reagent_containers/food/snacks/grown/cherries = 1 ) result = /obj/item/reagent_containers/food/snacks/pie/cherrypie subcategory = CAT_PIE @@ -122,11 +122,11 @@ /datum/crafting_recipe/food/grapetart name = "Grape tart" reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/grapes = 3 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/grapes = 3 + ) result = /obj/item/reagent_containers/food/snacks/pie/grapetart subcategory = CAT_PIE @@ -183,11 +183,11 @@ name = "Mime tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /datum/reagent/consumable/nothing = 5 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /datum/reagent/consumable/nothing = 5 + ) result = /obj/item/reagent_containers/food/snacks/pie/mimetart subcategory = CAT_PIE @@ -195,11 +195,11 @@ name = "Berry tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/berries = 3 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/berries = 3 + ) result = /obj/item/reagent_containers/food/snacks/pie/berrytart subcategory = CAT_PIE @@ -207,20 +207,20 @@ name = "Chocolate Lava tart" always_availible = FALSE reqs = list( - /datum/reagent/consumable/milk = 5, - /datum/reagent/consumable/sugar = 5, - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/chocolatebar = 3, - /obj/item/slime_extract = 1 - ) + /datum/reagent/consumable/milk = 5, + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/chocolatebar = 3, + /obj/item/slime_extract = 1 + ) result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart subcategory = CAT_PIE /datum/crafting_recipe/food/peachpie name = "Peach Pie" reqs = list( - /obj/item/reagent_containers/food/snacks/pie/plain = 1, - /obj/item/reagent_containers/food/snacks/grown/peach = 3 - ) + /obj/item/reagent_containers/food/snacks/pie/plain = 1, + /obj/item/reagent_containers/food/snacks/grown/peach = 3 + ) result = /obj/item/reagent_containers/food/snacks/pie/peachpie subcategory = CAT_PIE \ No newline at end of file diff --git a/code/modules/holiday/halloween/bartholomew.dm b/code/modules/holiday/halloween/bartholomew.dm index aa119dca84..f51b8b7ea1 100644 --- a/code/modules/holiday/halloween/bartholomew.dm +++ b/code/modules/holiday/halloween/bartholomew.dm @@ -1,72 +1,72 @@ /obj/effect/landmark/barthpot - name = "barthpot" + name = "barthpot" /obj/item/barthpot - name = "Bartholomew" - icon = 'icons/obj/halloween_items.dmi' - icon_state = "barthpot" - anchored = TRUE - var/items_list = list() - speech_span = "spooky" - var/active = TRUE + name = "Bartholomew" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "barthpot" + anchored = TRUE + var/items_list = list() + speech_span = "spooky" + var/active = TRUE /obj/item/barthpot/Destroy() - var/obj/item/barthpot/n = new src(loc) - n.items_list = items_list - ..() + var/obj/item/barthpot/n = new src(loc) + n.items_list = items_list + ..() /obj/item/barthpot/attackby(obj/item/I, mob/user, params) - if(!active) - say("Meow!") - return + if(!active) + say("Meow!") + return - for(var/I2 in items_list) - if(istype(I, I2)) - qdel(I) - new /obj/item/reagent_containers/food/snacks/special_candy(loc) - to_chat(user, "You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.") - say("Hooray! Thank you!") - items_list -= I2 - return - say("It doesn't seem like that's magical enough!") + for(var/I2 in items_list) + if(istype(I, I2)) + qdel(I) + new /obj/item/reagent_containers/food/snacks/special_candy(loc) + to_chat(user, "You add the [I.name] to the pot and watch as it melts into the mixture, a candy crystalising in it's wake.") + say("Hooray! Thank you!") + items_list -= I2 + return + say("It doesn't seem like that's magical enough!") /obj/item/barthpot/attack_hand(mob/user) - if(!active) - say("Meow!") - return - say("Hello there, I'm Bartholomew, Jacqueline's Familiar.") - sleep(20) + if(!active) + say("Meow!") + return + say("Hello there, I'm Bartholomew, Jacqueline's Familiar.") + sleep(20) - say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!") - if(!iscarbon(user)) - say("Though... I'm not sure you can help me.") + say("I'm currently seeking items to put into my pot, if we get the right items, it should crystalise into a magic candy!") + if(!iscarbon(user)) + say("Though... I'm not sure you can help me.") - var/message = "From what I can tell, " - if(LAZYLEN(items_list) < 5) - generate_items() - for(var/I2 in items_list) - if(!I2) - items_list -= I2 - continue - var/obj/item/I3 = new I2 - message += "a [I3.name], " - message += "currently seem to have the most magic potential." - sleep(15) - say("[message]") - sleep(15) - //To help people find her - for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1]) - var/turf/L1 = J.loc - if(!L1) //Incase someone uh.. puts her in a locker - return - var/area/L2 = L1.loc - if(L2) - say("Also, it seems that Jacqueline is currently at the [L2], if you're looking for her too.") + var/message = "From what I can tell, " + if(LAZYLEN(items_list) < 5) + generate_items() + for(var/I2 in items_list) + if(!I2) + items_list -= I2 + continue + var/obj/item/I3 = new I2 + message += "a [I3.name], " + message += "currently seem to have the most magic potential." + sleep(15) + say("[message]") + sleep(15) + //To help people find her + for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1]) + var/turf/L1 = J.loc + if(!L1) //Incase someone uh.. puts her in a locker + return + var/area/L2 = L1.loc + if(L2) + say("Also, it seems that Jacqueline is currently at the [L2], if you're looking for her too.") /obj/item/barthpot/proc/generate_items() - var/length = LAZYLEN(items_list) - var/rand_items = list(/obj/item/bodybag = 1, + var/length = LAZYLEN(items_list) + var/rand_items = list(/obj/item/bodybag = 1, /obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/sunglasses = 1, /obj/item/clothing/gloves/color/fyellow = 1, @@ -94,7 +94,7 @@ /obj/item/stack/sheet/metal = 1, /obj/item/stack/sheet/mineral/plasma = 1, /obj/item/stack/sheet/rglass = 1, - /obj/item/coin = 1, + /obj/item/coin = 1, /obj/item/crowbar = 4, /obj/item/extinguisher = 3, /obj/item/hand_labeler = 1, @@ -129,28 +129,28 @@ /obj/item/storage/toolbox = 2, /obj/item/reagent_containers/pill = 2, /obj/item/clothing/shoes = 8, - /obj/item/clothing/head = 3, - /obj/item/reagent_containers/food/snacks = 3, - /obj/item/reagent_containers/syringe/dart = 2, - /obj/item/reagent_containers/food/drinks/soda_cans = 5) - if(length >= 5) - return TRUE - //var/metalist = pickweight(GLOB.maintenance_loot) - for(var/i = length, i <= 5, i+=1) - var/obj/item = pickweight(rand_items) - if(!item) - i-=1 - continue - for(var/obj/item_dupe in items_list) //No duplicates - if(item_dupe == item) - i-=1 - continue - items_list += item - return TRUE + /obj/item/clothing/head = 3, + /obj/item/reagent_containers/food/snacks = 3, + /obj/item/reagent_containers/syringe/dart = 2, + /obj/item/reagent_containers/food/drinks/soda_cans = 5) + if(length >= 5) + return TRUE + //var/metalist = pickweight(GLOB.maintenance_loot) + for(var/i = length, i <= 5, i+=1) + var/obj/item = pickweight(rand_items) + if(!item) + i-=1 + continue + for(var/obj/item_dupe in items_list) //No duplicates + if(item_dupe == item) + i-=1 + continue + items_list += item + return TRUE /obj/item/pinpointer/jacq - name = "The Jacq-Tracq" - desc = "A handheld tracking device that locks onto witchy signals." + name = "The Jacq-Tracq" + desc = "A handheld tracking device that locks onto witchy signals." /obj/item/pinpointer/jacq/attack_self(mob/living/user) for(var/mob/living/simple_animal/jacq/J in GLOB.simple_animals[1]) diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index 151bb26076..42a228997f 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -127,8 +127,8 @@ name = "ghost" real_name = "ghost" icon = 'icons/mob/mob.dmi' - maxHealth = 1e6 - health = 1e6 + maxHealth = 120 + health = 120 speak_emote = list("howls") emote_hear = list("wails","screeches") density = FALSE @@ -141,7 +141,6 @@ . = ..() icon_state = pick("ghost","ghostian","ghostian2","ghostking","ghost1","ghost2") icon_living = icon_state - status_flags |= GODMODE timer = rand(1,15) /mob/living/simple_animal/shade/howling_ghost/Life() @@ -176,13 +175,9 @@ step(I,direction) return -/mob/living/simple_animal/shade/howling_ghost/adjustHealth() - . = 0 - /mob/living/simple_animal/shade/howling_ghost/CanPass(atom/movable/mover, turf/target) return 1 - /////////////////////////// //Spookoween Insane Clown// /////////////////////////// @@ -195,8 +190,8 @@ icon_dead = "scary_clown" icon_gib = "scary_clown" speak = list("...", ". . .") - maxHealth = 1e6 - health = 1e6 + maxHealth = 120 + health = 120 emote_see = list("silently stares") unsuitable_atmos_damage = 0 var/timer @@ -204,8 +199,6 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/Initialize() . = ..() timer = rand(5,15) - status_flags = (status_flags | GODMODE) - return /mob/living/simple_animal/hostile/retaliate/clown/insane/Retaliate() return @@ -237,7 +230,7 @@ return /mob/living/simple_animal/hostile/retaliate/clown/insane/adjustHealth() - . = 0 + . = ..() if(prob(5)) playsound(loc, 'sound/spookoween/insane_low_laugh.ogg', 300, 1) diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index efe7418e44..8fa0825628 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -5,6 +5,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( )) /proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE) + RETURN_TYPE(original.type) if(!original) return var/atom/O @@ -122,7 +123,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list( if(toupdate.len) for(var/turf/T1 in toupdate) - T1.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T1) SSair.add_to_active(T1,1) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 83fc18dcb9..313d998685 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -69,10 +69,3 @@ icon_state = "barrel_open" else icon_state = "barrel" - -/datum/crafting_recipe/fermenting_barrel - name = "Wooden Barrel" - result = /obj/structure/fermenting_barrel - reqs = list(/obj/item/stack/sheet/mineral/wood = 30) - time = 50 - category = CAT_PRIMAL diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 3ef6c1472f..2b6c720ea5 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -54,7 +54,7 @@ for(var/datum/plant_gene/trait/T in seed.genes) T.on_throw_impact(src, hit_atom) -/obj/item/grown/microwave_act(obj/machine/microwave/M) +/obj/item/grown/microwave_act(obj/machinery/microwave/M) return /obj/item/grown/on_grind() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 3862967363..ae134c2415 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -65,7 +65,7 @@ src.max_complexity = round(max_complexity) /obj/item/electronic_assembly/GenerateTag() - tag = "assembly_[next_assembly_id++]" + tag = "assembly_[next_assembly_id++]" /obj/item/electronic_assembly/examine(mob/user) . = ..() @@ -616,7 +616,7 @@ ..() /obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. - name = "type-a electronic assembly" + name = "type-a electronic assembly" /obj/item/electronic_assembly/calc name = "type-b electronic assembly" diff --git a/code/modules/integrated_electronics/core/special_pins/list_pin.dm b/code/modules/integrated_electronics/core/special_pins/list_pin.dm index 9e4731ac36..3532d68d70 100644 --- a/code/modules/integrated_electronics/core/special_pins/list_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/list_pin.dm @@ -7,7 +7,6 @@ interact(user) /datum/integrated_io/lists/proc/interact(mob/user) - . = ..() var/list/my_list = data var/t = "

[src]


" t += "List length: [my_list.len]
" diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index d4899a4621..40ed235863 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -76,7 +76,7 @@ desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industrial size!" w_class = WEIGHT_CLASS_BULKY extended_desc = "The siphon drains 2 kW of power from an APC in the same room as it as long as it has charge remaining. It will always drain \ - from the 'equipment' power channel." + from the 'equipment' power channel." icon_state = "power_relay" complexity = 15 spawn_flags = IC_SPAWN_RESEARCH diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index 230d1ce154..aed99fac24 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -2,7 +2,6 @@ #define TARGET_TO_SOURCE 1 #define PUMP_EFFICIENCY 0.6 #define TANK_FAILURE_PRESSURE (ONE_ATMOSPHERE*25) -#define PUMP_MAX_PRESSURE (ONE_ATMOSPHERE*24) #define PUMP_MAX_VOLUME 100 diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 1959fb55c7..d4c565c49a 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -199,7 +199,6 @@ set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) if(installed_brain.brainmob) installed_brain.brainmob.remote_control = null - ..() //Brain changes @@ -238,7 +237,7 @@ brainholder.do_work(6) -/mob/living/brain/canUseTopic() +/mob/living/brain/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) return check_bot_self /obj/item/integrated_circuit/smart/advanced_pathfinder/proc/hippie_xor_decrypt() @@ -329,7 +328,6 @@ installed_pai.forceMove(drop_location()) set_pin_data(IC_OUTPUT, 1, WEAKREF(null)) installed_pai.pai.remote_control = null - ..() //pAI changes @@ -371,5 +369,5 @@ paiholder.do_work(6) -/mob/living/silicon/pai/canUseTopic() - return check_bot_self \ No newline at end of file +/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) + return check_bot_self diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 2119baf1a5..6100641bde 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -122,16 +122,16 @@ /proc/get_all_accesses() return list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, - 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_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE, - ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) + 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_VAULT, ACCESS_MINING_STATION, ACCESS_XENOBIOLOGY, ACCESS_CE, ACCESS_HOP, ACCESS_HOS, ACCESS_RC_ANNOUNCE, + ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_NETWORK, ACCESS_CLONING) /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) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index f6505a4e2a..0aa1f2f05f 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -19,13 +19,13 @@ outfit = /datum/outfit/job/ce access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, - ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, - ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA, + ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS, ACCESS_MINISAT, + ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_CHIEF_ENGINEER blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/paraplegic, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 2b757872d9..86b9cafa25 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -19,17 +19,17 @@ outfit = /datum/outfit/job/hop access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, + ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, - ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, - ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, - ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, + ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, + ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_HEAD_OF_PERSONNEL diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index c190d88bc7..e20315a1ca 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -20,13 +20,13 @@ mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, + ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, - ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, - ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, - ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) + ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS, + ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING, + ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/insanity) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index a90c5cea6c..ebf3b3eb40 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -19,15 +19,15 @@ outfit = /datum/outfit/job/rd access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) minimal_access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE, - ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, - ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, - ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, - ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) + ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS, + ACCESS_RESEARCH, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_AI_UPLOAD, + ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM, + ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK) display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 416e2bc0c9..d88c7543f0 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,10 +1,12 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas) - var/sanity = PLACEMENT_TRIES +/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) + var/sanity = forced_turf ? 1 : PLACEMENT_TRIES + if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) + return place_on_isolated_level(z) while(sanity > 0) sanity-- var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2) var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) - var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) + var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) var/valid = TRUE for(var/turf/check in get_affected_turfs(central_turf,1)) @@ -24,7 +26,7 @@ qdel(monster) for(var/obj/structure/flora/ash/plant in T) qdel(plant) - + load(central_turf,centered = TRUE) loaded++ @@ -32,9 +34,20 @@ T.flags_1 |= NO_RUINS_1 new /obj/effect/landmark/ruin(central_turf, src) - return TRUE - return FALSE + return central_turf +/datum/map_template/ruin/proc/place_on_isolated_level(z) + var/datum/turf_reservation/reservation = SSmapping.RequestBlockReservation(width, height, z) //Make the new level creation work with different traits. + if(!reservation) + return + var/turf/placement = locate(reservation.bottom_left_coords[1],reservation.bottom_left_coords[2],reservation.bottom_left_coords[3]) + load(placement) + loaded++ + for(var/turf/T in get_affected_turfs(placement)) + T.flags_1 |= NO_RUINS_1 + var/turf/center = locate(placement.x + round(width/2),placement.y + round(height/2),placement.z) + new /obj/effect/landmark/ruin(center, src) + return center /proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) if(!z_levels || !z_levels.len) @@ -49,9 +62,8 @@ var/list/ruins = potentialRuins.Copy() - var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) + var/list/forced_ruins = list() //These go first on the z level associated (same random one by default) or if the assoc value is a turf to the specified turf. var/list/ruins_availible = list() //we can try these in the current pass - var/forced_z //If set we won't pick z level and use this one instead. //Set up the starting ruin list for(var/key in ruins) @@ -67,34 +79,55 @@ while(budget > 0 && (ruins_availible.len || forced_ruins.len)) var/datum/map_template/ruin/current_pick var/forced = FALSE + var/forced_z //If set we won't pick z level and use this one instead. + var/forced_turf //If set we place the ruin centered on the given turf if(forced_ruins.len) //We have something we need to load right now, so just pick it for(var/ruin in forced_ruins) current_pick = ruin - if(forced_ruins[ruin] > 0) //Load into designated z + if(isturf(forced_ruins[ruin])) + var/turf/T = forced_ruins[ruin] + forced_z = T.z //In case of chained ruins + forced_turf = T + else if(forced_ruins[ruin] > 0) //Load into designated z forced_z = forced_ruins[ruin] forced = TRUE break else //Otherwise just pick random one current_pick = pickweight(ruins_availible) - var/placement_tries = PLACEMENT_TRIES + var/placement_tries = forced_turf ? 1 : PLACEMENT_TRIES //Only try once if we target specific turf var/failed_to_place = TRUE - var/z_placed = 0 - while(placement_tries > 0) - placement_tries-- - z_placed = pick(z_levels) - if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist)) - continue - else - failed_to_place = FALSE - break + var/target_z = 0 + var/turf/placed_turf //Where the ruin ended up if we succeeded + outer: + while(placement_tries > 0) + placement_tries-- + target_z = pick(z_levels) + if(forced_z) + target_z = forced_z + if(current_pick.always_spawn_with) //If the ruin has part below, make sure that z exists. + for(var/v in current_pick.always_spawn_with) + if(current_pick.always_spawn_with[v] == PLACE_BELOW) + var/turf/T = locate(1,1,target_z) + if(!SSmapping.get_turf_below(T)) + if(forced_z) + continue outer + else + break outer + + placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + if(!placed_turf) + continue + else + failed_to_place = FALSE + break //That's done remove from priority even if it failed if(forced) //TODO : handle forced ruins with multiple variants forced_ruins -= current_pick forced = FALSE - + if(failed_to_place) for(var/datum/map_template/ruin/R in ruins_availible) if(R.id == current_pick.id) @@ -118,18 +151,21 @@ if(istype(linked,v)) switch(current_pick.always_spawn_with[v]) if(PLACE_SAME_Z) - forced_ruins[linked] = forced_z ? forced_z : z_placed //I guess you might want a chain somehow + forced_ruins[linked] = target_z //I guess you might want a chain somehow if(PLACE_LAVA_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_LAVA_RUINS)) if(PLACE_SPACE_RUIN) forced_ruins[linked] = pick(SSmapping.levels_by_trait(ZTRAIT_SPACE_RUINS)) if(PLACE_DEFAULT) forced_ruins[linked] = -1 - forced_z = 0 + if(PLACE_BELOW) + forced_ruins[linked] = SSmapping.get_turf_below(placed_turf) + if(PLACE_ISOLATED) + forced_ruins[linked] = SSmapping.get_isolated_ruin_z() //Update the availible list for(var/datum/map_template/ruin/R in ruins_availible) if(R.cost > budget) ruins_availible -= R - + log_world("Ruin loader finished with [budget] left to spend.") diff --git a/code/modules/mapping/space_management/multiz_helpers.dm b/code/modules/mapping/space_management/multiz_helpers.dm new file mode 100644 index 0000000000..f6db12420a --- /dev/null +++ b/code/modules/mapping/space_management/multiz_helpers.dm @@ -0,0 +1,47 @@ +/proc/get_step_multiz(ref, dir) + if(dir & UP) + dir &= ~UP + return get_step(SSmapping.get_turf_above(get_turf(ref)), dir) + if(dir & DOWN) + dir &= ~DOWN + return get_step(SSmapping.get_turf_below(get_turf(ref)), dir) + return get_step(ref, dir) + +/proc/get_dir_multiz(turf/us, turf/them) + us = get_turf(us) + them = get_turf(them) + if(!us || !them) + return NONE + if(us.z == them.z) + return get_dir(us, them) + else + var/turf/T = us.above() + var/dir = NONE + if(T && (T.z == them.z)) + dir = UP + else + T = us.below() + if(T && (T.z == them.z)) + dir = DOWN + else + return get_dir(us, them) + return (dir | get_dir(us, them)) + +/turf/proc/above() + return get_step_multiz(src, UP) + +/turf/proc/below() + return get_step_multiz(src, DOWN) + +/proc/dir_inverse_multiz(dir) + var/holder = dir & (UP|DOWN) + if((holder == NONE) || (holder == (UP|DOWN))) + return turn(dir, 180) + dir &= ~(UP|DOWN) + dir = turn(dir, 180) + if(holder == UP) + holder = DOWN + else + holder = UP + dir |= holder + return dir \ No newline at end of file diff --git a/code/modules/mining/aux_base_camera.dm b/code/modules/mining/aux_base_camera.dm index 02c54ffbd3..d901e1eb0c 100644 --- a/code/modules/mining/aux_base_camera.dm +++ b/code/modules/mining/aux_base_camera.dm @@ -25,6 +25,14 @@ max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary. no_ammo_message = "Internal matter exhausted. Please add additional materials." delay_mod = 0.5 + adjacency_check = FALSE + upgrade = TRUE + var/obj/machinery/computer/camera_advanced/base_construction/console + +/obj/item/construction/rcd/internal/check_menu(mob/living/user) + if(!istype(user) || user.incapacitated() || !user.Adjacent(console)) + return FALSE + return TRUE /obj/machinery/computer/camera_advanced/base_construction name = "base construction console" @@ -49,12 +57,10 @@ light_color = LIGHT_COLOR_PINK -/obj/machinery/computer/camera_advanced/base_construction/Initialize() - . = ..() - RCD = new(src) - /obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload) . = ..() + RCD = new(src) + RCD.console = src if(mapload) //Map spawned consoles have a filled RCD and stocked special structures RCD.matter = RCD.max_matter fans_remaining = 4 @@ -85,7 +91,7 @@ return ..() /obj/machinery/computer/camera_advanced/base_construction/Destroy() - qdel(RCD) + QDEL_NULL(RCD) return ..() /obj/machinery/computer/camera_advanced/base_construction/GrantActions(mob/living/user) @@ -140,7 +146,8 @@ remote_eye = C.remote_control B = target if(!B.RCD) //The console must always have an RCD. - B.RCD = new /obj/item/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one! + B.RCD = new /obj/item/construction/rcd/internal(B) //If the RCD is lost somehow, make a new (empty) one! + B.RCD.console = B /datum/action/innate/aux_base/proc/check_spot() //Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction. @@ -195,34 +202,40 @@ var/list/buildlist = list("Walls and Floors" = 1,"Airlocks" = 2,"Deconstruction" = 3,"Windows and Grilles" = 4) var/buildmode = input("Set construction mode.", "Base Console", null) in buildlist - B.RCD.mode = buildlist[buildmode] - to_chat(owner, "Build mode is now [buildmode].") + if(buildmode) + B.RCD.mode = buildlist[buildmode] + to_chat(owner, "Build mode is now [buildmode].") /datum/action/innate/aux_base/airlock_type - name = "Select Airlock Type" + name = "Change Airlock Settings" button_icon_state = "airlock_select" -datum/action/innate/aux_base/airlock_type/Activate() +/datum/action/innate/aux_base/airlock_type/Activate() if(..()) return - B.RCD.change_airlock_setting() + var/mode = alert("Modify Type or Access?", "Airlock Settings", "Type", "Access", "None") + switch(mode) + if("Type") + B.RCD.change_airlock_setting(usr) + if("Access") + B.RCD.change_airlock_access(usr) -datum/action/innate/aux_base/window_type +/datum/action/innate/aux_base/window_type name = "Select Window Type" button_icon_state = "window_select" -datum/action/innate/aux_base/window_type/Activate() +/datum/action/innate/aux_base/window_type/Activate() if(..()) return - B.RCD.toggle_window_type() + B.RCD.toggle_window_type(usr) -datum/action/innate/aux_base/place_fan +/datum/action/innate/aux_base/place_fan name = "Place Tiny Fan" button_icon_state = "build_fan" -datum/action/innate/aux_base/place_fan/Activate() +/datum/action/innate/aux_base/place_fan/Activate() if(..()) return @@ -244,11 +257,11 @@ datum/action/innate/aux_base/place_fan/Activate() to_chat(owner, "Tiny fan placed. [B.fans_remaining] remaining.") playsound(fan_turf, 'sound/machines/click.ogg', 50, 1) -datum/action/innate/aux_base/install_turret +/datum/action/innate/aux_base/install_turret name = "Install Plasma Anti-Wildlife Turret" button_icon_state = "build_turret" -datum/action/innate/aux_base/install_turret/Activate() +/datum/action/innate/aux_base/install_turret/Activate() if(..()) return diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index c42f1b9f4e..d0232fc4f0 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -171,7 +171,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) return var/datum/ore_silo_log/entry = new(M, action, amount, noun, mats) - var/list/logs = GLOB.silo_access_logs[REF(src)] + var/list/datum/ore_silo_log/logs = GLOB.silo_access_logs[REF(src)] if(!LAZYLEN(logs)) GLOB.silo_access_logs[REF(src)] = logs = list(entry) else if(!logs[1].merge(entry)) diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 04a28f6b5a..db792084cf 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -310,7 +310,7 @@ }); $( "#sortable" ).disableSelection(); $('form').submit(function(){ - $('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" })); + $('#IRVdata').val($( "#sortable" ).sortable("toArray", { attribute: "voteid" })); }); }); diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index ca1253feb1..bab19528bf 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -130,10 +130,10 @@ color_src = MATRIXED /datum/sprite_accessory/ears/human/rabbit - name = "Rabbit" - icon_state = "rabbit" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/mam_ears.dmi' + name = "Rabbit" + icon_state = "rabbit" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/sergal name = "Sergal" @@ -287,8 +287,8 @@ icon_state = "pede" /datum/sprite_accessory/mam_ears/rabbit - name = "Rabbit" - icon_state = "rabbit" + name = "Rabbit" + icon_state = "rabbit" /datum/sprite_accessory/mam_ears/sergal name = "Sergal" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 63656f39a4..0ae11fcde0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -3,6 +3,8 @@ GLOBAL_LIST_EMPTY(ghost_images_simple) //this is a list of all ghost images as t GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) +#define CANT_REENTER_ROUND -1 + /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -16,8 +18,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost + movement_type = GROUND | FLYING var/can_reenter_corpse - var/can_reenter_round = TRUE + var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit) var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. @@ -230,7 +233,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/r_val var/b_val var/g_val - var/color_format = lentext(input_color) + var/color_format = length(input_color) if(color_format == 3) r_val = hex2num(copytext(input_color, 1, 2))*16 g_val = hex2num(copytext(input_color, 2, 3))*16 @@ -259,14 +262,22 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body Works together with spawning an observer, noted above. */ -/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE) - if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING)) +/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE) + if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING)) return //mob has no key, is an aghost or some component hijacked. stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse - ghost.can_reenter_round = (can_reenter_corpse && !suiciding) + if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. + penalty += roundstart_quit_limit - world.time + if(penalty) + ghost.reenter_round_timeout = world.realtime + penalty + if(ghost.reenter_round_timeout - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + ghost.reenter_round_timeout = CANT_REENTER_ROUND transfer_ckey(ghost, FALSE) return ghost @@ -282,26 +293,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING) return -// CITADEL EDIT - if(istype(loc, /obj/machinery/cryopod)) - var/obj/machinery/cryopod/C = loc - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") - if(response != "Ghost" || QDELETED(C) || QDELETED(src) || loc != C) - return - C.despawn_occupant() - return -// END EDIT + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) + penalty += roundstart_quit_limit - world.time + if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND if(stat != DEAD) succumb() if(stat == DEAD) ghostize(1) else - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return //didn't want to ghost after-all - ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - suicide_log(TRUE) + if(istype(loc, /obj/machinery/cryopod)) + var/obj/machinery/cryopod/C = loc + C.despawn_occupant() + else + ghostize(0, penalize = TRUE) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 + suicide_log(TRUE) /mob/camera/verb/ghost() set category = "OOC" @@ -311,10 +323,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING) return - var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) + penalty += roundstart_quit_limit - world.time + if(penalty + world.realtime - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND + + var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles [penalty != CANT_REENTER_ROUND ? "until the round is over" : "for the next [DisplayTimeText(penalty)]"]" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body") if(response != "Ghost") return - ghostize(0) + ghostize(0, penalize = TRUE) + +/mob/dead/observer/proc/can_reenter_round(silent = FALSE) + if(reenter_round_timeout != CANT_REENTER_ROUND && reenter_round_timeout <= world.realtime) + return TRUE + if(!silent) + to_chat(src, "You are unable to reenter the round[reenter_round_timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]" : ""].") + return FALSE /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -602,6 +628,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Possess!" set desc= "Take over the body of a mindless creature!" + if(reenter_round_timeout > world.realtime) + to_chat(src, "You are unable to re-enter the round yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)].") + return FALSE + var/list/possessible = list() for(var/mob/living/L in GLOB.alive_mob_list) if(istype(L,/mob/living/carbon/human/dummy) || !get_turf(L)) //Haha no. @@ -618,10 +648,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "This creature is too powerful for you to possess!") return 0 - if(!can_reenter_round) - to_chat(src, "You are unable to re-enter the round.") - return FALSE - if(can_reenter_corpse && mind && mind.current) if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go forward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") return 0 @@ -866,3 +892,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp spawners_menu = new(src) spawners_menu.ui_interact(src) + +#undef CANT_REENTER_ROUND \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm new file mode 100644 index 0000000000..b84bed2a3f --- /dev/null +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -0,0 +1,2 @@ +/mob/dead/observer/canZMove(direction, turf/target) + return TRUE \ No newline at end of file diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 4192c2235b..decf8d24eb 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -24,7 +24,7 @@ var/list/datum/brain_trauma/traumas = list() -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE, drop_if_replaced = TRUE) ..() name = "brain" diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm index 8a70ccc4cb..4ad7793250 100644 --- a/code/modules/mob/living/brain/posibrain.dm +++ b/code/modules/mob/living/brain/posibrain.dm @@ -36,7 +36,7 @@ GLOBAL_VAR(posibrain_notify_cooldown) /obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade) if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) - notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN) + notify_ghosts("[name] [msg] in [get_area(src)]!", ghost_sound = !newlymade ? 'sound/misc/server-ready.ogg':null, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN, ignore_dnr_observers = TRUE) if(!newlymade) GLOB.posibrain_notify_cooldown = world.time + askDelay @@ -83,11 +83,14 @@ GLOBAL_VAR(posibrain_notify_cooldown) //Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself. /obj/item/mmi/posibrain/proc/activate(mob/user) - if(QDELETED(brainmob)) - return - if(is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) + if(QDELETED(brainmob) || is_occupied() || jobban_isbanned(user,"posibrain") || QDELETED(src) || QDELETED(user)) return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return FALSE + 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") if(posi_ask == "No" || QDELETED(src)) return diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 77300e1435..afbd5bbe6f 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -1,8 +1,9 @@ -/mob/living/carbon/alien/spawn_gibs(with_bodyparts) +/mob/living/carbon/alien/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() if(with_bodyparts) - new /obj/effect/gibspawner/xeno(drop_location()) + new /obj/effect/gibspawner/xeno(location, src) else - new /obj/effect/gibspawner/xeno/bodypartless(drop_location()) + new /obj/effect/gibspawner/xeno/bodypartless(location, src) /mob/living/carbon/alien/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a") diff --git a/code/modules/mob/living/carbon/alien/larva/death.dm b/code/modules/mob/living/carbon/alien/larva/death.dm index e7cf70f441..e0136d7036 100644 --- a/code/modules/mob/living/carbon/alien/larva/death.dm +++ b/code/modules/mob/living/carbon/alien/larva/death.dm @@ -6,11 +6,12 @@ update_icons() -/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts) +/mob/living/carbon/alien/larva/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() if(with_bodyparts) - new /obj/effect/gibspawner/larva(drop_location()) + new /obj/effect/gibspawner/larva(location, src) else - new /obj/effect/gibspawner/larva/bodypartless(drop_location()) + new /obj/effect/gibspawner/larva/bodypartless(location, src) /mob/living/carbon/alien/larva/gib_animation() new /obj/effect/temp_visual/gib_animation(loc, "gibbed-l") diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 7b6962794a..e4e8f06cfa 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -14,7 +14,7 @@ QDEL_LIST(alien_powers) return ..() -/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() for(var/obj/effect/proc_holder/alien/P in alien_powers) M.AddAbility(P) @@ -94,7 +94,7 @@ else owner.adjustPlasma(plasma_rate * 0.1) -/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(isalien(M)) var/mob/living/carbon/alien/A = M @@ -117,7 +117,7 @@ var/recent_queen_death = 0 //Indicates if the queen died recently, aliens are heavily weakened while this is active. alien_powers = list(/obj/effect/proc_holder/alien/whisper) -/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/alien/hivenode/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() M.faction |= ROLE_ALIEN diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dd85b9ef3f..2f4a44a8ec 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -254,7 +254,7 @@ /mob/living/carbon/fall(forced) - loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing + loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 71286ef691..345279df29 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -31,9 +31,9 @@ if (!user.get_bodypart(BODY_ZONE_L_ARM) || !user.get_bodypart(BODY_ZONE_R_ARM)) return var/clap = pick('sound/misc/clap1.ogg', - 'sound/misc/clap2.ogg', - 'sound/misc/clap3.ogg', - 'sound/misc/clap4.ogg') + 'sound/misc/clap2.ogg', + 'sound/misc/clap3.ogg', + 'sound/misc/clap4.ogg') playsound(user, clap, 50, 1, -1) /datum/emote/living/carbon/gnarl diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index b0c3f61eec..96cc79261d 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -4,36 +4,21 @@ /mob/living/carbon/human/dust_animation() new /obj/effect/temp_visual/dust_animation(loc, "dust-h") -/mob/living/carbon/human/spawn_gibs(with_bodyparts) - if(isjellyperson(src)) - if(with_bodyparts) - new /obj/effect/gibspawner/slime(drop_location(), dna, get_static_viruses()) +/mob/living/carbon/human/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() + if(dna?.species?.gib_types) + var/datum/species/S = dna.species + var/length = length(S.gib_types) + if(length) + var/path = (with_bodyparts && length > 1) ? S.gib_types[2] : S.gib_types[1] + new path(location, src, get_static_viruses()) else - new /obj/effect/gibspawner/slime/bodypartless(drop_location(), dna, get_static_viruses()) - - if(isipcperson(src)) - if(with_bodyparts) - new /obj/effect/gibspawner/ipc(drop_location(), dna, get_static_viruses()) - else - new /obj/effect/gibspawner/ipc/bodypartless(drop_location(), dna, get_static_viruses()) - - if(isxenoperson(src)) - if(with_bodyparts) - new /obj/effect/gibspawner/xeno/xenoperson(drop_location(), dna, get_static_viruses()) - else - new /obj/effect/gibspawner/xeno/xenoperson/bodypartless(drop_location(), dna, get_static_viruses()) - - if(islizard(src)) - if(with_bodyparts) - new /obj/effect/gibspawner/lizard(drop_location(), dna, get_static_viruses()) - else - new /obj/effect/gibspawner/lizard/bodypartless(drop_location(), dna, get_static_viruses()) - + new S.gib_types(location, src, get_static_viruses()) else if(with_bodyparts) - new /obj/effect/gibspawner/human(drop_location(), dna, get_static_viruses()) + new /obj/effect/gibspawner/human(location, src, get_static_viruses()) else - new /obj/effect/gibspawner/human/bodypartless(drop_location(), dna, get_static_viruses()) + new /obj/effect/gibspawner/human/bodypartless(location, src, get_static_viruses()) /mob/living/carbon/human/spawn_dust(just_ash = FALSE) if(just_ash) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3333459dca..ce0553dc7a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -778,7 +778,7 @@ broken_plural = TRUE else var/holder = broken[1] //our one and only element - if(holder[lentext(holder)] == "s") + if(holder[length(holder)] == "s") broken_plural = TRUE //Put the items in that list into a string of text for(var/B in broken) @@ -790,7 +790,7 @@ damaged_plural = TRUE else var/holder = damaged[1] - if(holder[lentext(holder)] == "s") + if(holder[length(holder)] == "s") damaged_plural = TRUE for(var/D in damaged) damaged_message += D diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be52a8289b..821a3472e4 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -3,7 +3,7 @@ //NOTE: Breathing happens once per FOUR TICKS, unless the last breath fails. In which case it happens once per ONE TICK! So oxyloss healing is done once per 4 ticks while oxyloss damage is applied once per tick! // bitflags for the percentual amount of protection a piece of clothing which covers the body part offers. -// Used with human/proc/get_heat_protection() and human/proc/get_cold_protection() +// Used with human/proc/get_thermal_protection() // The values here should add up to 1. // Hands and feet have 2.5%, arms and legs 7.5%, each of the torso parts has 15% and the head has 30% #define THERMAL_PROTECTION_HEAD 0.3 @@ -53,16 +53,17 @@ /mob/living/carbon/human/calculate_affecting_pressure(pressure) - if (wear_suit && head && istype(wear_suit, /obj/item/clothing) && istype(head, /obj/item/clothing)) + var/headless = !get_bodypart(BODY_ZONE_HEAD) //should the mob be perennially headless (see dullahans), we only take the suit into account, so they can into space. + if (wear_suit && istype(wear_suit, /obj/item/clothing) && (headless || (head && istype(head, /obj/item/clothing)))) var/obj/item/clothing/CS = wear_suit var/obj/item/clothing/CH = head - if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE) + if (CS.clothing_flags & STOPSPRESSUREDAMAGE && (headless || (CH.clothing_flags & STOPSPRESSUREDAMAGE))) return ONE_ATMOSPHERE if(isbelly(loc)) //START OF CIT CHANGES - Makes it so you don't suffocate while inside vore organs. Remind me to modularize this some time - Bhijn return ONE_ATMOSPHERE if(istype(loc, /obj/item/dogborg/sleeper)) return ONE_ATMOSPHERE //END OF CIT CHANGES - return pressure + return ..() /mob/living/carbon/human/handle_traits() @@ -136,7 +137,7 @@ if(dna) dna.species.handle_fire(src) -/mob/living/carbon/human/proc/get_thermal_protection() +/mob/living/carbon/human/proc/easy_thermal_protection() var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures //CITADEL EDIT Vore code required overrides if(istype(loc, /obj/item/dogborg/sleeper)) @@ -168,7 +169,6 @@ ..() //END FIRE CODE - //This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, CHEST, GROIN, etc. See setup.dm for the full list) /mob/living/carbon/human/proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to. var/thermal_protection_flags = 0 @@ -194,37 +194,6 @@ return thermal_protection_flags -/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to. - var/thermal_protection_flags = get_heat_protection_flags(temperature) - - var/thermal_protection = 0 - if(thermal_protection_flags) - if(thermal_protection_flags & HEAD) - thermal_protection += THERMAL_PROTECTION_HEAD - if(thermal_protection_flags & CHEST) - thermal_protection += THERMAL_PROTECTION_CHEST - if(thermal_protection_flags & GROIN) - thermal_protection += THERMAL_PROTECTION_GROIN - if(thermal_protection_flags & LEG_LEFT) - thermal_protection += THERMAL_PROTECTION_LEG_LEFT - if(thermal_protection_flags & LEG_RIGHT) - thermal_protection += THERMAL_PROTECTION_LEG_RIGHT - if(thermal_protection_flags & FOOT_LEFT) - thermal_protection += THERMAL_PROTECTION_FOOT_LEFT - if(thermal_protection_flags & FOOT_RIGHT) - thermal_protection += THERMAL_PROTECTION_FOOT_RIGHT - if(thermal_protection_flags & ARM_LEFT) - thermal_protection += THERMAL_PROTECTION_ARM_LEFT - if(thermal_protection_flags & ARM_RIGHT) - thermal_protection += THERMAL_PROTECTION_ARM_RIGHT - if(thermal_protection_flags & HAND_LEFT) - thermal_protection += THERMAL_PROTECTION_HAND_LEFT - if(thermal_protection_flags & HAND_RIGHT) - thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - - - 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) var/thermal_protection_flags = 0 @@ -251,17 +220,42 @@ return thermal_protection_flags -/mob/living/carbon/human/proc/get_cold_protection(temperature) -//CITADEL EDIT Mandatory for vore code. - if(istype(loc, /obj/item/dogborg/sleeper)) - return TRUE //freezing to death in sleepers ruins fun. - if(isbelly(loc)) - return TRUE - if(ismob(loc)) - return TRUE //because lazy and being inside somemone insulates you from space -//END EDIT - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. - var/thermal_protection_flags = get_cold_protection_flags(temperature) +/mob/living/carbon/human/proc/get_thermal_protection(temperature, cold = FALSE) + if(cold) + //CITADEL EDIT Mandatory for vore code. + if(istype(loc, /obj/item/dogborg/sleeper) || isbelly(loc) || ismob(loc)) + return 1 //freezing to death in sleepers ruins fun. + //END EDIT + temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. + var/thermal_protection_flags = cold ? get_cold_protection_flags(temperature) : get_heat_protection_flags(temperature) + var/missing_body_parts_flags = ~get_body_parts_flags() + var/max_protection = 1 + if(missing_body_parts_flags) //I don't like copypasta as much as proc overhead. Do you want me to make these into a macro? + DISABLE_BITFIELD(thermal_protection_flags, missing_body_parts_flags) + if(missing_body_parts_flags & HEAD) + max_protection -= THERMAL_PROTECTION_HEAD + if(missing_body_parts_flags & CHEST) + max_protection -= THERMAL_PROTECTION_CHEST + if(missing_body_parts_flags & GROIN) + max_protection -= THERMAL_PROTECTION_GROIN + if(missing_body_parts_flags & LEG_LEFT) + max_protection -= THERMAL_PROTECTION_LEG_LEFT + if(missing_body_parts_flags & LEG_RIGHT) + max_protection -= THERMAL_PROTECTION_LEG_RIGHT + if(missing_body_parts_flags & FOOT_LEFT) + max_protection -= THERMAL_PROTECTION_FOOT_LEFT + if(missing_body_parts_flags & FOOT_RIGHT) + max_protection -= THERMAL_PROTECTION_FOOT_RIGHT + if(missing_body_parts_flags & ARM_LEFT) + max_protection -= THERMAL_PROTECTION_ARM_LEFT + if(missing_body_parts_flags & ARM_RIGHT) + max_protection -= THERMAL_PROTECTION_ARM_RIGHT + if(missing_body_parts_flags & HAND_LEFT) + max_protection -= THERMAL_PROTECTION_HAND_LEFT + if(missing_body_parts_flags & HAND_RIGHT) + max_protection -= THERMAL_PROTECTION_HAND_RIGHT + if(max_protection == 0) //Is it even a man if it doesn't have a body at all? Early return to avoid division by zero. + return 1 var/thermal_protection = 0 if(thermal_protection_flags) @@ -288,7 +282,7 @@ if(thermal_protection_flags & HAND_RIGHT) thermal_protection += THERMAL_PROTECTION_HAND_RIGHT - return min(1,thermal_protection) + return round(thermal_protection/max_protection, 0.001) /mob/living/carbon/human/handle_random_events() //Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 8445f340e6..49ae178d8c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/exotic_blood = "" // If your race wants to bleed something other than bog standard blood, change this to reagent id. var/exotic_bloodtype = "" //If your race uses a non standard bloodtype (A+, O-, AB-, etc) var/meat = /obj/item/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing + var/list/gib_types = list(/obj/effect/gibspawner/human, /obj/effect/gibspawner/human/bodypartless) var/skinned_type var/liked_food = NONE var/disliked_food = GROSS @@ -81,7 +82,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/sound/attack_sound = 'sound/weapons/punch1.ogg' var/sound/miss_sound = 'sound/weapons/punchmiss.ogg' - var/mob/living/list/ignored_by = list() // list of mobs that will ignore this species + var/list/mob/living/ignored_by = list() // list of mobs that will ignore this species //Breathing! var/obj/item/organ/lungs/mutantlungs = null var/breathid = "o2" @@ -2034,13 +2035,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) natural = H.natural_bodytemperature_stabilization() var/thermal_protection = 1 if(loc_temp < H.bodytemperature) //Place is colder than we are - thermal_protection -= H.get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + thermal_protection -= H.get_thermal_protection(loc_temp, TRUE) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(H.bodytemperature < BODYTEMP_NORMAL) //we're cold, insulation helps us retain body heat and will reduce the heat we lose to the environment H.adjust_bodytemperature((thermal_protection+1)*natural + max(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX)) else //we're sweating, insulation hinders our ability to reduce heat - and it will reduce the amount of cooling you get from the environment H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + max((thermal_protection * (loc_temp - H.bodytemperature) + BODYTEMP_NORMAL - H.bodytemperature) / BODYTEMP_COLD_DIVISOR , BODYTEMP_COOLING_MAX)) //Extra calculation for hardsuits to bleed off heat else //Place is hotter than we are - thermal_protection -= H.get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. + thermal_protection -= H.get_thermal_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to. if(H.bodytemperature < BODYTEMP_NORMAL) //and we're cold, insulation enhances our ability to retain body heat but reduces the heat we get from the environment H.adjust_bodytemperature((thermal_protection+1)*natural + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) else //we're sweating, insulation hinders out ability to reduce heat - but will reduce the amount of heat we get from the environment @@ -2179,7 +2180,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!(I.resistance_flags & FIRE_PROOF)) I.take_damage(H.fire_stacks, BURN, "fire", 0) - var/thermal_protection = H.get_thermal_protection() + var/thermal_protection = H.easy_thermal_protection() if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT && !no_protection) return diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 9f2c07694c..a36835fbb3 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -6,6 +6,7 @@ inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) meat = null + gib_types = /obj/effect/gibspawner/robot damage_overlay_type = "synth" mutanttongue = /obj/item/organ/tongue/robot limbs_id = "synth" diff --git a/code/modules/mob/living/carbon/human/species_types/corporate.dm b/code/modules/mob/living/carbon/human/species_types/corporate.dm index 146090b366..3de530ff5b 100644 --- a/code/modules/mob/living/carbon/human/species_types/corporate.dm +++ b/code/modules/mob/living/carbon/human/species_types/corporate.dm @@ -17,4 +17,5 @@ use_skintones = 0 species_traits = list(NOBLOOD,EYECOLOR,NOGENITALS) inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER) - sexes = 0 \ No newline at end of file + sexes = 0 + gib_types = /obj/effect/gibspawner/robot \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index eba4ff6d2f..96d52dcb27 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -18,6 +18,8 @@ var/obj/item/dullahan_relay/myhead /datum/species/dullahan/pumpkin + name = "Pumpkin Head Dullahan" + id = "pumpkindullahan" pumpkin = TRUE /datum/species/dullahan/check_roundstart_eligible() @@ -27,7 +29,7 @@ /datum/species/dullahan/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) . = ..() - H.flags_1 &= ~HEAR_1 + DISABLE_BITFIELD(H.flags_1, HEAR_1) var/obj/item/bodypart/head/head = H.get_bodypart(BODY_ZONE_HEAD) if(head) if(pumpkin)//Pumpkinhead! @@ -36,16 +38,16 @@ head.icon_state = "hardhat1_pumpkin_j" head.custom_head = TRUE head.drop_limb() - head.flags_1 = HEAR_1 - head.throwforce = 25 - myhead = new /obj/item/dullahan_relay (head, H) - H.put_in_hands(head) - var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) - for(var/datum/action/item_action/organ_action/OA in E.actions) - OA.Trigger() + if(!QDELETED(head)) //drop_limb() deletes the limb if it's no drop location and dummy humans used for rendering icons are located in nullspace. Do the math. + head.throwforce = 25 + myhead = new /obj/item/dullahan_relay (head, H) + H.put_in_hands(head) + var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) + for(var/datum/action/item_action/organ_action/OA in E.actions) + OA.Trigger() /datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) - H.flags_1 |= ~HEAR_1 + ENABLE_BITFIELD(H.flags_1, HEAR_1) H.reset_perspective(H) if(myhead) var/obj/item/dullahan_relay/DR = myhead @@ -84,7 +86,7 @@ /obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species if(isobj(D.myhead.loc)) var/obj/O = D.myhead.loc @@ -99,6 +101,7 @@ desc = "An abstraction." actions_types = list(/datum/action/item_action/organ_action/dullahan) zone = "abstract" + tint = INFINITY // used to switch the vision perspective to the head on species_gain(). /datum/action/item_action/organ_action/dullahan name = "Toggle Perspective" @@ -114,37 +117,53 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species D.update_vision_perspective(H) /obj/item/dullahan_relay + name = "dullahan relay" var/mob/living/owner flags_1 = HEAR_1 -/obj/item/dullahan_relay/Initialize(mapload,new_owner) +/obj/item/dullahan_relay/Initialize(mapload, mob/living/carbon/human/new_owner) . = ..() + if(!new_owner) + return INITIALIZE_HINT_QDEL owner = new_owner START_PROCESSING(SSobj, src) + RegisterSignal(owner, COMSIG_MOB_EXAMINATE, .proc/examinate_check) + RegisterSignal(src, COMSIG_ATOM_HEARER_IN_VIEW, .proc/include_owner) + RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, .proc/unlist_head) + RegisterSignal(owner, COMSIG_LIVING_FULLY_HEAL, .proc/retrieve_head) + +/obj/item/dullahan_relay/proc/examinate_check(mob/source, atom/A) + if(source.client.eye == src && ((A in view(source.client.view, src)) || (isturf(A) && source.sight & SEE_TURFS) || (ismob(A) && source.sight & SEE_MOBS) || (isobj(A) && source.sight & SEE_OBJS))) + return COMPONENT_ALLOW_EXAMINE + +/obj/item/dullahan_relay/proc/include_owner(datum/source, list/processing_list, list/hearers) + if(!QDELETED(owner)) + hearers += owner + +/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_limbs) + excluded_limbs |= BODY_ZONE_HEAD // So we don't gib when regenerating limbs. + +/obj/item/dullahan_relay/proc/retrieve_head(datum/source, admin_revive = FALSE) + if(admin_revive) //retrieving the owner's head for ahealing purposes. + var/obj/item/bodypart/head/H = loc + var/turf/T = get_turf(owner) + if(H && istype(H) && T && !(H in owner.GetAllContents())) + H.forceMove(T) /obj/item/dullahan_relay/process() if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner)) . = PROCESS_KILL qdel(src) -/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) - . = ..() - if(!QDELETED(owner)) - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode) - to_chat(owner,message) - else - qdel(src) - - /obj/item/dullahan_relay/Destroy() if(!QDELETED(owner)) var/mob/living/carbon/human/H = owner - if(H.dna.species.id == "dullahan") + if(isdullahan(H)) var/datum/species/dullahan/D = H.dna.species D.myhead = null owner.gib() diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 90714b390c..1e4b3e9fae 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -64,6 +64,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno + gib_types = list(/obj/effect/gibspawner/xeno/xenoperson, /obj/effect/gibspawner/xeno/xenoperson/bodypartless) skinned_type = /obj/item/stack/sheet/animalhide/xeno exotic_bloodtype = "X*" damage_overlay_type = "xeno" diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm index 135c98860a..4249be098f 100644 --- a/code/modules/mob/living/carbon/human/species_types/ipc.dm +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -11,6 +11,7 @@ mutant_bodyparts = list("ipc_screen", "ipc_antenna") default_features = list("ipc_screen" = "Blank", "ipc_antenna" = "None") meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc + gib_types = list(/obj/effect/gibspawner/ipc, /obj/effect/gibspawner/ipc/bodypartless) mutanttongue = /obj/item/organ/tongue/robot/ipc mutant_heart = /obj/item/organ/heart/ipc exotic_bloodtype = "HF" diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 71eaa5ae22..7d568ed510 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -11,6 +11,7 @@ default_features = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") //CIT CHANGE inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime + gib_types = list(/obj/effect/gibspawner/slime, /obj/effect/gibspawner/slime/bodypartless) exotic_blood = "jellyblood" exotic_bloodtype = "GEL" damage_overlay_type = "" 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 a719f2eda0..c0973102d6 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -18,6 +18,7 @@ attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/lizard + gib_types = list(/obj/effect/gibspawner/lizard, /obj/effect/gibspawner/lizard/bodypartless) skinned_type = /obj/item/stack/sheet/animalhide/lizard exotic_bloodtype = "L" disliked_food = GRAIN | DAIRY diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 09fc26d04f..90f63467a0 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -78,7 +78,7 @@ icon_state = "brain-x-d" var/obj/effect/proc_holder/spell/targeted/shadowwalk/shadowwalk -/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/brain/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(M.dna.species.id != "nightmare") M.set_species(/datum/species/shadow/nightmare) @@ -118,7 +118,7 @@ user.temporarilyRemoveItemFromInventory(src, TRUE) Insert(user) -/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0) +/obj/item/organ/heart/nightmare/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) ..() if(special != HEART_SPECIAL_SHADOWIFY) blade = new/obj/item/light_eater diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index ac18580e9b..5cd1a599ad 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -9,6 +9,7 @@ dangerous_existence = 1 blacklisted = 1 meat = null + gib_types = /obj/effect/gibspawner/robot damage_overlay_type = "synth" limbs_id = "synth" var/list/initial_species_traits = list(NOTRANSSTING) //for getting these values back for assume_disguise() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index a68aded85f..90d1424eea 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -400,17 +400,17 @@ There are several things that need to be remembered: if(wear_suit) var/obj/item/clothing/suit/S = wear_suit - var/no_taur_thanks = FALSE + var/item_level_support = FALSE // LISTEN! If you must degrade the code with further snowflake checks, at least keep it compatible with worn non-clothing items! if(!istype(S)) - no_taur_thanks = TRUE + item_level_support = TRUE wear_suit.screen_loc = ui_oclothing if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) client.screen += wear_suit update_observer_view(wear_suit,1) - if(!S.force_alternate_icon) - if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too + if(!item_level_support && !S.force_alternate_icon) + if(S.mutantrace_variation) //Just make sure we've got this checked too if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then. S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' else @@ -431,7 +431,7 @@ There are several things that need to be remembered: if(OFFSET_SUIT in dna.species.offset_features) suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] - if(!no_taur_thanks && S.center) + if(!item_level_support && S.center) suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y) overlays_standing[SUIT_LAYER] = suit_overlay update_hair() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f7dec3272c..0ff418d628 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -23,8 +23,12 @@ /mob/living/proc/gib_animation() return -/mob/living/proc/spawn_gibs() - new /obj/effect/gibspawner/generic(drop_location(), null, get_static_viruses()) +/mob/living/proc/spawn_gibs(with_bodyparts, atom/loc_override) + var/location = loc_override ? loc_override.drop_location() : drop_location() + if(MOB_ROBOTIC in mob_biotypes) + new /obj/effect/gibspawner/robot(location, src, get_static_viruses()) + else + new /obj/effect/gibspawner/generic(location, src, get_static_viruses()) /mob/living/proc/spill_organs() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 21e1b70b2e..17f07412d8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -40,6 +40,16 @@ QDEL_LIST(diseases) return ..() +/mob/living/onZImpact(turf/T, levels) + if(!isgroundlessturf(T)) + ZImpactDamage(T, levels) + return ..() + +/mob/living/proc/ZImpactDamage(turf/T, levels) + visible_message("[src] crashes into [T] with a sickening noise!") + adjustBruteLoss((levels * 5) ** 1.5) + Knockdown(levels * 50) + /mob/living/proc/OpenCraftingMenu() return @@ -524,6 +534,7 @@ for(var/organ in C.internal_organs) var/obj/item/organ/O = organ O.setOrganDamage(0) + SEND_SIGNAL(src, COMSIG_LIVING_FULLY_HEAL, admin_revive) //proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 1ee563bc1f..93bb9d1f8d 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -32,4 +32,7 @@ if(drag_slowdown && L.lying && !L.buckled && grab_state < GRAB_AGGRESSIVE) add_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) return - remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) \ No newline at end of file + remove_movespeed_modifier(MOVESPEED_ID_PRONE_DRAGGING) + +/mob/living/canZMove(dir, turf/target) + return can_zTravel(target, dir) && (movement_type & FLYING) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 551d9f4a99..6cfeb79680 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -788,7 +788,7 @@ /mob/living/silicon/ai/can_buckle() return 0 -/mob/living/silicon/ai/incapacitated() +/mob/living/silicon/ai/incapacitated(ignore_restraints, ignore_grab) if(aiRestorePowerRoutine) return TRUE return ..() diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index f757203237..112add367f 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -49,7 +49,7 @@ else padloc = "(UNKNOWN)" src.log_talk(message, LOG_SAY, tag="HOLOPAD in [padloc]") - send_speech(message, 7, T, "robot", message_language = language) + send_speech(message, 7, T, "robot", language) to_chat(src, "Holopad transmitted, [real_name] \"[message]\"") else to_chat(src, "No holopad connected.") diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 8ecacb608b..48486c0255 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -1,5 +1,5 @@ -/mob/living/silicon/spawn_gibs() - new /obj/effect/gibspawner/robot(drop_location()) +/mob/living/silicon/spawn_gibs(with_bodyparts, atom/loc_override) + new /obj/effect/gibspawner/robot(loc_override ? loc_override.drop_location() : drop_location(), src) /mob/living/silicon/spawn_dust() new /obj/effect/decal/remains/robot(loc) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1b04905d7d..dad4001481 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -218,7 +218,7 @@ bot_control(action, usr) // Kill this later. . = TRUE -/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0) +/mob/living/simple_animal/bot/mulebot/bot_control(command, mob/user, pda = 0, turf/user_turf, list/user_access = list()) if(pda && wires.is_cut(WIRE_RX)) // MULE wireless is controlled by wires. return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index fe02339403..a0c60bba00 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -159,16 +159,16 @@ Auto Patrol: []"}, mode = BOT_HUNT /mob/living/simple_animal/bot/secbot/proc/judgement_criteria() - var/final = FALSE - if(idcheck) - final = final|JUDGE_IDCHECK - if(check_records) - final = final|JUDGE_RECORDCHECK - if(weaponscheck) - final = final|JUDGE_WEAPONCHECK - if(emagged == 2) - final = final|JUDGE_EMAGGED - return final + var/final = FALSE + if(idcheck) + final = final|JUDGE_IDCHECK + if(check_records) + final = final|JUDGE_RECORDCHECK + if(weaponscheck) + final = final|JUDGE_WEAPONCHECK + if(emagged == 2) + final = final|JUDGE_EMAGGED + return final /mob/living/simple_animal/bot/secbot/proc/special_retaliate_after_attack(mob/user) //allows special actions to take place after being attacked. return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index e54b21724d..948be53abc 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -21,7 +21,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE) + notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE, ignore_dnr_observers = TRUE) GLOB.poi_list |= src if(isnull(possible_seasonal_hats)) build_seasonal_hats() @@ -40,7 +40,7 @@ . = ..() //ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/drone_shell/attack_ghost(mob/user) +/obj/item/drone_shell/attack_ghost(mob/dead/observer/user) if(jobban_isbanned(user,"drone") || QDELETED(src) || QDELETED(user)) return if(CONFIG_GET(flag/use_age_restriction_for_jobs)) @@ -49,6 +49,8 @@ if(user.client.player_age < DRONE_MINIMUM_AGE) to_chat(user, "You're too new to play as a drone! Please try again in [DRONE_MINIMUM_AGE - user.client.player_age] days.") return + if(!user.can_reenter_round()) + return FALSE if(!SSticker.mode) to_chat(user, "Can't become a drone before the game has started.") return diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index d8912ee25f..2f37857902 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -1,39 +1,39 @@ /mob/living/simple_animal/hostile/retaliate/poison - var/poison_per_bite = 0 - var/poison_type = "toxin" + var/poison_per_bite = 0 + var/poison_type = "toxin" /mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget() - . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.reagents && !poison_per_bite == 0) - L.reagents.add_reagent(poison_type, poison_per_bite) - return . + . = ..() + if(. && isliving(target)) + var/mob/living/L = target + if(L.reagents && !poison_per_bite == 0) + L.reagents.add_reagent(poison_type, poison_per_bite) + return /mob/living/simple_animal/hostile/retaliate/poison/snake - name = "snake" - desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - speak_emote = list("hisses") - health = 20 - maxHealth = 20 - attacktext = "bites" - melee_damage_lower = 5 - melee_damage_upper = 6 - response_help = "pets" - response_disarm = "shoos" - response_harm = "steps on" - faction = list("hostile") - ventcrawler = VENTCRAWLER_ALWAYS - density = FALSE - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) - gold_core_spawnable = FRIENDLY_SPAWN - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE + name = "snake" + desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + health = 20 + maxHealth = 20 + attacktext = "bites" + melee_damage_lower = 5 + melee_damage_upper = 6 + response_help = "pets" + response_disarm = "shoos" + response_harm = "steps on" + faction = list("hostile") + ventcrawler = VENTCRAWLER_ALWAYS + density = FALSE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + mob_biotypes = list(MOB_ORGANIC, MOB_BEAST, MOB_REPTILE) + gold_core_spawnable = FRIENDLY_SPAWN + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE /mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target) @@ -54,9 +54,9 @@ return mice /mob/living/simple_animal/hostile/retaliate/poison/snake/AttackingTarget() - if(istype(target, /mob/living/simple_animal/mouse)) - visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") - QDEL_NULL(target) - adjustBruteLoss(-2) - else - return ..() \ No newline at end of file + if(istype(target, /mob/living/simple_animal/mouse)) + visible_message("[name] consumes [target] in a single gulp!", "You consume [target] in a single gulp!") + QDEL_NULL(target) + adjustBruteLoss(-2) + else + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm index 823c26b4e9..81dc9d3e24 100644 --- a/code/modules/mob/living/simple_animal/hostile/banana_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/banana_spider.dm @@ -33,7 +33,7 @@ . = ..() var/area/A = get_area(src) if(A) - notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE) + notify_ghosts("A banana spider has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE) /mob/living/simple_animal/banana_spider/attack_ghost(mob/user) if(key) //please stop using src. without a good reason. @@ -41,12 +41,19 @@ if(CONFIG_GET(flag/use_age_restriction_for_jobs)) if(!isnum(user.client.player_age)) return + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return if(!SSticker.mode) to_chat(user, "Can't become a banana spider before the game has started.") return var/be_spider = alert("Become a banana spider? (Warning, You can no longer be cloned!)",,"Yes","No") if(be_spider == "No" || QDELETED(src) || !isobserver(user)) return + if(key) + to_chat(user, "Someone else already took this banana spider.") + return sentience_act() user.transfer_ckey(src, FALSE) density = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 2f39ae13a1..69209f7266 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -83,15 +83,19 @@ /mob/living/simple_animal/hostile/poison/giant_spider/proc/humanize_spider(mob/user) if(key || !playable_spider || stat)//Someone is in it, it's dead, or the fun police are shutting it down - return 0 + return FALSE + if(isobserver(user)) + var/mob/dead/observer/O = user + if(!O.can_reenter_round()) + return FALSE var/spider_ask = alert("Become a spider?", "Are you australian?", "Yes", "No") if(spider_ask == "No" || !src || QDELETED(src)) - return 1 + return TRUE if(key) to_chat(user, "Someone else already took this spider.") - return 1 + return TRUE user.transfer_ckey(src, FALSE) - return 1 + return TRUE //nursemaids - these create webs and eggs /mob/living/simple_animal/hostile/poison/giant_spider/nurse 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 c21166276a..b9102cf220 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -575,13 +575,15 @@ Difficulty: Very Hard if(..() && !ready_to_deploy) GLOB.poi_list |= src ready_to_deploy = TRUE - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK) + notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, ignore_dnr_observers = TRUE) /obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) . = ..() if(.) return if(ready_to_deploy) + if(!user.can_reenter_round()) + return FALSE var/be_helper = alert("Become a Lightgeist? (Warning, You can no longer be cloned!)",,"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)) @@ -728,7 +730,7 @@ Difficulty: Very Hard holder_animal.mind.AddSpell(P) holder_animal.verbs -= /mob/living/verb/pulled -/obj/structure/closet/stasis/dump_contents(var/kill = 1) +/obj/structure/closet/stasis/dump_contents(override = TRUE, kill = 1) STOP_PROCESSING(SSobj, src) for(var/mob/living/L in src) REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) @@ -774,7 +776,7 @@ Difficulty: Very Hard for(var/i in user) if(istype(i, /obj/structure/closet/stasis)) var/obj/structure/closet/stasis/S = i - S.dump_contents(0) + S.dump_contents(kill=0) qdel(S) break user.gib() diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index cb67019b7e..918a2d8acc 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -92,7 +92,7 @@ if(M) playsound(src, 'sound/magic/demon_consume.ogg', 50, 1) M.adjustBruteLoss(60) - new /obj/effect/gibspawner/generic(get_turf(M)) + M.spawn_gibs() if(M.stat == DEAD) var/mob/living/simple_animal/hostile/netherworld/blankbody/blank blank = new(loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f790d15d2d..b911416e24 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -307,8 +307,11 @@ set name = "Examine" set category = "IC" - if(isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))) - // shift-click catcher may issue examinate() calls for out-of-sight turfs + if(!client) + return + + if(!(SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A) & COMPONENT_ALLOW_EXAMINE) && ((client.eye != src && client.eye != loc) || (isturf(A) && !(sight & SEE_TURFS) && !(A in view(client ? client.view : world.view, src))))) + //cameras & co don't allow users to examine far away things, also shift-click catcher may issue examinate() calls for out-of-sight turfs return if(is_blind(src)) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index eb22ab7403..92cba9901e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -67,8 +67,8 @@ /proc/slur(n,var/strength=50) strength = min(strength,50) var/phrase = html_decode(n) - var/leng = lentext(phrase) - var/counter=lentext(phrase) + var/leng = length(phrase) + var/counter=length(phrase) var/newphrase="" var/newletter="" while(counter>=1) @@ -102,8 +102,8 @@ /proc/cultslur(n) // Inflicted on victims of a stun talisman var/phrase = html_decode(n) - var/leng = lentext(phrase) - var/counter=lentext(phrase) + var/leng = length(phrase) + var/counter=length(phrase) var/newphrase="" var/newletter="" while(counter>=1) @@ -352,12 +352,12 @@ It's fairly easy to fix if dealing with single letters but not so much with comp /mob/proc/reagent_check(datum/reagent/R) // utilized in the species code return 1 -/proc/notify_ghosts(var/message, var/ghost_sound = null, var/enter_link = null, var/atom/source = null, var/mutable_appearance/alert_overlay = null, var/action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key) //Easy notification of ghosts. +/proc/notify_ghosts(message, ghost_sound, enter_link, atom/source, mutable_appearance/alert_overlay, action = NOTIFY_JUMP, flashwindow = TRUE, ignore_mapload = TRUE, ignore_key, ignore_dnr_observers = FALSE) //Easy notification of ghosts. if(ignore_mapload && SSatoms.initialized != INITIALIZATION_INNEW_REGULAR) //don't notify for objects created during a map load return for(var/mob/dead/observer/O in GLOB.player_list) if(O.client) - if (ignore_key && O.ckey in GLOB.poll_ignore[ignore_key]) + if ((ignore_key && (O.ckey in GLOB.poll_ignore[ignore_key])) || (ignore_dnr_observers && !O.can_reenter_round(TRUE))) continue to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 85d8f94deb..d9d6605ed9 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -369,3 +369,35 @@ if(hud_used && hud_used.static_inventory) for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon(src) + +/mob/verb/up() + set name = "Move Upwards" + set category = "IC" + + if(zMove(UP, TRUE)) + to_chat(src, "You move upwards.") + +/mob/verb/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN, TRUE)) + to_chat(src, "You move down.") + +/mob/proc/zMove(dir, feedback = FALSE) + if(dir != UP && dir != DOWN) + return FALSE + var/turf/target = get_step_multiz(src, dir) + if(!target) + if(feedback) + to_chat(src, "There's nothing in that direction!") + return FALSE + if(!canZMove(dir, target)) + if(feedback) + to_chat(src, "You couldn't move there!") + return FALSE + forceMove(target) + return TRUE + +/mob/proc/canZMove(direction, turf/target) + return FALSE \ No newline at end of file diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 1fc97c31e4..4bbeef707a 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -25,7 +25,7 @@ if(flavor_text && flavor_text != "") // We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown. var/msg = html_decode(replacetext(flavor_text, "\n", " ")) - if(lentext(msg) <= 40) + if(length(msg) <= 40) return "[html_encode(msg)]" else return "[html_encode(copytext(msg, 1, 37))]... More..." diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 3009a3ebfd..5f7db07190 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -100,7 +100,7 @@ /obj/item/paper/contract/infernal/suicide_act(mob/user) if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/)) var/mob/living/carbon/human/H = user - H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!", forced = "infernal contract suicide") + H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!") H.visible_message("[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!") H.adjust_fire_stacks(20) H.IgniteMob() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 6cedab99a4..03de18ec13 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne use_power = IDLE_POWER_USE interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OFFLINE var/on = TRUE - var/breaker = 1 + var/breaker = TRUE var/list/parts = list() var/obj/middle = null var/charging_state = POWER_IDLE @@ -167,7 +167,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne M.set_broken() middle.cut_overlays() charge_count = 0 - breaker = 0 + breaker = FALSE set_power() set_state(0) investigate_log("has broken down.", INVESTIGATE_GRAVITY) @@ -177,7 +177,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne for(var/obj/machinery/gravity_generator/M in parts) if(M.stat & BROKEN) M.set_fix() - broken_state = 0 + broken_state = FALSE update_icon() set_power() @@ -274,11 +274,11 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Set the charging state based on power/breaker. /obj/machinery/gravity_generator/main/proc/set_power() - var/new_state = 0 + var/new_state = FALSE if(stat & (NOPOWER|BROKEN) || !breaker) - new_state = 0 + new_state = FALSE else if(breaker) - new_state = 1 + new_state = TRUE charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) @@ -293,13 +293,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/alert = FALSE if(SSticker.IsRoundInProgress()) if(on) // If we turned on and the game is live. - if(gravity_in_level() == 0) - alert = 1 + if(gravity_in_level() == FALSE) + alert = TRUE investigate_log("was brought online and is now producing gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought online [ADMIN_VERBOSEJMP(src)]") else - if(gravity_in_level() == 1) - alert = 1 + if(gravity_in_level() == TRUE) + alert = TRUE investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") @@ -362,7 +362,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/sound/alert_sound = sound('sound/effects/alert.ogg') for(var/i in GLOB.mob_list) var/mob/M = i - if(M.z != z) + if(M.z != z && !(SSmapping.level_trait(z, ZTRAITS_STATION) && SSmapping.level_trait(M.z, ZTRAITS_STATION))) continue M.update_gravity(M.mob_has_gravity()) if(M.client) @@ -372,20 +372,28 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) if(!T) - return 0 + return FALSE if(GLOB.gravity_generators["[T.z]"]) return length(GLOB.gravity_generators["[T.z]"]) - return 0 + return FALSE /obj/machinery/gravity_generator/main/proc/update_list() var/turf/T = get_turf(src.loc) if(T) - if(!GLOB.gravity_generators["[T.z]"]) - GLOB.gravity_generators["[T.z]"] = list() - if(on) - GLOB.gravity_generators["[T.z]"] |= src + var/list/z_list = list() + // Multi-Z, station gravity generator generates gravity on all ZTRAIT_STATION z-levels. + if(SSmapping.level_trait(T.z, ZTRAIT_STATION)) + for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + z_list += z else - GLOB.gravity_generators["[T.z]"] -= src + z_list += T.z + for(var/z in z_list) + if(!GLOB.gravity_generators["[z]"]) + GLOB.gravity_generators["[z]"] = list() + if(on) + GLOB.gravity_generators["[z]"] |= src + else + GLOB.gravity_generators["[z]"] -= src /obj/machinery/gravity_generator/main/proc/change_setting(value) if(value != setting) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index f995993ea2..e73664adb8 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -177,8 +177,6 @@ fixture_type = "bulb" sheets_refunded = 1 - - // the standard tube light fixture /obj/machinery/light name = "light fixture" @@ -197,8 +195,8 @@ var/on_gs = FALSE var/static_power_used = 0 var/brightness = 8 // luminosity when on, also used in power calculation - var/bulb_power = 1 // basically the alpha of the emitted light source - var/bulb_colour = "#FFFFFF" // befault colour of the light. + var/bulb_power = 0.75 // basically the alpha of the emitted light source + var/bulb_colour = "#FFEEDD" // befault colour of the light. var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN var/flickering = FALSE var/light_type = /obj/item/light/tube // the type of light item @@ -235,6 +233,7 @@ base_state = "bulb" fitting = "bulb" brightness = 4 + bulb_colour = "#FFDDBB" desc = "A small lighting fixture." light_type = /obj/item/light/bulb diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm new file mode 100644 index 0000000000..9d8abf9066 --- /dev/null +++ b/code/modules/power/multiz.dm @@ -0,0 +1,80 @@ +/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" + 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) + if(default_unfasten_wrench(user, I)) + return FALSE + . = ..() + +/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() + +///Allows you to scan the relay with a multitool to see stats. +/obj/machinery/power/deck_relay/multitool_act(mob/user, obj/item/I) + if(powernet && (powernet.avail > 0)) // is it powered? + 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.") + find_relays() + addtimer(CALLBACK(src, .proc/refresh), 20) //Wait a bit so we can find the one below, then get powering + return TRUE + +/obj/machinery/power/deck_relay/Initialize() + . = ..() + addtimer(CALLBACK(src, .proc/find_relays), 30) + addtimer(CALLBACK(src, .proc/refresh), 50) //Wait a bit so we can find the one below, then get powering + +///Handles re-acquiring + merging powernets found by find_relays() +/obj/machinery/power/deck_relay/proc/refresh() + if(above) + above.merge(src) + if(below) + below.merge(src) + +/obj/machinery/power/deck_relay/proc/merge(var/obj/machinery/power/deck_relay/DR) + if(!DR) + return + var/turf/merge_from = get_turf(DR) + var/turf/merge_to = get_turf(src) + var/obj/structure/cable/C = merge_from.get_cable_node() + var/obj/structure/cable/XR = merge_to.get_cable_node() + if(C && XR) + merge_powernets(XR.powernet,C.powernet)//Bridge the powernets. + +///Locates relays that are above and below this object +/obj/machinery/power/deck_relay/proc/find_relays() + var/turf/T = get_turf(src) + if(!T || !istype(T)) + return FALSE + below = null //in case we're re-establishing + 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. + powernet = C.powernet + below = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_below(T)) + above = locate(/obj/machinery/power/deck_relay) in(SSmapping.get_turf_above(T)) + if(below || above) + icon_state = "cablerelay-on" + return TRUE \ No newline at end of file diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index dbd16b8c08..c0d5a51e28 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -87,10 +87,9 @@ var/mob/living/carbon/C = user log_game("[key_name(C)] has been disintegrated by attempting to telekenetically grab a singularity.") C.visible_message("[C]'s head begins to collapse in on itself!", "Your head feels like it's collapsing in on itself! This was really not a good idea!", "You hear something crack and explode in gore.") - var/turf/T = get_turf(C) for(var/i in 1 to 3) C.apply_damage(30, BRUTE, BODY_ZONE_HEAD) - new /obj/effect/gibspawner/generic(T) + C.spawn_gibs() sleep(1) var/obj/item/bodypart/head/rip_u = C.get_bodypart(BODY_ZONE_HEAD) rip_u.dismember(BURN) //nice try jedi diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index e6fa1e0ee4..4cbb88fe6b 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -313,7 +313,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) playsound(T, 'sound/effects/supermatter.ogg', 50, 1) T.visible_message("[T] smacks into [src] and rapidly flashes to ash.",\ "You hear a loud crack as you are washed with a wave of heat.") - T.CalculateAdjacentTurfs() + CALCULATE_ADJACENT_TURFS(T) /obj/machinery/power/supermatter_crystal/process_atmos() var/turf/T = loc @@ -650,6 +650,11 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) Consume(AM) +/obj/machinery/power/supermatter_crystal/intercept_zImpact(atom/movable/AM, levels) + . = ..() + Bumped(AM) + . |= FALL_STOP_INTERCEPTING | FALL_INTERCEPTED + /obj/machinery/power/supermatter_crystal/proc/Consume(atom/movable/AM) if(isliving(AM)) var/mob/living/user = AM diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index b45d01d7d8..6232ca4d69 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,6 +6,11 @@ caliber = "357" projectile_type = /obj/item/projectile/bullet/a357 +/obj/item/ammo_casing/a357/ap + name = ".357 armor-piercing bullet casing" + desc = "A .357 armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/a357/ap + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 @@ -20,9 +25,26 @@ name = ".38 rubber bullet casing" desc = "A .38 rubber bullet casing." caliber = "38" - projectile_type = /obj/item/projectile/bullet/c38 + projectile_type = /obj/item/projectile/bullet/c38/rubber /obj/item/ammo_casing/c38/lethal name = ".38 bullet casing" desc = "A .38 bullet casing" - projectile_type = /obj/item/projectile/bullet/c38lethal + projectile_type = /obj/item/projectile/bullet/c38 + +/obj/item/ammo_casing/c38/trac + name = ".38 TRAC bullet casing" + desc = "A .38 \"TRAC\" bullet casing." + projectile_type = /obj/item/projectile/bullet/c38/trac + +/obj/item/ammo_casing/c38/hotshot + name = ".38 Hot Shot bullet casing" + desc = "A .38 Hot Shot bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38/hotshot + +/obj/item/ammo_casing/c38/iceblox + name = ".38 Iceblox bullet casing" + desc = "A .38 Iceblox bullet casing." + caliber = "38" + projectile_type = /obj/item/projectile/bullet/c38/iceblox \ No newline at end of file diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 7cd27e8592..ba6a8e2454 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -3,13 +3,19 @@ desc = "Designed to quickly reload revolvers." icon_state = "357" ammo_type = /obj/item/ammo_casing/a357 + caliber = "357" max_ammo = 7 multiple_sprites = 1 +/obj/item/ammo_box/a357/ap + name = "speed loader (.357 AP)" + ammo_type = /obj/item/ammo_casing/a357/ap + /obj/item/ammo_box/c38 name = "speed loader (.38 rubber)" desc = "Designed to quickly reload revolvers." icon_state = "38" + caliber = "38" ammo_type = /obj/item/ammo_casing/c38 max_ammo = 6 multiple_sprites = 1 @@ -19,6 +25,21 @@ name = "speed loader (.38)" ammo_type = /obj/item/ammo_casing/c38/lethal +/obj/item/ammo_box/c38/trac + name = "speed loader (.38 TRAC)" + desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." + ammo_type = /obj/item/ammo_casing/c38/trac + +/obj/item/ammo_box/c38/hotshot + name = "speed loader (.38 Hot Shot)" + desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." + ammo_type = /obj/item/ammo_casing/c38/hotshot + +/obj/item/ammo_box/c38/iceblox + name = "speed loader (.38 Iceblox)" + desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." + ammo_type = /obj/item/ammo_casing/c38/iceblox + /obj/item/ammo_box/c9mm name = "ammo box (9mm)" icon_state = "9mmbox" diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 2f198c1319..a5262da7a3 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -152,7 +152,7 @@ #define BRAINS_BLOWN_THROW_RANGE 3 #define BRAINS_BLOWN_THROW_SPEED 1 -/obj/item/gun/ballistic/suicide_act(mob/user) +/obj/item/gun/ballistic/suicide_act(mob/living/user) var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") @@ -165,12 +165,10 @@ var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) B.Remove(user) B.forceMove(T) - var/datum/dna/user_dna if(iscarbon(user)) var/mob/living/carbon/C = user - user_dna = C.dna - B.add_blood_DNA(user_dna, C.diseases) - var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna)) + B.add_blood_DNA(C.dna, C.diseases) + var/datum/callback/gibspawner = CALLBACK(user, /mob/living/proc/spawn_gibs, FALSE, B) B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner) return(BRUTELOSS) else diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index a5fb8a85aa..25a50f3e03 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -167,6 +167,7 @@ /obj/item/gun/ballistic/revolver/russian name = "\improper Russian revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull." + icon_state = "russianrevolver" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357 var/spun = FALSE diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index d3af474d76..3bbfe437fe 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -13,16 +13,59 @@ // .38 (Detective's Gun) /obj/item/projectile/bullet/c38 + name = ".38 bullet" + damage = 25 + +/obj/item/projectile/bullet/c38/rubber name = ".38 rubber bullet" damage = 15 stamina = 48 -/obj/item/projectile/bullet/c38lethal - name = ".38 bullet" - damage = 25 +/obj/item/projectile/bullet/c38/trac + name = ".38 TRAC bullet" + damage = 10 + +/obj/item/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) + . = ..() + var/mob/living/carbon/M = target + var/obj/item/implant/tracking/c38/imp + for(var/obj/item/implant/tracking/c38/TI in M.implants) //checks if the target already contains a tracking implant + imp = TI + return + if(!imp) + imp = new /obj/item/implant/tracking/c38(M) + imp.implant(M) + +/obj/item/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail + name = ".38 Hot Shot bullet" + damage = 20 + +/obj/item/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) + . = ..() + if(iscarbon(target)) + var/mob/living/carbon/M = target + M.adjust_fire_stacks(6) + M.IgniteMob() + +/obj/item/projectile/bullet/c38/iceblox //see /obj/item/projectile/temp for the original code + name = ".38 Iceblox bullet" + damage = 20 + var/temperature = 100 + +/obj/item/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) + . = ..() + if(isliving(target)) + var/mob/living/M = target + M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature)) + // .357 (Syndie Revolver) /obj/item/projectile/bullet/a357 name = ".357 bullet" damage = 60 + +/obj/item/projectile/bullet/a357/ap + name = ".357 armor-piercing bullet" + damage = 45 + armour_penetration = 45 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 78be94339c..3ffac7804e 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -38,3 +38,9 @@ dismemberment = 0 //It goes through you cleanly. knockdown = 0 breakthings = FALSE + +/obj/item/projectile/bullet/p50/penetrator/shuttle //Nukeop Shuttle Variety + icon_state = "gaussstrong" + damage = 25 + speed = 0.3 + range = 16 diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 5b84608fad..6f42b67750 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -221,7 +221,7 @@ new_mob =new hooman(M.loc) var/datum/preferences/A = new() //Randomize appearance for the human - A.copy_to(new_mob, icon_updates=0) + A.copy_to(new_mob, FALSE) var/mob/living/carbon/human/H = new_mob H.update_body() diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index b5bfa06786..1eb75e042b 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -114,7 +114,6 @@ recharge_counter++ /obj/machinery/chem_dispenser/proc/display_beaker() - ..() var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") b_o.pixel_y = -4 b_o.pixel_x = -7 diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index 4d60655488..c0d453de54 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -15,7 +15,7 @@ var/setting = 1 // displayed range is 3 * setting var/max_range = 3 // displayed max range is 3 * max range -/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc) +/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc, silent=FALSE) amount = setting carry.copy_to(chemholder, 20) carry.remove_any(amount * 16 / efficiency) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 52d3ba7822..da41ac9dc4 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -44,7 +44,7 @@ var/inverse_chem // What chem is metabolised when purity is below inverse_chem_val, this shouldn't be made, but if it does, well, I guess I'll know about it. var/metabolizing = FALSE var/chemical_flags // See fermi/readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_ONLYINVERSE, REAGENT_ONMOBMERGE, REAGENT_INVISIBLE, REAGENT_FORCEONNEW, REAGENT_SNEAKYNAME - + var/value = 0 //How much does it sell for in cargo? /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/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 94aca411be..fdb8dde232 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -88,7 +88,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of beer" glass_desc = "A freezing pint of beer." pH = 4 - + value = 0.1 /datum/reagent/consumable/ethanol/beer/light name = "Light Beer" @@ -99,6 +99,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." pH = 5 + value = 0.3 /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -110,6 +111,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." pH = 6 + value = 0.3 /datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/M) if(M.color != color) @@ -130,6 +132,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" pH = 6 + value = 0.1 /datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/M) @@ -153,6 +156,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/thirteenloko name = "Thirteen Loko" @@ -168,7 +172,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "thirteen_loko_glass" glass_name = "glass of Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - + value = 0.3 /datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/M) M.drowsyness = max(0,M.drowsyness-7) @@ -231,6 +235,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" pH = 8.1 + value = 0.1 /datum/reagent/consumable/ethanol/vodka/on_mob_life(mob/living/carbon/M) M.radiation = max(M.radiation-2,0) @@ -247,6 +252,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "glass of bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." + value = 0.5 /datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/M) if(M.getBruteLoss() && prob(10)) @@ -266,6 +272,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." pH = 3.5 + value = 1 /datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -282,6 +289,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." pH = 6.9 + value = 0.1 /datum/reagent/consumable/ethanol/rum name = "Rum" @@ -295,6 +303,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" pH = 6.5 + value = 0.1 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -308,6 +317,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" pH = 4 + value = 0.1 /datum/reagent/consumable/ethanol/vermouth name = "Vermouth" @@ -321,6 +331,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" pH = 3.25 + value = 0.1 /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -334,6 +345,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" pH = 3.45 + value = 0.1 /datum/reagent/consumable/ethanol/lizardwine name = "Lizard wine" @@ -344,6 +356,7 @@ All effects don't start immediately, but rather get worse over time; the rate is quality = DRINK_FANTASTIC taste_description = "scaley sweetness" pH = 3 + value = 2 /datum/reagent/consumable/ethanol/grappa name = "Grappa" @@ -356,6 +369,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." pH = 3.5 + value = 0.1 /datum/reagent/consumable/ethanol/cognac name = "Cognac" @@ -369,6 +383,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" pH = 3.5 + value = 0.1 /datum/reagent/consumable/ethanol/absinthe name = "Absinthe" @@ -381,6 +396,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of absinthe" glass_desc = "It's as strong as it smells." shot_glass_icon_state = "shotglassgreen" + value = 0.1 /datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/M) if(prob(10) && !HAS_TRAIT(M, TRAIT_ALCOHOL_TOLERANCE)) @@ -415,6 +431,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/goldschlager name = "Goldschlager" @@ -428,6 +445,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of goldschlager" glass_desc = "100% proof that teen girls will drink anything with gold in it." shot_glass_icon_state = "shotglassgold" + value = 0.5 /datum/reagent/consumable/ethanol/patron name = "Patron" @@ -442,6 +460,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" pH = 4.5 + value = 0.1 /datum/reagent/consumable/ethanol/gintonic name = "Gin and Tonic" @@ -455,6 +474,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." pH = 3 + value = 0.5 /datum/reagent/consumable/ethanol/rum_coke name = "Rum and Coke" @@ -468,6 +488,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." pH = 4 + value = 1 /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -480,6 +501,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "cubalibreglass" glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" + value = 0.5 /datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/M) @@ -502,7 +524,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious." - + value = 0.5 /datum/reagent/consumable/ethanol/martini name = "Classic Martini" @@ -515,6 +537,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Classic Martini" glass_desc = "Damn, the bartender even stirred it, not shook it." + value = 1 /datum/reagent/consumable/ethanol/vodkamartini name = "Vodka Martini" @@ -527,6 +550,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Vodka martini" glass_desc ="A bastardisation of the classic martini. Still great." + value = 1 /datum/reagent/consumable/ethanol/white_russian @@ -540,6 +564,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiterussianglass" glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." + value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" @@ -552,6 +577,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "screwdriverglass" glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." + value = 1 /datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/M) if(M.mind && M.mind.assigned_role in list("Station Engineer", "Atmospheric Technician", "Chief Engineer")) //Engineers lose radiation poisoning at a massive rate. @@ -568,6 +594,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "booger" glass_name = "Booger" glass_desc = "Ewww..." + value = 0.3 /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" @@ -580,6 +607,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bloodymaryglass" glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder." + value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) @@ -597,6 +625,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bravebullglass" glass_name = "Brave Bull" glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." + value = 2 var/tough_text /datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/M) @@ -621,6 +650,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tequilasunriseglass" glass_name = "tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." + value = 2 var/obj/effect/light_holder /datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/M) @@ -651,6 +681,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on FIRE!" shot_glass_icon_state = "toxinsspecialglass" + value = 2 /datum/reagent/consumable/ethanol/toxins_special/on_mob_life(var/mob/living/M) M.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -670,6 +701,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." pH = 2 overdose_threshold = 40 + value = 3 var/datum/brain_trauma/special/beepsky/B /datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/M) @@ -711,6 +743,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcreamglass" glass_name = "Irish Cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" + value = 1 /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" @@ -723,6 +756,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manlydorfglass" glass_name = "The Manly Dorf" glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only." + value = 2 var/dorf_mode /datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/M) @@ -750,7 +784,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "longislandicedteaglass" glass_name = "Long Island Iced Tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - + value = 1 /datum/reagent/consumable/ethanol/moonshine name = "Moonshine" @@ -762,6 +796,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_clear" glass_name = "Moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." + value = 2 /datum/reagent/consumable/ethanol/b52 name = "B-52" @@ -775,6 +810,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "B-52" glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" + value = 5.2 /datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M) playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) @@ -790,6 +826,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcoffeeglass" glass_name = "Irish Coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." + value = 2 /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -802,6 +839,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "margaritaglass" glass_name = "Margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" + value = 2 /datum/reagent/consumable/ethanol/black_russian name = "Black Russian" @@ -814,6 +852,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blackrussianglass" glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." + value = 3 /datum/reagent/consumable/ethanol/manhattan @@ -827,6 +866,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manhattanglass" glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." + value = 3 /datum/reagent/consumable/ethanol/manhattan_proj @@ -840,6 +880,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "proj_manhattanglass" glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." + value = 6 /datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/M) @@ -857,6 +898,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeysodaglass2" glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." + value = 1 /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" @@ -865,10 +907,11 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#664300" // rgb: 102, 67, 0 boozepwr = 35 quality = DRINK_NICE - taste_description = "Jack Frost's piss" + taste_description = "Jack Frost's piss" //Waterspots eeewww glass_icon_state = "antifreeze" glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." + value = 3 /datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 20) //310.15 is the normal bodytemp. @@ -885,6 +928,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "b&p" glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." + value = 4 /datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/M) if(ishuman(M)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. @@ -905,6 +949,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "snowwhite" glass_name = "Snow White" glass_desc = "A cold refreshment." + value = 1 /datum/reagent/consumable/ethanol/demonsblood //Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. name = "Demon's Blood" @@ -917,6 +962,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "demonsblood" glass_name = "Demons Blood" glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." + value = 2 /datum/reagent/consumable/ethanol/devilskiss //If eaten by a slaughter demon, the demon will regret it. name = "Devil's Kiss" @@ -929,6 +975,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "devilskiss" glass_name = "Devils Kiss" glass_desc = "Creepy time!" + value = 2 /datum/reagent/consumable/ethanol/vodkatonic name = "Vodka and Tonic" @@ -941,7 +988,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "vodkatonicglass" glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." - + value = 1 /datum/reagent/consumable/ethanol/ginfizz name = "Gin Fizz" @@ -954,7 +1001,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginfizzglass" glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." - + value = 1 /datum/reagent/consumable/ethanol/bahama_mama name = "Bahama Mama" @@ -967,6 +1014,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bahama_mama" glass_name = "Bahama Mama" glass_desc = "Tropical cocktail." + value = 2 /datum/reagent/consumable/ethanol/singulo name = "Singulo" @@ -979,6 +1027,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "singulo" glass_name = "Singulo" glass_desc = "A blue-space beverage." + value = 4 /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -991,6 +1040,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sbitenglass" glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." + value = 2 /datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(50 * TEMPERATURE_DAMAGE_COEFFICIENT, 0 ,BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. @@ -1007,6 +1057,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "red_meadglass" glass_name = "Red Mead" glass_desc = "A True Viking's Beverage, though its color is strange." + value = 5 /datum/reagent/consumable/ethanol/mead name = "Mead" @@ -1020,6 +1071,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "meadglass" glass_name = "Mead" glass_desc = "A Viking's Beverage, though a cheap one." + value = 1 /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" @@ -1031,6 +1083,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "iced_beerglass" glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." + value = 1 /datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) //310.15 is the normal bodytemp. @@ -1046,7 +1099,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grogglass" glass_name = "Grog" glass_desc = "A fine and cepa drink for Space." - + value = 2.1 /datum/reagent/consumable/ethanol/aloe name = "Aloe" @@ -1059,6 +1112,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aloe" glass_name = "Aloe" glass_desc = "Very, very, very good." + value = 1 /datum/reagent/consumable/ethanol/andalusia name = "Andalusia" @@ -1071,6 +1125,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "andalusia" glass_name = "Andalusia" glass_desc = "A nice, strangely named drink." + value = 1 /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" @@ -1083,6 +1138,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "alliescocktail" glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." + value = 4 /datum/reagent/consumable/ethanol/acid_spit name = "Acid Spit" @@ -1095,6 +1151,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "acidspitglass" glass_name = "Acid Spit" glass_desc = "A drink from Nanotrasen. Made from live aliens." + value = 3 /datum/reagent/consumable/ethanol/amasec name = "Amasec" @@ -1107,6 +1164,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "amasecglass" glass_name = "Amasec" glass_desc = "Always handy before COMBAT!!!" + value = 2 /datum/reagent/consumable/ethanol/changelingsting name = "Changeling Sting" @@ -1119,6 +1177,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "changelingsting" glass_name = "Changeling Sting" glass_desc = "A stingy drink." + value = 1.5 /datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/M) if(M.mind) //Changeling Sting assists in the recharging of changeling chemicals. @@ -1139,6 +1198,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcarbomb" glass_name = "Irish Car Bomb" glass_desc = "An Irish car bomb." + value = 5 /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -1151,6 +1211,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "syndicatebomb" glass_name = "Syndicate Bomb" glass_desc = "A syndicate bomb." + value = 2 /datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/M) if(prob(5)) @@ -1168,6 +1229,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "erikasurprise" glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" + value = 4 /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" @@ -1181,6 +1243,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "driestmartiniglass" glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." + value = 5 /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" @@ -1194,6 +1257,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bananahonkglass" glass_name = "Banana Honk" glass_desc = "A drink from Clown Heaven." + value = 8 /datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/M) if((ishuman(M) && M.job == "Clown") || ismonkey(M)) @@ -1213,6 +1277,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "silencerglass" glass_name = "Silencer" glass_desc = "A drink from Mime Heaven." + value = 2 /datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -1231,6 +1296,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "drunkenblumpkin" glass_name = "Drunken Blumpkin" glass_desc = "A drink for the drunks." + value = 3 /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" @@ -1243,6 +1309,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskey_sour" glass_name = "whiskey sour" glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying." + value = 2 /datum/reagent/consumable/ethanol/hcider name = "Hard Cider" @@ -1256,7 +1323,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "hard cider" glass_desc = "Tastes like autumn... no wait, fall!" shot_glass_icon_state = "shotglassbrown" - + value = 3 /datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber! name = "Fetching Fizz" @@ -1270,7 +1337,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fetching_fizz" glass_name = "Fetching Fizz" glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - + value = 2 /datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M) for(var/obj/item/stack/ore/O in orange(3, M)) @@ -1290,6 +1357,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hearty_punch" glass_name = "Hearty Punch" glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." + value = 1 /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/M) if(M.health <= 0) @@ -1311,7 +1379,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown2" glass_name = "Bacchus' Blessing" glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - + value = 8 /datum/reagent/consumable/ethanol/atomicbomb @@ -1325,6 +1393,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "atomicbombglass" glass_name = "Atomic Bomb" glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." + value = 3.56 /datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/M) M.set_drugginess(50) @@ -1354,6 +1423,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gargleblasterglass" glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." + value = 5 /datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/M) M.dizziness +=1.5 @@ -1387,6 +1457,7 @@ All effects don't start immediately, but rather get worse over time; the rate is impure_chem = "neuroweak" inverse_chem_val = 0.5 //Clear conversion inverse_chem = "neuroweak" + value = 4 /datum/reagent/consumable/ethanol/neurotoxin/proc/pickt() return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) @@ -1428,6 +1499,7 @@ All effects don't start immediately, but rather get worse over time; the rate is description = "A mostly safe alcoholic drink for the true daredevils. Counteracts Neurotoxins." boozepwr = 60 pH = 8 + value = 3 /datum/reagent/consumable/ethanol/neuroweak/on_mob_life(mob/living/carbon/M) if(holder.has_reagent("neurotoxin")) @@ -1454,6 +1526,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hippiesdelightglass" glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." + value = 1.96 /datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/M) M.slurring = max(M.slurring,50) @@ -1498,6 +1571,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "nog3" glass_name = "eggnog" glass_desc = "The traditional way to get absolutely hammered at a Christmas party." + value = 4 /datum/reagent/consumable/ethanol/narsour @@ -1511,6 +1585,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "narsour" glass_name = "Nar'Sour" glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" + value = 6.66 /datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/M) M.cultslurring = min(M.cultslurring + 3, 3) @@ -1527,6 +1602,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "Triple Sec" glass_desc = "A glass of straight Triple Sec." + value = 1.5 /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" @@ -1538,6 +1614,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_green" glass_name = "Creme de Menthe" glass_desc = "You can almost feel the first breath of spring just looking at it." + value = 2 /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" @@ -1549,6 +1626,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "Creme de Cacao" glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." + value = 1 /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" @@ -1561,6 +1639,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quadruple_sec" glass_name = "Quadruple Sec" glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." + value = 3.04 /datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes. @@ -1580,6 +1659,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quintuple_sec" glass_name = "Quintuple Sec" glass_desc = "Now you are become law, destroyer of clowns." + value = 4.01 /datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_LAW_ENFORCEMENT_METABOLISM)) //Securidrink in line with the screwderiver for engineers or nothing for mimes but STRONG.. @@ -1602,6 +1682,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grasshopper" glass_name = "Grasshopper" glass_desc = "You weren't aware edible beverages could be that green." + value = 1 /datum/reagent/consumable/ethanol/stinger name = "Stinger" @@ -1614,6 +1695,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "stinger" glass_name = "Stinger" glass_desc = "You wonder what would happen if you pointed this at a heat source..." + value = 1 /datum/reagent/consumable/ethanol/bastion_bourbon name = "Bastion Bourbon" @@ -1629,6 +1711,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." shot_glass_icon_state = "shotglassgreen" pH = 4 + value = 8 /datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/L) var/heal_points = 10 @@ -1666,6 +1749,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Squirt Cider" glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." shot_glass_icon_state = "shotglassgreen" + value = 1 /datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/M) M.satiety += 5 //for context, vitamins give 30 satiety per tick @@ -1683,6 +1767,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fringe_weaver" glass_name = "Fringe Weaver" glass_desc = "It's a wonder it doesn't spill out of the glass." + value = 1 /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" @@ -1696,6 +1781,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sugar_rush" glass_name = "Sugar Rush" glass_desc = "If you can't mix a Sugar Rush, you can't tend bar." + value = 1 /datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/M) M.satiety -= 10 //junky as hell! a whole glass will keep you from being able to eat junk food @@ -1713,6 +1799,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "crevice_spike" glass_name = "Crevice Spike" glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." + value = 1 /datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/L) //damage only applies when drink first enters system and won't again until drink metabolizes out L.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 @@ -1727,6 +1814,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sakecup" glass_name = "cup of sake" glass_desc = "A traditional cup of sake." + value = 0.1 /datum/reagent/consumable/ethanol/peppermint_patty name = "Peppermint Patty" @@ -1739,6 +1827,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "peppermint_patty" glass_name = "Peppermint Patty" glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night." + value = 2 /datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) @@ -1756,6 +1845,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Alexander" glass_desc = "A creamy, indulgent delight that is stronger than it seems." var/obj/item/shield/mighty_shield + value = 1 /datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/L) if(ishuman(L)) @@ -1788,6 +1878,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sidecar" glass_name = "Sidecar" glass_desc = "The one ride you'll gladly give up the wheel for." + value = 1 /datum/reagent/consumable/ethanol/between_the_sheets name = "Between the Sheets" @@ -1800,6 +1891,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "between_the_sheets" glass_name = "Between the Sheets" glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." + value = 2 /datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/L) ..() @@ -1825,6 +1917,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "kamikaze" glass_name = "Kamikaze" glass_desc = "Divinely windy." + value = 1 /datum/reagent/consumable/ethanol/mojito name = "Mojito" @@ -1837,6 +1930,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mojito" glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." + value = 1 /datum/reagent/consumable/ethanol/fernet name = "Fernet" @@ -1846,7 +1940,8 @@ All effects don't start immediately, but rather get worse over time; the rate is boozepwr = 80 taste_description = "utter bitterness" glass_name = "glass of fernet" - glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum + glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." + value = 0.1 /datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) @@ -1866,6 +1961,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godlyblend" glass_name = "glass of fernet cola" glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." + value = 1 /datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/M) if(M.nutrition <= NUTRITION_LEVEL_STARVING) @@ -1886,6 +1982,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fanciulli" glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." + value = 1 /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/M) M.nutrition = max(M.nutrition - 5, 0) @@ -1910,7 +2007,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state= "minted_fernet" glass_name = "glass of branca menta" glass_desc = "A glass of Branca Menta, perfect for those lazy and hot sunday summer afternoons." //Get lazy literally by drinking this - + value = 1 /datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/M) M.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) @@ -1934,6 +2031,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blank_paper" glass_name = "glass of blank paper" glass_desc = "A fizzy cocktail for those looking to start fresh." + value = 1 /datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/M) if(ishuman(M) && M.job == "Mime") @@ -1951,6 +2049,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "champagne_glass" glass_name = "Champagne" glass_desc = "The flute clearly displays the slowly rising bubbles." + value = 1 /datum/reagent/consumable/ethanol/wizz_fizz name = "Wizz Fizz" @@ -1963,6 +2062,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "wizz_fizz" glass_name = "Wizz Fizz" glass_desc = "The glass bubbles and froths with an almost magical intensity." + value = 1 /datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/M) //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting @@ -1983,6 +2083,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bug_spray" glass_name = "Bug Spray" glass_desc = "Your eyes begin to water as the sting of alcohol reaches them." + value = 1 /datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/M) //Bugs should not drink Bug spray. @@ -2005,6 +2106,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "applejack_glass" glass_name = "Applejack" glass_desc = "You feel like you could drink this all neight." + value = 0.1 /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" @@ -2017,6 +2119,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "jack_rose" glass_name = "Jack Rose" glass_desc = "Enough of these, and you really will start to suppose your toeses are roses." + value = 1 /datum/reagent/consumable/ethanol/turbo name = "Turbo" @@ -2029,6 +2132,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "turbo" glass_name = "Turbo" glass_desc = "A turbulent cocktail for outlaw hoverbikers." + value = 0.3 /datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/M) if(prob(4)) @@ -2047,6 +2151,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "old_timer" glass_name = "Old Timer" glass_desc = "WARNING! May cause premature aging!" + value = 2 /datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/M) if(prob(20)) @@ -2080,6 +2185,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "rubberneck" glass_name = "Rubberneck" glass_desc = "A popular drink amongst those adhering to an all synthetic diet." + value = 1 /datum/reagent/consumable/ethanol/duplex name = "Duplex" @@ -2092,6 +2198,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "duplex" glass_name = "Duplex" glass_desc = "To imbibe one component separately from the other is consider a great faux pas." + value = 1 /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" @@ -2104,6 +2211,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "trappistglass" glass_name = "Trappist Beer" glass_desc = "boozy Catholicism in a glass." + value = 1 /datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/M) if(M.mind.isholy) @@ -2123,6 +2231,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Blazaam" glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." var/stored_teleports = 0 + value = 4 /datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/M) if(M.drunkenness > 40) @@ -2145,6 +2254,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "planet_cracker" glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." + value = 1 /datum/reagent/consumable/ethanol/commander_and_chief name = "Commander and Chief" @@ -2153,10 +2263,11 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#ffffc9" boozepwr = 50 quality = DRINK_FANTASTIC - taste_description = "Tastes like...duty and responsibility?" + taste_description = "duty and responsibility" glass_icon_state = "commander_and_chief" glass_name = "Commander and Chief" glass_desc = "The gems of this majestic chalice represent the departments and their Heads." + value = 10 /datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) @@ -2181,6 +2292,7 @@ All effects don't start immediately, but rather get worse over time; the rate is var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. pH = 4 + value = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) names = data["names"] diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 1afbed3533..7cecfc016d 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -92,6 +92,7 @@ description = "The sweet juice of an apple, fit for all ages." color = "#ECFF56" // rgb: 236, 255, 86 taste_description = "apples" + pH = 3.2 // ~ 2.7 -> 3.7 /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 15d517a0f5..4446b5c561 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,6 +1,7 @@ /datum/reagent/drug name = "Drug" id = "drug" + value = 12 metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "bitterness" var/trippy = TRUE //Does this drug make you trip? @@ -162,7 +163,7 @@ /datum/reagent/drug/methamphetamine name = "Methamphetamine" id = "methamphetamine" - description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." + description = "Reduces stun times by about 300%, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" overdose_threshold = 20 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 056c5b1901..547f610d11 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -12,6 +12,7 @@ id = "consumable" taste_description = "generic food" taste_mult = 4 + value = 0.1 var/nutriment_factor = 1 * REAGENTS_METABOLISM var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes @@ -91,6 +92,7 @@ name = "Vitamin" id = "vitamin" description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." + value = 0.5 brute_heal = 1 burn_heal = 1 @@ -106,6 +108,7 @@ description = "A variety of cooking oil derived from fat or plants. Used in food preparation and frying." color = "#EADD6B" //RGB: 234, 221, 107 (based off of canola oil) taste_mult = 0.8 + value = 1 taste_description = "oil" nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own metabolization_rate = 10 * REAGENTS_METABOLISM @@ -138,7 +141,7 @@ return TRUE /datum/reagent/consumable/cooking_oil/reaction_turf(turf/open/T, reac_volume) - if(!istype(T)) + if(!istype(T) || isgroundlessturf(T)) return if(reac_volume >= 5) T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume * 1.5 SECONDS) @@ -156,6 +159,7 @@ metabolization_rate = 2 * REAGENTS_METABOLISM overdose_threshold = 200 // Hyperglycaemic shock taste_description = "sweetness" + value = 1 /datum/reagent/consumable/sugar/overdose_start(mob/living/M) to_chat(M, "You go into hyperglycaemic shock! Lay off the twinkies!") @@ -237,6 +241,7 @@ description = "A special oil that noticably chills the body. Extracted from Icepeppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" + value = 2 pH = 13 //HMM! I wonder /datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M) @@ -438,6 +443,7 @@ /datum/reagent/consumable/sprinkles name = "Sprinkles" id = "sprinkles" + value = 3 description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." color = "#FF00FF" // rgb: 255, 0, 255 taste_description = "childhood whimsy" @@ -453,6 +459,7 @@ id = "peanut_butter" description = "A popular food paste made from ground dry-roasted peanuts." color = "#C29261" + value = 3 nutriment_factor = 15 * REAGENTS_METABOLISM taste_description = "peanuts" @@ -461,6 +468,7 @@ id = "cornoil" description = "An oil derived from various types of corn." nutriment_factor = 20 * REAGENTS_METABOLISM + value = 4 color = "#302000" // rgb: 48, 32, 0 taste_description = "slime" @@ -479,6 +487,7 @@ /datum/reagent/consumable/enzyme name = "Universal Enzyme" id = "enzyme" + value = 1 description = "A universal enzyme used in the preperation of certain chemicals and foods." color = "#365E30" // rgb: 54, 94, 48 taste_description = "sweetness" @@ -518,6 +527,7 @@ /datum/reagent/consumable/flour name = "Flour" id = "flour" + value = 0.5 description = "This is what you rub all over yourself to pretend to be a ghost." reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 @@ -535,6 +545,7 @@ id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 + value = 1 taste_description = "cherry" /datum/reagent/consumable/bluecherryjelly @@ -542,11 +553,13 @@ id = "bluecherryjelly" description = "Blue and tastier kind of cherry jelly." color = "#00F0FF" + value = 12 taste_description = "blue cherry" /datum/reagent/consumable/rice name = "Rice" id = "rice" + value = 0.5 description = "tiny nutritious grains" reagent_state = SOLID nutriment_factor = 3 * REAGENTS_METABOLISM @@ -556,6 +569,7 @@ /datum/reagent/consumable/vanilla name = "Vanilla Powder" id = "vanilla" + value = 1 description = "A fatty, bitter paste made from vanilla pods." reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM @@ -565,6 +579,7 @@ /datum/reagent/consumable/eggyolk name = "Egg Yolk" id = "eggyolk" + value = 1 description = "It's full of protein." nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFB500" @@ -573,6 +588,7 @@ /datum/reagent/consumable/corn_starch name = "Corn Starch" id = "corn_starch" + value = 2 description = "A slippery solution." color = "#f7f6e4" taste_description = "slime" @@ -580,6 +596,7 @@ /datum/reagent/consumable/corn_syrup name = "Corn Syrup" id = "corn_syrup" + value = 1 description = "Decays into sugar." color = "#fff882" metabolization_rate = 3 * REAGENTS_METABOLISM @@ -594,6 +611,7 @@ id = "honey" description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" + value = 15 nutriment_factor = 15 * REAGENTS_METABOLISM metabolization_rate = 1 * REAGENTS_METABOLISM taste_description = "sweetness" @@ -608,18 +626,19 @@ ..() /datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume) - if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) - var/mob/living/carbon/C = M - for(var/s in C.surgeries) - var/datum/surgery/S = s - S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% - ..() + if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH))) + var/mob/living/carbon/C = M + for(var/s in C.surgeries) + var/datum/surgery/S = s + S.success_multiplier = max(0.6, S.success_multiplier) // +60% success probability on each step, compared to bacchus' blessing's ~46% + ..() /datum/reagent/consumable/mayonnaise name = "Mayonnaise" id = "mayonnaise" description = "An white and oily mixture of mixed egg yolks." color = "#DFDFDF" + value = 5 taste_description = "mayonnaise" /datum/reagent/consumable/tearjuice @@ -748,6 +767,7 @@ taste_mult = 8 taste_description = "sweetness" overdose_threshold = 17 + value = 0.2 /datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M) if(M.disgust < 80) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm index c96347cda2..4489088adc 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents.dm @@ -3,7 +3,7 @@ //Invert = Whole conversion /datum/reagent/impure - chemical_flags = REAGENT_INVISIBLE | REAGENT_SNEAKYNAME //by default, it will stay hidden on splitting, but take the name of the source on inverting + chemical_flags = REAGENT_INVISIBLE | REAGENT_SNEAKYNAME //by default, it will stay hidden on splitting, but take the name of the source on inverting /datum/reagent/impure/fermiTox diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 592f7bc592..c4decc081d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -8,6 +8,7 @@ /datum/reagent/medicine name = "Medicine" id = "medicine" + value = 2 taste_description = "bitterness" /datum/reagent/medicine/on_mob_life(mob/living/carbon/M) @@ -127,6 +128,7 @@ description = "Instantly restores all hearing to the patient, but does not cure deafness." color = "#6600FF" // rgb: 100, 165, 255 pH = 2 + value = 10 /datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M) M.restoreEars() @@ -209,6 +211,7 @@ overdose_threshold = 30 taste_description = "fish" pH = 12.2 + value = 20 /datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M) M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. @@ -242,6 +245,7 @@ color = "#ffeac9" metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 + value = 3 /datum/reagent/medicine/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -280,6 +284,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 25 pH = 10.7 + value = 4 /datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M) if(M.getFireLoss() > 25) @@ -304,6 +309,7 @@ pH = 6.7 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 50 + value = 3 /datum/reagent/medicine/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1) if(iscarbon(M) && M.stat != DEAD) @@ -346,6 +352,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active pH = 5.5 + value = 1 /datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) if(last_added) @@ -426,6 +433,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) pH = 11.5 metabolization_rate = 5 * REAGENTS_METABOLISM overdose_threshold = 40 + value = 6 /datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1) if(iscarbon(M)) @@ -458,6 +466,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.5 * REAGENTS_METABOLISM taste_description = "ash" pH = 5 + value = 1 /datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-2*REM, 0) @@ -476,6 +485,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 pH = 2 + value = 5 /datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M) M.adjustToxLoss(-0.5*REM, 0) @@ -629,7 +639,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) /datum/reagent/medicine/ephedrine name = "Ephedrine" id = "ephedrine" - description = "Increases stun resistance and movement speed. Overdose deals toxin damage and inhibits breathing." + description = "Increases stun resistance. Overdose deals toxin damage and inhibits breathing." reagent_state = LIQUID color = "#D2FFFA" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -1192,19 +1202,19 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M) pH = 11.8 /datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M) - M.adjustBruteLoss(-1.5*REM, 0) - M.adjustFireLoss(-1.5*REM, 0) - M.adjustOxyLoss(-1.5*REM, 0) - M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs - . = 1 - ..() + M.adjustBruteLoss(-1.5*REM, 0) + M.adjustFireLoss(-1.5*REM, 0) + M.adjustOxyLoss(-1.5*REM, 0) + M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs + . = 1 + ..() /datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M) - M.adjustOxyLoss(2.6*REM, 0) - M.adjustBruteLoss(3.5*REM, 0) - M.adjustFireLoss(3.5*REM, 0) - ..() - . = 1 + M.adjustOxyLoss(2.6*REM, 0) + M.adjustBruteLoss(3.5*REM, 0) + M.adjustFireLoss(3.5*REM, 0) + ..() + . = 1 /datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants name = "Earthsblood" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index af6a65ebe1..30d432ce55 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2,6 +2,7 @@ data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"= null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) name = "Blood" id = "blood" + value = 1 color = BLOOD_COLOR_HUMAN // rgb: 200, 0, 0 description = "Blood from some creature." metabolization_rate = 5 //fast rate so it disappears fast. @@ -68,7 +69,7 @@ color = bloodtype_to_color(data["blood_type"]) if(data["blood_type"] == "SY") name = "Synthetic Blood" - taste_description = "oily" + taste_description = "oil" if(data["blood_type"] == "X*") name = "Xenomorph Blood" @@ -83,12 +84,12 @@ if(data["blood_type"] == "BUG") name = "Insect Blood" - taste_description = "greasy" + taste_description = "grease" pH = 7.25 if(data["blood_type"] == "L") name = "Lizard Blood" - taste_description = "spicy" + taste_description = "something spicy" pH = 6.85 @@ -503,12 +504,19 @@ description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." color = "#009CA8" // rgb: 0, 156, 168 taste_description = "cherry" // by popular demand + var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs. /datum/reagent/lube/reaction_turf(turf/open/T, reac_volume) if (!istype(T)) return if(reac_volume >= 1) - T.MakeSlippery(TURF_WET_LUBE, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + T.MakeSlippery(lube_kind, 15 SECONDS, min(reac_volume * 2 SECONDS, 120)) + +///Stronger kind of lube. Applies TURF_WET_SUPERLUBE. +/datum/reagent/lube/superlube + name = "Super Duper Lube" + description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]." + lube_kind = TURF_WET_SUPERLUBE /datum/reagent/spraytan name = "Spray Tan" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 90cb732a1f..c170858d98 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -19,6 +19,7 @@ /datum/reagent/nitroglycerin name = "Nitroglycerin" id = "nitroglycerin" + value = 5 description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." color = "#808080" // rgb: 128, 128, 128 taste_description = "oil" @@ -29,6 +30,7 @@ description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID color = "#FFFF00" + value = 3 taste_description = "metal" /datum/reagent/clf3 @@ -89,6 +91,7 @@ description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#210021" + value = 10 taste_description = "compressed bitterness" /datum/reagent/blackpowder @@ -97,6 +100,7 @@ description = "Explodes. Violently." reagent_state = LIQUID color = "#000000" + value = 5 metabolization_rate = 0.05 taste_description = "salt" @@ -164,6 +168,7 @@ description = "Very flammable." reagent_state = LIQUID color = "#FA00AF" + value = 1 taste_description = "burning" /datum/reagent/napalm/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 424d7b9ed0..b3f9ef8202 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -223,6 +223,15 @@ /obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays return +///Subtype used for the lavaland clown ruin. +/obj/item/reagent_containers/spray/waterflower/superlube + name = "clown flower" + desc = "A delightly devilish flower... you got a feeling where this is going." + icon = 'icons/obj/chemical.dmi' + icon_state = "clownflower" + volume = 30 + list_reagents = list(/datum/reagent/lube/superlube = 30) + /obj/item/reagent_containers/spray/waterflower/cyborg reagent_flags = NONE volume = 100 diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 216ecd9654..c44ffa4373 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -226,11 +226,13 @@ desc = "A keg of aphrodisiac." icon_state = "pinkkeg" reagent_id = "aphro" + tank_volume = 150 /obj/structure/reagent_dispensers/keg/aphro/strong name = "keg of strong aphrodisiac" desc = "A keg of strong and addictive aphrodisiac." reagent_id = "aphro+" + tank_volume = 120 /obj/structure/reagent_dispensers/keg/milk name = "keg of milk" @@ -248,4 +250,5 @@ name = "keg of pan galactic gargleblaster" desc = "A keg of... wow that's a long name." icon_state = "bluekeg" - reagent_id = "gargleblaster" \ No newline at end of file + reagent_id = "gargleblaster" + tank_volume = 100 \ No newline at end of file diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 944e964f1e..0dc716d429 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -354,6 +354,12 @@ . = TRUE ui.soft_update_fields() +/obj/machinery/disposal/bin/alt_attack_hand(mob/user) + if(can_interact(usr)) + flush = !flush + update_icon() + return TRUE + return FALSE /obj/machinery/disposal/bin/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE, datum/thrownthing/throwingdatum) if(isitem(AM) && AM.CanEnterDisposals()) diff --git a/code/modules/recycling/disposal/multiz.dm b/code/modules/recycling/disposal/multiz.dm new file mode 100644 index 0000000000..3dcab94ca5 --- /dev/null +++ b/code/modules/recycling/disposal/multiz.dm @@ -0,0 +1,49 @@ +#define MULTIZ_PIPE_UP 1 ///Defines for determining which way a multiz disposal element should travel +#define MULTIZ_PIPE_DOWN 2 ///Defines for determining which way a multiz disposal element should travel + + +/obj/structure/disposalpipe/trunk/multiz + name = "Disposal trunk that goes up" + icon_state = "pipe-up" + var/multiz_dir = MULTIZ_PIPE_UP ///Set the multiz direction of your trunk. 1 = up, 2 = down + +/obj/structure/disposalpipe/trunk/multiz/down + name = "Disposal trunk that goes down" + icon_state = "pipe-down" + multiz_dir = MULTIZ_PIPE_DOWN + +/obj/structure/disposalpipe/trunk/multiz/transfer(obj/structure/disposalholder/H) + if(H.dir == DOWN) //Since we're a trunk, you can still place a chute / bin over us. If theyve entered from there, treat this as a normal trunk + return ..() + // otherwise, go to the linked object + if(multiz_dir) //Are we a trunk that goes up? Or down? + var/turf/T = null + if(multiz_dir == MULTIZ_PIPE_UP) + T = SSmapping.get_turf_above(get_turf(src)) //Get the turf above us + if(multiz_dir == MULTIZ_PIPE_DOWN) + T = SSmapping.get_turf_below(get_turf(src)) + if(!T) + expel(H) + return //Nothing located. + var/obj/structure/disposalpipe/trunk/multiz/pipe = locate(/obj/structure/disposalpipe/trunk/multiz) in T + if(pipe) + var/obj/structure/disposalholder/destination = new(pipe) //For future reference, the disposal holder is the thing that carries mobs + destination.init(pipe) //This instantiates it + destination.merge(H) //This takes the contents of H (Our disposal holder that's travelling into us) and puts them into the destination holder + destination.active = TRUE //Active allows it to process and move + destination.setDir(DOWN) //This tells the trunk above us NOT to loop it back down to us, or else you get an infinite loop + destination.move() + return null //Which removes the disposalholder + else + var/obj/structure/disposaloutlet/O = linked + if(istype(O)) + O.expel(H) // expel at outlet + else + var/obj/machinery/disposal/D = linked + D.expel(H) // expel at disposal + + // Returning null without expelling holder makes the holder expell itself + return null + +#undef MULTIZ_PIPE_UP +#undef MULTIZ_PIPE_DOWN \ No newline at end of file diff --git a/code/modules/research/designs/autobotter_designs.dm b/code/modules/research/designs/autobotter_designs.dm new file mode 100644 index 0000000000..7b56beaf77 --- /dev/null +++ b/code/modules/research/designs/autobotter_designs.dm @@ -0,0 +1,335 @@ +/////////////////////////////////// +//////////AutoBottler Designs////// +/////////////////////////////////// + +/datum/design/board/autobottler + name = "Machine Design (AutoBottler)" + desc = "Allows for the construction of circuit boards used to build an Autobottler." + id = "autobottler" + materials = list(MAT_GLASS = 2000) + build_path = /obj/item/circuitboard/machine/autobottler + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE + +/datum/design/bottle + materials = list(MAT_GLASS = 1200) + build_type = AUTOBOTTLER + category = list("Storge") + +/datum/design/bottle/wine + name = "Bottle Design (Wine)" + desc = "Allows for the blowing of Wine bottles." + id = "wine" + build_path = /obj/item/reagent_containers/food/drinks/bottle/wine/empty + +/datum/design/bottle/rum + name = "Bottle Design (Rum)" + desc = "Allows for the blowing of Rum bottles." + id = "rum" + build_path = /obj/item/reagent_containers/food/drinks/bottle/rum/empty + +/datum/design/bottle/gin + name = "Bottle Design (Gin)" + desc = "Allows for the blowing of Gin bottles." + id = "gin" + build_path = /obj/item/reagent_containers/food/drinks/bottle/gin/empty + +/datum/design/bottle/whiskey + name = "Bottle Design (Whiskey)" + desc = "Allows for the blowing of Whiskey bottles." + id = "whiskey" + build_path = /obj/item/reagent_containers/food/drinks/bottle/whiskey/empty + +/datum/design/bottle/vodka + name = "Bottle Design (Vodka)" + desc = "Allows for the blowing of Vodka bottles." + id = "vodka" + build_path = /obj/item/reagent_containers/food/drinks/bottle/vodka/empty + +/datum/design/bottle/tequila + name = "Bottle Design (Tequila)" + desc = "Allows for the blowing of Tequila bottles." + id = "tequila" + build_path = /obj/item/reagent_containers/food/drinks/bottle/tequila/empty + +/datum/design/bottle/patron + name = "Bottle Design (Patron)" + desc = "Allows for the blowing of Patron bottles." + id = "patron" + build_path = /obj/item/reagent_containers/food/drinks/bottle/patron/empty + +/datum/design/bottle/kahlua + name = "Bottle Design (Kahlua)" + desc = "Allows for the blowing of Kahlua bottles." + id = "kahlua" + build_path = /obj/item/reagent_containers/food/drinks/bottle/kahlua/empty + +/datum/design/bottle/sake + name = "Bottle Design (Sake)" + desc = "Allows for the blowing of Sake bottles." + id = "sake" + build_path = /obj/item/reagent_containers/food/drinks/bottle/sake/empty + +/datum/design/bottle/vermouth + name = "Bottle Design (Vermouth)" + desc = "Allows for the blowing of Vermouth bottles." + id = "vermouth" + build_path = /obj/item/reagent_containers/food/drinks/bottle/vermouth/empty + +/datum/design/bottle/goldschlager + name = "Bottle Design (Goldschlager)" + desc = "Allows for the blowing of Goldschlager bottles." + id = "goldschlager" + build_path = /obj/item/reagent_containers/food/drinks/bottle/goldschlager/empty + +/datum/design/bottle/hcider + name = "Bottle Design (Cider)" + desc = "Allows for the blowing of Cider bottles." + id = "hcider" + build_path = /obj/item/reagent_containers/food/drinks/bottle/hcider/empty + +/datum/design/bottle/cognac + name = "Bottle Design (Cognac)" + desc = "Allows for the blowing of Cognac bottles." + id = "cognac" + build_path = /obj/item/reagent_containers/food/drinks/bottle/cognac/empty + +/datum/design/bottle/absinthe + name = "Bottle Design (Absinthe)" + desc = "Allows for the blowing of Absinthe bottles." + id = "absinthe" + build_path = /obj/item/reagent_containers/food/drinks/bottle/absinthe/empty + +/datum/design/bottle/grappa + name = "Bottle Design (Grappa)" + desc = "Allows for the blowing of Grappa bottles." + id = "grappa" + build_path = /obj/item/reagent_containers/food/drinks/bottle/grappa/empty + +/datum/design/bottle/fernet + name = "Bottle Design (Fernet)" + desc = "Allows for the blowing of Fernet bottles." + id = "fernet" + build_path = /obj/item/reagent_containers/food/drinks/bottle/fernet/empty + +/datum/design/bottle/applejack + name = "Bottle Design (Applejack)" + desc = "Allows for the blowing of Applejack bottles." + id = "applejack" + build_path = /obj/item/reagent_containers/food/drinks/bottle/applejack/empty + +/datum/design/bottle/champagne + name = "Bottle Design (Champagne)" + desc = "Allows for the blowing of Champagne bottles." + id = "champagne" + build_path = /obj/item/reagent_containers/food/drinks/bottle/champagne/empty + +/datum/design/bottle/blazaam + name = "Bottle Design (Blazaam)" + desc = "Allows for the blowing of Blazaam bottles." + id = "blazaam" + build_path = /obj/item/reagent_containers/food/drinks/bottle/blazaam/empty + +/datum/design/bottle/trappist + name = "Bottle Design (Trappist)" + desc = "Allows for the blowing of Trappist bottles." + id = "trappist" + build_path = /obj/item/reagent_containers/food/drinks/bottle/trappist/empty + +/datum/design/bottle/grenadine + name = "Bottle Design (Grenadine)" + desc = "Allows for the blowing of Grenadine bottles." + id = "grenadine" + build_path = /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty + +/datum/design/bottle/export + materials = list(MAT_GLASS = 1200) + build_type = AUTOBOTTLER + category = list("Brands") + +/datum/design/bottle/export/wine + name = "Export Design (Wine)" + desc = "Allows for the blowing, and bottling of Wine bottles." + id = "wine_export" + reagents_list = list("wine" = 100) + build_path = /obj/item/export/bottle/wine + +/datum/design/bottle/export/rum + name = "Export Design (Rum)" + desc = "Allows for the blowing, and bottling of Rum bottles." + id = "rum_export" + reagents_list = list("rum" = 100) + build_path = /obj/item/export/bottle/rum + +/datum/design/bottle/export/gin + name = "Export Design (Gin)" + desc = "Allows for the blowing, and bottling of Gin bottles." + id = "gin_export" + reagents_list = list("gin" = 100) + build_path = /obj/item/export/bottle/gin + +/datum/design/bottle/export/whiskey + name = "Export Design (Whiskey)" + desc = "Allows for the blowing, and bottling of Whiskey bottles." + id = "whiskey_export" + reagents_list = list("whiskey" = 100) + build_path = /obj/item/export/bottle/whiskey + +/datum/design/bottle/export/vodka + name = "Export Design (Vodka)" + desc = "Allows for the blowing, and bottling of 99% Vodka bottles." + id = "vodka_export" + reagents_list = list("vodka" = 99, "water" = 1) + build_path = /obj/item/export/bottle/vodka + +/datum/design/bottle/export/tequila + name = "Export Design (Tequila)" + desc = "Allows for the blowing, and bottling of Tequila bottles." + id = "tequila_export" + reagents_list = list("tequila" = 80, "lemon_juice" = 20) + build_path = /obj/item/export/bottle/tequila + +/datum/design/bottle/export/patron + name = "Export Design (Patron)" + desc = "Allows for the blowing, and bottling of Patron bottles." + id = "patron_export" + reagents_list = list("patron" = 100) + build_path = /obj/item/export/bottle/patron + +/datum/design/bottle/export/kahlua + name = "Export Design (Kahlua)" + desc = "Allows for the blowing, and bottling of Kahlua bottles." + id = "kahlua_export" + reagents_list = list("kahlua" = 100) + build_path = /obj/item/export/bottle/kahlua + +/datum/design/bottle/export/sake + name = "Export Design (Sake)" + desc = "Allows for the blowing, and bottling of Sake bottles." + id = "sake_export" + reagents_list = list("sake" = 80, "rice" = 10, "sugar" = 10) + build_path = /obj/item/export/bottle/sake + +/datum/design/bottle/export/vermouth + name = "Export Design (Vermouth)" + desc = "Allows for the blowing, and bottling of Vermouth bottles." + id = "vermouth_export" + reagents_list = list("vermouth" = 100) + build_path = /obj/item/export/bottle/vermouth + +/datum/design/bottle/export/goldschlager + name = "Export Design (Goldschlager)" + desc = "Allows for the blowing, and bottling of Goldschlager bottles." + id = "goldschlager_export" + reagents_list = list("goldschlager" = 100) + build_path = /obj/item/export/bottle/goldschlager + +/datum/design/bottle/export/hcider + name = "Export Design (Cider)" + desc = "Allows for the blowing, and bottling of Cider bottles." + id = "hcider_export" + reagents_list = list("hcider" = 30, "water" = 20) + build_path = /obj/item/export/bottle/hcider + +/datum/design/bottle/export/cognac + name = "Export Design (Cognac)" + desc = "Allows for the blowing, and bottling of Cognac bottles." + id = "cognac_export" + reagents_list = list("cognac" = 100) + build_path = /obj/item/export/bottle/cognac + +/datum/design/bottle/export/absinthe + name = "Export Design (Absinthe)" + desc = "Allows for the blowing, and bottling of Absinthe bottles." + reagents_list = list("absinthe" = 100) + id = "absinthe_export" + build_path = /obj/item/export/bottle/absinthe + +/datum/design/bottle/export/grappa + name = "Export Design (Grappa)" + desc = "Allows for the blowing, and bottling of Grappa bottles." + id = "grappa_export" + reagents_list = list("grappa" = 100) + build_path = /obj/item/export/bottle/grappa + +/datum/design/bottle/export/fernet + name = "Export Design (Fernet)" + desc = "Allows for the blowing, and bottling of Fernet bottles." + id = "fernet_export" + reagents_list = list("fernet" = 100) + build_path = /obj/item/export/bottle/fernet + +/datum/design/bottle/export/applejack + name = "Export Design (Applejack)" + desc = "Allows for the blowing, and bottling of Applejack bottles." + id = "applejack_export" + reagents_list = list("applejack" = 50, "gin" = 10) + build_path = /obj/item/export/bottle/applejack + +/datum/design/bottle/export/champagne + name = "Export Design (Champagne)" + desc = "Allows for the blowing, and bottling of Champagne bottles." + id = "champagne_export" + reagents_list = list("champagne" = 90, "co2" = 10) + build_path = /obj/item/export/bottle/champagne + +/datum/design/bottle/export/blazaam + name = "Export Design (Blazaam)" + desc = "Allows for the blowing, and bottling of Blazaam bottles." + id = "blazaam_export" + reagents_list = list("blazaam" = 80, "holywater" = 20) + build_path = /obj/item/export/bottle/blazaam + +/datum/design/bottle/export/trappist + name = "Export Design (Trappist)" + desc = "Allows for the blowing, and bottling of Trappist bottles." + id = "trappist_export" + reagents_list = list("trappist" = 100) + build_path = /obj/item/export/bottle/trappist + +/datum/design/bottle/export/grenadine + name = "Export Design (Grenadine)" + desc = "Allows for the blowing, and bottling of Grenadine bottles." + id = "grenadine_export" + reagents_list = list("grenadine" = 100) + build_path = /obj/item/export/bottle/grenadine + +/datum/design/bottle/export/minikeg + name = "Export Design (Minikeg)" + desc = "Allows for the fabication, and bottling of Minikeg of craft beer." + id = "minikeg" + category = list("Beers") + reagents_list = list("light_beer" = 100) + build_path = /obj/item/export/bottle/minikeg + +/datum/design/bottle/export/blooddrop + name = "Export Design (Blooddrop)" + desc = "Allows for the blowing, and bottling of Blooddrop bottles." + id = "blooddrop" + category = list("Wines") + reagents_list = list("champagne" = 30, "co2" = 30, "wine" = 10, "grape_juice" = 30) + build_path = /obj/item/export/bottle/blooddrop + +/datum/design/bottle/export/slim_gold + name = "Export Design (Slim Gold)" + desc = "Allows for the blowing, and bottling of Slim Gold bottles." + id = "slim_gold" + category = list("Beers") + reagents_list = list("gold" = 10, "co2" = 10, "rum" = 30, "beer" = 40) + build_path = /obj/item/export/bottle/slim_gold + +/datum/design/bottle/export/white_bloodmoon + name = "Export Design (White Bloodmoon)" + desc = "Allows for the blowing, and bottling of White Bloodmoon bottles." + id = "white_bloodmoon" + category = list("Wines") + reagents_list = list("synthflesh" = 50, "blood" = 50, "gib" = 10) + build_path = /obj/item/export/bottle/white_bloodmoon + +/datum/design/bottle/export/greenroad + name = "Export Design (Greenroad)" + desc = "Allows for the blowing, and bottling of Greenroad bottles." + id = "greenroad" + reagents_list = list("vitfro" = 50, "rum" = 50, "ash" = 10) + category = list("Beers") + build_path = /obj/item/export/bottle/greenroad \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index d69dda37ca..fde795d87c 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -17,6 +17,36 @@ id = "sec_38lethal" build_path = /obj/item/ammo_box/c38/lethal +/datum/design/c38_trac + name = "Speed Loader (.38 TRAC)" + desc = "Designed to quickly reload revolvers. TRAC bullets embed a tracking implant within the target's body." + id = "c38_trac" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_SILVER = 5000, MAT_GOLD = 1000) + build_path = /obj/item/ammo_box/c38/trac + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/c38_hotshot + name = "Speed Loader (.38 Hot Shot)" + desc = "Designed to quickly reload revolvers. Hot Shot bullets contain an incendiary payload." + id = "c38_hotshot" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000) + build_path = /obj/item/ammo_box/c38/hotshot + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/c38_iceblox + name = "Speed Loader (.38 Iceblox)" + desc = "Designed to quickly reload revolvers. Iceblox bullets contain a cryogenic payload." + id = "c38_iceblox" + build_type = PROTOLATHE + materials = list(MAT_METAL = 20000, MAT_PLASMA = 5000) + build_path = /obj/item/ammo_box/c38/iceblox + category = list("Ammo") + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + ////////////// //WT550 Mags// ////////////// diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index 1e554f112f..38c17080d4 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -376,3 +376,7 @@ /datum/techweb/specialized/autounlocking/autoylathe design_autounlock_buildtypes = AUTOYLATHE allowed_buildtypes = AUTOYLATHE + +/datum/techweb/specialized/autounlocking/autobottler + design_autounlock_buildtypes = AUTOBOTTLER + allowed_buildtypes = AUTOBOTTLER \ No newline at end of file diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index fdf887d259..5f286c4237 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -43,7 +43,6 @@ description = "Various tools fit for basic mech units" design_ids = list("mech_drill", "mech_mscanner", "mech_extinguisher", "mech_cable_layer") - /datum/techweb_node/surplus_lims id = "surplus_lims" display_name = "Basic Prosthetics" @@ -51,8 +50,20 @@ starting_node = TRUE prereq_ids = list("biotech") design_ids = list("basic_l_arm", "basic_r_arm", "basic_r_leg", "basic_l_leg") - export_price = 5000 +/datum/techweb_node/blueprinted_bottles + id = "blueprinted_bottles" + display_name = "License Bottling" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin", "wine", "whiskey", "vodka", "tequila", "patron", "rum", "kahlua", "vermouth", "goldschlager", "hcider", "cognac", "absinthe", "grappa", "sake", "fernet", "applejack", "champagne", "blazaam", "trappist", "grenadine", "autobottler") + +/datum/techweb_node/blueprinted_exports + id = "blueprinted_exports" + display_name = "License Exports" + description = "Some Branded bottles to print and export." + starting_node = TRUE + design_ids = list("gin_export", "wine_export", "whiskey_export", "vodka_export", "tequila_export", "patron_export", "rum_export", "kahlua_export", "vermouth_export", "goldschlager_export", "hcider_export", "cognac_export", "absinthe_export", "grappa_export", "sake_export", "fernet_export", "applejack_export", "champagne_export", "blazaam_export", "trappist_export", "grenadine_export") /////////////////////////Biotech///////////////////////// /datum/techweb_node/biotech @@ -82,6 +93,14 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 +/datum/techweb_node/bottle_exports + id = "bottle_exports" + display_name = "Legal Bottling" + prereq_ids = list("blueprinted_bottles") + description = "New bottles for printing and selling." + design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) + /datum/techweb_node/advance_lims id = "advance_lims" display_name = "Upgraded Prosthetics" @@ -517,7 +536,7 @@ display_name = "Subdermal Implants" description = "Electronic implants buried beneath the skin." prereq_ids = list("biotech", "datatheory") - design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator") + design_ids = list("implanter", "implantcase", "implant_chem", "implant_tracking", "locator", "c38_trac") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -694,12 +713,12 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2750) export_price = 5000 -/datum/techweb_node/tech_shell - id = "tech_shell" - display_name = "Technological Shells" - description = "They're more technological than regular shot." +/datum/techweb_node/exotic_ammo + id = "exotic_ammo" + display_name = "Exotic Ammunition" + description = "They won't know what hit em." prereq_ids = list("weaponry", "ballistic_weapons") - design_ids = list("techshotshell") + design_ids = list("techshotshell", "c38_hotshot", "c38_iceblox") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) export_price = 5000 diff --git a/modular_citadel/code/modules/mining/mining_ruins.dm b/code/modules/ruins/lavalandruin_code/alien_nest.dm similarity index 61% rename from modular_citadel/code/modules/mining/mining_ruins.dm rename to code/modules/ruins/lavalandruin_code/alien_nest.dm index 66b6fd0482..ca33324a90 100644 --- a/modular_citadel/code/modules/mining/mining_ruins.dm +++ b/code/modules/ruins/lavalandruin_code/alien_nest.dm @@ -1,10 +1,3 @@ -/datum/map_template/ruin/lavaland/alien_nest - name = "Alien Nest" - id = "alien-nest" - description = "Not even Necropolis is safe from alien infestation. The competition for hosts has locked the legion and aliens in an endless conflict that can only be resolved by a PKA." - suffix = "lavaland_surface_alien_nest.dmm" - cost = 20 - //Aliens for the alien nest space ruin. /obj/effect/mob_spawn/alien/corpse/humanoid/drone mob_type = /mob/living/carbon/alien/humanoid/drone @@ -23,4 +16,4 @@ desc = "A syringe filled with a strange viscous liquid. It might be best to leave it alone." amount_per_transfer_from_this = 1 volume = 1 - list_reagents = list("xenomicrobes" = 1) \ No newline at end of file + list_reagents = list("xenomicrobes" = 1) diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 0d4d2b6ad6..cd641adb33 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -2,194 +2,194 @@ GLOBAL_VAR_INIT(hhStorageTurf, null) GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) /obj/item/hilbertshotel - name = "Hilbert's Hotel" - desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." - icon_state = "hilbertshotel" - w_class = WEIGHT_CLASS_SMALL - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/map_template/hilbertshotel/hotelRoomTemp - var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty - var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore - var/list/activeRooms = list() - var/list/storedRooms = list() - var/storageTurf - //Lore Stuff - var/ruinSpawned = FALSE - var/mysteryRoom + name = "Hilbert's Hotel" + desc = "A sphere of what appears to be an intricate network of bluespace. Observing it in detail seems to give you a headache as you try to comprehend the infinite amount of infinitesimally distinct points on its surface." + icon_state = "hilbertshotel" + w_class = WEIGHT_CLASS_SMALL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + var/datum/map_template/hilbertshotel/hotelRoomTemp + var/datum/map_template/hilbertshotel/empty/hotelRoomTempEmpty + var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore + var/list/activeRooms = list() + var/list/storedRooms = list() + var/storageTurf + //Lore Stuff + var/ruinSpawned = FALSE + var/mysteryRoom /obj/item/hilbertshotel/Initialize() - . = ..() - //Load templates - hotelRoomTemp = new() - hotelRoomTempEmpty = new() - hotelRoomTempLore = new() - var/area/currentArea = get_area(src) - if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility) - ruinSpawned = TRUE + . = ..() + //Load templates + hotelRoomTemp = new() + hotelRoomTempEmpty = new() + hotelRoomTempLore = new() + var/area/currentArea = get_area(src) + if(currentArea.type == /area/ruin/space/has_grav/hilbertresearchfacility) + ruinSpawned = TRUE /obj/item/hilbertshotel/Destroy() - ejectRooms() - return ..() + ejectRooms() + return ..() /obj/item/hilbertshotel/attack(mob/living/M, mob/living/user) - if(M.mind) - to_chat(user, "You invite [M] to the hotel.") - promptAndCheckIn(M) - else - to_chat(user, "[M] is not intelligent enough to understand how to use this device!") + if(M.mind) + to_chat(user, "You invite [M] to the hotel.") + promptAndCheckIn(M) + else + to_chat(user, "[M] is not intelligent enough to understand how to use this device!") /obj/item/hilbertshotel/attack_self(mob/user) - . = ..() - promptAndCheckIn(user) + . = ..() + promptAndCheckIn(user) /obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) - var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num - if(!chosenRoomNumber) - return - if(chosenRoomNumber > SHORT_REAL_LIMIT) - to_chat(user, "You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!") - return - if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) - to_chat(user, "That is not a valid room number!") - return - if(ismob(loc)) - if(user == loc) //Not always the same as user - forceMove(get_turf(user)) - if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize - if(!GLOB.hhStorageTurf) - var/datum/map_template/hilbertshotelstorage/storageTemp = new() - var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) - storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) - GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) - else - storageTurf = GLOB.hhStorageTurf - if(tryActiveRoom(chosenRoomNumber, user)) - return - if(tryStoredRoom(chosenRoomNumber, user)) - return - sendToNewRoom(chosenRoomNumber, user) + var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + if(!chosenRoomNumber) + return + if(chosenRoomNumber > SHORT_REAL_LIMIT) + to_chat(user, "You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!") + return + if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber))) + to_chat(user, "That is not a valid room number!") + return + if(ismob(loc)) + if(user == loc) //Not always the same as user + forceMove(get_turf(user)) + if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize + if(!GLOB.hhStorageTurf) + var/datum/map_template/hilbertshotelstorage/storageTemp = new() + var/datum/turf_reservation/storageReservation = SSmapping.RequestBlockReservation(3, 3) + storageTemp.load(locate(storageReservation.bottom_left_coords[1], storageReservation.bottom_left_coords[2], storageReservation.bottom_left_coords[3])) + GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3]) + else + storageTurf = GLOB.hhStorageTurf + if(tryActiveRoom(chosenRoomNumber, user)) + return + if(tryStoredRoom(chosenRoomNumber, user)) + return + sendToNewRoom(chosenRoomNumber, user) /obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user) - if(activeRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] - do_sparks(3, FALSE, get_turf(user)) - user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) - return TRUE - else - return FALSE + if(activeRooms["[roomNumber]"]) + var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"] + do_sparks(3, FALSE, get_turf(user)) + user.forceMove(locate(roomReservation.bottom_left_coords[1] + hotelRoomTemp.landingZoneRelativeX, roomReservation.bottom_left_coords[2] + hotelRoomTemp.landingZoneRelativeY, roomReservation.bottom_left_coords[3])) + return TRUE + else + return FALSE /obj/item/hilbertshotel/proc/tryStoredRoom(var/roomNumber, var/mob/user) - if(storedRooms["[roomNumber]"]) - var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height) - hotelRoomTempEmpty.load(locate(roomReservation.bottom_left_coords[1], roomReservation.bottom_left_coords[2], roomReservation.bottom_left_coords[3])) - var/turfNumber = 1 - for(var/i=0, iAs the sphere breaks apart, you're suddenly ejected into the depths of space!") - var/max = world.maxx-TRANSITIONEDGE - var/min = 1+TRANSITIONEDGE - var/list/possible_transtitons = list() - for(var/AZ in SSmapping.z_list) - var/datum/space_level/D = AZ - if (D.linkage == CROSSLINKED) - possible_transtitons += D.z_value - var/_z = pick(possible_transtitons) - var/_x = rand(min,max) - var/_y = rand(min,max) - var/turf/T = locate(_x, _y, _z) - A.forceMove(T) - qdel(room) + if(activeRooms.len) + for(var/x in activeRooms) + var/datum/turf_reservation/room = activeRooms[x] + for(var/i=0, iAs the sphere breaks apart, you're suddenly ejected into the depths of space!") + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) + qdel(room) - if(storedRooms.len) - for(var/x in storedRooms) - var/list/atomList = storedRooms[x] - for(var/atom/movable/A in atomList) - var/max = world.maxx-TRANSITIONEDGE - var/min = 1+TRANSITIONEDGE - var/list/possible_transtitons = list() - for(var/AZ in SSmapping.z_list) - var/datum/space_level/D = AZ - if (D.linkage == CROSSLINKED) - possible_transtitons += D.z_value - var/_z = pick(possible_transtitons) - var/_x = rand(min,max) - var/_y = rand(min,max) - var/turf/T = locate(_x, _y, _z) - A.forceMove(T) + if(storedRooms.len) + for(var/x in storedRooms) + var/list/atomList = storedRooms[x] + for(var/atom/movable/A in atomList) + var/max = world.maxx-TRANSITIONEDGE + var/min = 1+TRANSITIONEDGE + var/list/possible_transtitons = list() + for(var/AZ in SSmapping.z_list) + var/datum/space_level/D = AZ + if (D.linkage == CROSSLINKED) + possible_transtitons += D.z_value + var/_z = pick(possible_transtitons) + var/_x = rand(min,max) + var/_y = rand(min,max) + var/turf/T = locate(_x, _y, _z) + A.forceMove(T) //Template Stuff /datum/map_template/hilbertshotel - name = "Hilbert's Hotel Room" - mappath = '_maps/templates/hilbertshotel.dmm' - var/landingZoneRelativeX = 2 - var/landingZoneRelativeY = 8 + name = "Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotel.dmm' + var/landingZoneRelativeX = 2 + var/landingZoneRelativeY = 8 /datum/map_template/hilbertshotel/empty - name = "Empty Hilbert's Hotel Room" - mappath = '_maps/templates/hilbertshotelempty.dmm' + name = "Empty Hilbert's Hotel Room" + mappath = '_maps/templates/hilbertshotelempty.dmm' /datum/map_template/hilbertshotel/lore - name = "Doctor Hilbert's Deathbed" - mappath = '_maps/templates/hilbertshotellore.dmm' + name = "Doctor Hilbert's Deathbed" + mappath = '_maps/templates/hilbertshotellore.dmm' /datum/map_template/hilbertshotelstorage - name = "Hilbert's Hotel Storage" - mappath = '_maps/templates/hilbertshotelstorage.dmm' + name = "Hilbert's Hotel Storage" + mappath = '_maps/templates/hilbertshotelstorage.dmm' //Turfs and Areas @@ -201,329 +201,329 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) explosion_block = INFINITY /turf/open/indestructible/hotelwood - desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." - icon_state = "wood" - footstep = FOOTSTEP_WOOD - tiled_dirt = FALSE + desc = "Stylish dark wood with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "wood" + footstep = FOOTSTEP_WOOD + tiled_dirt = FALSE /turf/open/indestructible/hoteltile - desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." - icon_state = "showroomfloor" - footstep = FOOTSTEP_FLOOR - tiled_dirt = FALSE + desc = "Smooth tile with extra reinforcement. Secured firmly to the floor to prevent tampering." + icon_state = "showroomfloor" + footstep = FOOTSTEP_FLOOR + tiled_dirt = FALSE /turf/open/space/bluespace - name = "\proper bluespace hyperzone" - icon_state = "bluespace" - baseturfs = /turf/open/space/bluespace - flags_1 = NOJAUNT_1 - explosion_block = INFINITY - var/obj/item/hilbertshotel/parentSphere + name = "\proper bluespace hyperzone" + icon_state = "bluespace" + baseturfs = /turf/open/space/bluespace + flags_1 = NOJAUNT_1 + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere /turf/open/space/bluespace/Entered(atom/movable/A) - . = ..() - A.forceMove(get_turf(parentSphere)) + . = ..() + A.forceMove(get_turf(parentSphere)) /turf/closed/indestructible/hoteldoor - name = "Hotel Door" - icon_state = "hoteldoor" - explosion_block = INFINITY - var/obj/item/hilbertshotel/parentSphere + name = "Hotel Door" + icon_state = "hoteldoor" + explosion_block = INFINITY + var/obj/item/hilbertshotel/parentSphere /turf/closed/indestructible/hoteldoor/proc/promptExit(mob/living/user) - if(!isliving(user)) - return - if(!user.mind) - return - if(!parentSphere) - to_chat(user, "The door seems to be malfunctioning and refuses to operate!") - return - if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave") - if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt. - return - user.forceMove(get_turf(parentSphere)) - do_sparks(3, FALSE, get_turf(user)) + if(!isliving(user)) + return + if(!user.mind) + return + if(!parentSphere) + to_chat(user, "The door seems to be malfunctioning and refuses to operate!") + return + if(alert(user, "Hilbert's Hotel would like to remind you that while we will do everything we can to protect the belongings you leave behind, we make no guarantees of their safety while you're gone, especially that of the health of any living creatures. With that in mind, are you ready to leave?", "Exit", "Leave", "Stay") == "Leave") + if(!user.canmove || (get_dist(get_turf(src), get_turf(user)) > 1)) //no teleporting around if they're dead or moved away during the prompt. + return + user.forceMove(get_turf(parentSphere)) + do_sparks(3, FALSE, get_turf(user)) /turf/closed/indestructible/hoteldoor/attack_ghost(mob/dead/observer/user) - if(!isobserver(user) || !parentSphere) - return ..() - user.forceMove(get_turf(parentSphere)) + if(!isobserver(user) || !parentSphere) + return ..() + user.forceMove(get_turf(parentSphere)) //If only this could be simplified... /turf/closed/indestructible/hoteldoor/attack_tk(mob/user) - return //need to be close. + return //need to be close. /turf/closed/indestructible/hoteldoor/attack_hand(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_animal(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_paw(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_hulk(mob/living/carbon/human/user, does_attack_animation) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_larva(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_slime(mob/user) - promptExit(user) + promptExit(user) /turf/closed/indestructible/hoteldoor/attack_robot(mob/user) - if(get_dist(get_turf(src), get_turf(user)) <= 1) - promptExit(user) + if(get_dist(get_turf(src), get_turf(user)) <= 1) + promptExit(user) /turf/closed/indestructible/hoteldoor/AltClick(mob/user) - . = ..() - if(get_dist(get_turf(src), get_turf(user)) <= 1) - to_chat(user, "You peak through the door's bluespace peephole...") - user.reset_perspective(parentSphere) - user.set_machine(src) - var/datum/action/peepholeCancel/PHC = new - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) - PHC.Grant(user) + . = ..() + if(get_dist(get_turf(src), get_turf(user)) <= 1) + to_chat(user, "You peak through the door's bluespace peephole...") + user.reset_perspective(parentSphere) + user.set_machine(src) + var/datum/action/peepholeCancel/PHC = new + user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + PHC.Grant(user) /turf/closed/indestructible/hoteldoor/check_eye(mob/user) - if(get_dist(get_turf(src), get_turf(user)) >= 2) - user.unset_machine() - for(var/datum/action/peepholeCancel/PHC in user.actions) - PHC.Trigger() + if(get_dist(get_turf(src), get_turf(user)) >= 2) + user.unset_machine() + for(var/datum/action/peepholeCancel/PHC in user.actions) + PHC.Trigger() /datum/action/peepholeCancel - name = "Cancel View" - desc = "Stop looking through the bluespace peephole." - button_icon_state = "cancel_peephole" + name = "Cancel View" + desc = "Stop looking through the bluespace peephole." + button_icon_state = "cancel_peephole" /datum/action/peepholeCancel/Trigger() - . = ..() - to_chat(owner, "You move away from the peephole.") - owner.reset_perspective() - owner.clear_fullscreen("remote_view", 0) - qdel(src) + . = ..() + to_chat(owner, "You move away from the peephole.") + owner.reset_perspective() + owner.clear_fullscreen("remote_view", 0) + qdel(src) /area/hilbertshotel - name = "Hilbert's Hotel Room" - icon_state = "hilbertshotel" - requires_power = FALSE - has_gravity = TRUE - noteleport = TRUE - hidden = TRUE - unique = FALSE - dynamic_lighting = DYNAMIC_LIGHTING_FORCED - ambientsounds = list('sound/ambience/servicebell.ogg') - var/roomnumber = 0 - var/obj/item/hilbertshotel/parentSphere - var/datum/turf_reservation/reservation - var/turf/storageTurf + name = "Hilbert's Hotel Room" + icon_state = "hilbertshotel" + requires_power = FALSE + has_gravity = TRUE + noteleport = TRUE + hidden = TRUE + unique = FALSE + dynamic_lighting = DYNAMIC_LIGHTING_FORCED + ambientsounds = list('sound/ambience/servicebell.ogg') + var/roomnumber = 0 + var/obj/item/hilbertshotel/parentSphere + var/datum/turf_reservation/reservation + var/turf/storageTurf /area/hilbertshotel/Entered(atom/movable/AM) - . = ..() - if(istype(AM, /obj/item/hilbertshotel)) - relocate(AM) - var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel) - for(var/obj/item/hilbertshotel/H in hotels) - if(parentSphere == H) - relocate(H) + . = ..() + if(istype(AM, /obj/item/hilbertshotel)) + relocate(AM) + var/list/obj/item/hilbertshotel/hotels = AM.GetAllContents(/obj/item/hilbertshotel) + for(var/obj/item/hilbertshotel/H in hotels) + if(parentSphere == H) + relocate(H) /area/hilbertshotel/proc/relocate(obj/item/hilbertshotel/H) - if(prob(0.135685)) //Because screw you - qdel(H) - return - var/turf/targetturf = find_safe_turf() - if(!targetturf) - if(GLOB.blobstart.len > 0) - targetturf = get_turf(pick(GLOB.blobstart)) - else - CRASH("Unable to find a blobstart landmark") - var/turf/T = get_turf(H) - var/area/A = T.loc - log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") - message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") - for(var/mob/M in A) - to_chat(M, "[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!") - H.forceMove(targetturf) + if(prob(0.135685)) //Because screw you + qdel(H) + return + var/turf/targetturf = find_safe_turf() + if(!targetturf) + if(GLOB.blobstart.len > 0) + targetturf = get_turf(pick(GLOB.blobstart)) + else + CRASH("Unable to find a blobstart landmark") + var/turf/T = get_turf(H) + var/area/A = T.loc + log_game("[H] entered itself. Moving it to [loc_name(targetturf)].") + message_admins("[H] entered itself. Moving it to [ADMIN_VERBOSEJMP(targetturf)].") + for(var/mob/M in A) + to_chat(M, "[H] almost implodes in upon itself, but quickly rebounds, shooting off into a random point in space!") + H.forceMove(targetturf) /area/hilbertshotel/Exited(atom/movable/AM) - . = ..() - if(ismob(AM)) - var/mob/M = AM - if(M.mind) - var/stillPopulated = FALSE - var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything - for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. - if(L.mind) - stillPopulated = TRUE - break - if(!stillPopulated) - storeRoom() + . = ..() + if(ismob(AM)) + var/mob/M = AM + if(M.mind) + var/stillPopulated = FALSE + var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything + for(var/mob/living/L in currentLivingMobs) //Check to see if theres any sentient mobs left. + if(L.mind) + stillPopulated = TRUE + break + if(!stillPopulated) + storeRoom() /area/hilbertshotel/proc/storeRoom() - var/roomSize = (reservation.top_right_coords[1]-reservation.bottom_left_coords[1]+1)*(reservation.top_right_coords[2]-reservation.bottom_left_coords[2]+1) - var/storage[roomSize] - var/turfNumber = 1 - var/obj/item/abstracthotelstorage/storageObj = new(storageTurf) - storageObj.roomNumber = roomnumber - storageObj.parentSphere = parentSphere - storageObj.name = "Room [roomnumber] Storage" - for(var/i=0, i